Сохранение INI-файла в памяти

#coldfusion #ini #railo

#coldfusion #ini #railo

Вопрос:

Я пишу приложение, которое использует ini-файл для хранения всех кодов состояния (ошибок, кодов успеха и т.д.). Очень простая версия такова:

 [success]
000=Status code not found.

[error]
000=Error code not found.
001=Username/Password not found.
  

И мой компонент CF для работы с ним использует следующий код:

 component  hint="Set of tools to interact with status codes."{
    public function init(string codefile) any{
        this.codefile = Arguments.codefile;
    }

    public function getCodeString(string type, string code) string{
        var code = getProfileString(Variables.codefile, Arguments.type, Arguments.code);
        return code;
    }
}
  

Я предполагаю, что при вызове getProfileString происходит то, что Railo открывает файл, выполняет поиск ключа и возвращает значение. По мере роста моего приложения и появления у меня намного большего количества кодов я ожидаю, что этот процесс замедлится. Итак, есть ли способ, которым я могу открыть файл в моем методе инициализации и прочитать все это в область переменных и вызвать getProfileString оттуда?

Комментарии:

1. ОК. Я не мог понять, почему вы не могли бы использовать массив для хранения данных, а затем получить из него коды ошибок…

2. Ну, я мог бы использовать массив, но в ini-файл легче погрузиться, отредактировать и просмотреть, особенно если кто-то отправит мне электронное письмо и сообщит, что получил код ошибки # xxx

Ответ №1:

Вы даже можете проанализировать свой ini-файл в onApplicationStart и поместить данные в область приложения, как рекомендовано для XML-файла @Sergii, если хотите придерживаться подхода .ini.

Сделайте что-то подобное:

 var sections = getProfileSections(variables.codeFile);
var sectionEntries = [];
var indx = 0;
for (key in sections){
    sectionEntries = listToArray(sections[key]);
    application[key] = {};
    for (indx=1; indx <= arraylen(sectionEntries); indx  ){
            application[key][sectionEntries[indx]] = getProfileString(variables.cfgFile,key,sectionEntries[indx]);
    }
}
  

не тестировал это на Railo, но это должно работать, по крайней мере, на ColdFusion 9

Комментарии:

1. Похоже, это лучшее решение для того, что я хочу сделать.

Ответ №2:

Поскольку вы используете Railo, возможно, есть самое простое решение: поместить файл в файловую систему RAM.

Таким образом, полный путь к файлу будет выглядеть следующим образом ram:///some/path/to/config.ini .

Очевидно, что сначала вам нужно записать файл в оперативную память, возможно, по первому запросу.

Таким образом, слегка измененная версия компонента может выглядеть следующим образом:

 component  hint="Set of tools to interact with status codes."{

    public function init(string codefile, string.ramfile) any{
        variables.codefile = arguments.codefile;
        variables.ramfile = arguments.ramfile;
    }

    public function getCodeString(string type, string code) string{

        if (NOT fileExists(variables.ramfile)) {
            fileCopy(variables.codefile, variables.ramfile);
        }

        return getProfileString(variables.ramfile, arguments.type, arguments.code);

    }
}
  

Пожалуйста, обратите внимание, что я изменил this.codefile на variables.codefile в init .

В любом случае, я также не уверен, что ini-файл является наиболее удобным и поддерживаемым решением. Вам нужно разбирать его каждый раз любым способом, верно? Если вам нужен файл конфигурации, используйте XML. Просто проанализируйте его в onApplicationStart и поместите данные в область приложения.