SAVE


Библиотека

V32.EXE

Синтаксис

SAVE(file: IDENT);

Описание

Сохраняет в памяти информацию о текущей позиции файла file, которую потом можно будет восстановить процедурой RESTORE.

  1. Для каждого файла базы данных с помощью SAVE можно сохранить несколько позиций, но восстанавливать эти позиции с помощью RESTORE можно только в обратном порядке, по отношению к порядку их сохранения. Например:
    ...
    SAVE(File1); (* Сохранили позицию 1 в файле File1 *)
    ...
    SAVE(File2); (* Сохранили позицию 1 в файле File2 *)
    ...
    SAVE(File1); (* Сохранили позицию 2 в файле File1 *)
    ...
    RESTORE(File2) (* В файле File2 восстановили позицию 1 *)
    ...
    RESTORE(File1) (* В файле File1 восстановили позицию 2 *)
    ...
    RESTORE(File1) (* В файле File1 восстановили позицию 1 *)
    ...
    Т.о. вложенные пары SAVE - RESTORE работают по принципу стека: восстанавливается последняя сохраненная позиция данного файла.
  2. Число RESTORE-ов внутри всей программы, а также внутри каждого TRY-блока, должны соответствовать числу SAVE-ов.
    1. Если при нормальном выходе из TRY-блока (в том числе с помощью EXIT, RETURN, HALT(0)) число выполненных RESTORE-ов оказалось меньше числа выполненных в нем SAVE-ов, то выбрасывается исключение 167. Причем, это исключение можно перехватить обработчиком этого же TRY-блока. Например:
      TRY
       SELECT(File, Key);
       SAVE(File);
      EXCEPT
      ON Exc: Exc_RunTime DO
       IF Exc.ErrorCode = 167 THEN
        STDMSG("В TRY-блоке маловато RESTORE-ов", INFORM);
       END;
      ELSE
       ...
      END;
      
    2. Если при нормальном завершении программы (в том числе с помощью HALT(0)) число выполненных RESTORE-ов оказалось меньше числа выполненных SAVE-ов, то выбрасывается исключение 168.
    3. Если в TRY-блоке выбросится какое-либо исключение, то сохраненные внутри этого TRY-блока позиции файлов восстановятся автоматически.
  3. Если на момент выполнения SAVE, позиция в файле не была определена, т.е. функция OCCURE вернула бы 0, то после выполнения RESTORE позиция в файле станет неопределенной.
  4. Если после выполнения позиционирования значения полей файла были модифицированы и без выполнения REPLACE или INSERT (грязный курсор) вызван SAVE, то будет выброшено исключение 181.
  5. Если после выполнения SAVE программа изменила значения полей записи сохраненной позиции, то RESTORE восстановит запись с новыми значениями полей. Например:
    File.Field:= 105;
    REPLACE(File);
    SAVE(File);      (* Сохранили текущую позицию файла File со значением поля Field=105 *)
    File.Field:= 16;
    REPLACE(File);   (* В Изменили значение поля Field записи сохраненной позиции *)
    LAST(File);      (* Сместились с сохраненной позиции *)
    RESTORE(File);   (* Спозиционировались на сохраненную позицию, причем значение поля Field=16 *)
  6. Если после выполнения SAVE программа удалила запись сохраненной позиции, то после RESTORE позиция в файле будет не определена. Например:
    SAVE(File);     (* Сохранили текущую позицию файла File со значением поля Field=105 *)
    REMOVE(File);   (* Удалили сохраненную позицию, сместились на следующую (если получилось) *)
    RESTORE(File);  (* Пытались восстановить сохраненную позицию, но получили состояние ~OCCURE *)
  7. Режим текущей позиции в момент SAVE должен соответствует режиму таблицы в момент RESTORE, иначе RESTORE выбросит исключение 979. Причем RESTORE восстановит тот экземпляр, который в текущем режиме доступа дала бы процедура позиционирования. Данное правило не действует, если оба режима - нестабильные. Примеры:
    1. SOFT - SEARCH - SAVE - RIDGE - RESTORE - исключение 979, т.к. сохранен экземпляр мягкого режима, а к моменту выполнения RESTORE таблица в жестком
    2. SOFT - SEARCH - SAVE - GETLASTVERSION - RESTORE - восстановит экземпляр жесткого режима, т.к. сохранен экземпляр мягкого режима, к моменту выполнения RESTORE таблица в мягком, но восстанавливаемая позиция разделяемо заблокирована, а значит доступен только экземпляр жесткого режима.
    3. FINISHED - SEARCH - SAVE - HOTTEST - RESTORE - восстановит экземпляр HOTTEST-режима, т.к. сохранен FINISHED-экземпляр, к моменту выполнения RESTORE таблица в HOTTEST-режиме, оба режима нестабильные, поэтому исключение не выбрасывается. Текущий режим файла HOTTEST, значит RESTORE даст HOTTEST- экземпляр (именно его дала бы процедура позиционирования)

См. также