Germany | Finland | Saint Petersburg | Drive

Копия таблицы в файле

Опубликовано в AmiSharp

Пользовательские таблицы находятся в оперативной памяти и могут содержать важную информацию, которая не должна пропасть при выключении программы или неожиданных сбоях (например, по питанию). Как организовать регулярное сохранение таблицы на жесткий диск?

Первое, что приходит в голову - на каждой итерации сохранять таблицу в файл. Способ надежный, но подразумевает много бесполезной работы. Не на каждой итерации таблица будет изменяться - перезапись файла впустую будет расходовать ресурсы.

Значит, имеет смысл при каждом изменении таблицы устанавливать флаг, сигнализирующие об этом. Запись в файл производить только в случае наличия этого флага.

Флаг можно иметь в виде обычной переменной и после каждого вызова функции, изменяющей содержимое таблицы (например, AmiSharp.SetCellName) устанавливать его. Можно сделать универсально.

Переопределяем функцию SetCellName:

 

function SetCellName(Table,Column,Row,Value)
{ Local Result;    if ( (Result = IsTableExists(Table)) == "1")
   {   AmiSharp.SetCellName(Table,Column,Row,Value);
        StaticVarInc(Table + "~Changed");
   }
   Return Result;
}

Для записи таблицы пишем новую функцию WriteTable:

function WriteTable(Table,TableFileName)
{ Local Result;    Result = "0";    if (NZ(StaticVarGet(Table + "~Changed")))
   {  Result = AmiSharp.SaveTable(Table,TableFileName);
      StaticVarSet(Table + "~Changed",0);
   }
   return Result;
}

Теперь для любой записи в таблицу посредством SetCellName будет создан флаг (уникальный для каждой таблицы). Функция WriteTable, вызываемая в конце каждой итерации, проверит его наличие и в случае необходимости сделает копию таблицы на диске.

Добавить комментарий