Хранение INI-файла в памяти - PullRequest
1 голос
/ 08 апреля 2011

Я пишу приложение, которое использует 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 открывает файл, ищет ключ и возвращает значение. Так как мое приложение растет и у меня появляется намного больше кодов, я ожидаю, что этот процесс замедлится. Так есть ли способ, которым я могу открыть файл в моем методе init и прочитать его все в области переменных и вызвать оттуда getProfileString?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

Вы даже можете анализировать свой INI-файл в onApplicationStart и помещать данные в область приложения, как рекомендовано @Sergii для XML-файла, если вы хотите придерживаться подхода .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 голос
/ 09 апреля 2011

Поскольку вы используете 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-файл является наиболее удобным и поддерживаемым решением. Вам нужно разбирать его каждый раз, так? Если вам нужен файл config, используйте XML. Просто разберите его в onApplicationStart и вставьте данные в область приложения.

...