UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
DbTable.H
Go to the documentation of this file.
1 /* DbTable.H */
2 /* $Id: DbTable.H,v 1.31 2004/02/26 12:34:36 vlad Exp $ */
3 
4 /*********************************************************************
5  *
6  * UNIVERS
7  * (C) ООО "ГЕОВЕРС", 2001
8  *
9  * Все права защищены * * Использование, копирование или передача регулируются законами * Российской Федерации "Об авторском праве и смежных правах", "О * правовой охране программ для электронных вычислительных машин и баз * данных" * * Encoding: ISO-8859-5 (GOST) * *********************************************************************/ #ifndef __DbTable_H #define __DbTable_H /** \file *********************************************************************** * * Локальная База Данных (версия 4) * Доступ к файлу таблицы ЛБД и работа с таблицей в памяти. * ***********************************************************************/ #ifndef NO_HASH #include <map> #include <string> #endif /* NO_HASH */ #include <mix/mutex.h> #include <mix/wenv.h> #include <ldb/DbTableTypes.H> #include <ldb/DbBufStorage.H> #include <ldb/DbFileStorage.H> /** Включить если требуется иметь статистику по числу записанных/прочитанных строк. */ //#define DB_RW_LOG_ENABLED /** Количество памяти в строках таблицы на которое будет увеличиваться сегмент памяти при росте размера таблицы. Значение по умолчанию. */ #define DB_QUANT 200 /** Количество памяти в строках выделяемое по умолчанию под пустую таблицу. Значение по умолчанию. */ #define DB_START_VOLUME 500 /** Стандартный размер буферизации при чтении в байтах. */ #define DB_NORMAL_PREREAD (500*1024) /** Большой размер буферизации при чтении в байтах. */ #define DB_LARGE_PREREAD (10*1024*1024) /** Малый размер буферизации при чтении в байтах. */ #define DB_SMALL_PREREAD (50*1024) /** *********************************************************************** * Класс по работе с таблицей ЛБД на нижнем уровне. Обеспечивает * отображение файла таблицы ЛБД в память. * * Номер строки в таблице БД отсчитывается от 0 и должен быть * положительным. Допускается использовать _last_ из DynAr.H для * доступа к последней строке таблицы. * * Для массивов из N символов (типы CHAR_1, CHAR_EBCDIC) используются * специальные правила доступа. При записи в таблицу по set_value() * копируются до N символов включительно пока не встретится признак * конца строки '\0'. В таблице БД всегда хранится N символов (концевой * '\0' может не уместиться). При чтении из таблицы по get_value() * приемный буфер должен иметь на один байт больше длины строки, так как * признак конца строки формируется автоматически. То есть, для * гарантии под приемный буфер должно быть выделено N+1 байтов памяти. * Массивы остальных типов копируется байт в байт. ***********************************************************************/ class DbTable { public: /** Создать пустую таблицу указанной структуры в памяти. */ DbTable (const DbTTDesc& dbtt, DbIndex quant = DB_QUANT, DbIndex start_volume = DB_START_VOLUME); /** Создать копию указанной таблицы в памяти. */ DbTable (DbTable& dbt); /** Освободить память из-под таблицы и разрушить объект. */ virtual ~DbTable (); /* * Информационные методы. */ /** Вернуть ссылку на описание таблицы. */ const DbTTDesc& table_format () const; /** Вернуть количество строк в таблице. */ virtual DbIndex lines_count () const; /** Вернуть количество строк в диапазоне, убрать _last_ и вернуть в line[] пару упорядоченных по возрастанию индексов строк - первой и последней. */ virtual DbIndex lines_range (DbIndex line1, DbIndex line2, DbIndex* line = NULL) const; /** Получить доступ к указанному столбцу-строке таблицы */ virtual void get_value (const char* column, DbIndex line, void* ptr); /** Групповая операция по чтению колонки значений из указанного столбца. Значения считываются начиная с указанной строки в указанном количестве. */ virtual void get_values (const char* column, DbIndex start_line, DbIndex lines_cnt, void* ptr); /** Проверить, является ли указанная ячейка пустой */ virtual Logic check_empty_value (const char* column, DbIndex line); /** Получить значение физической величины столбца */ virtual UnitId get_unit (const char* column) const; /** Вернуть ссылку на массив описателей доменов. */ virtual const DmnDescAr& get_domains (); /** Вернуть структуру-описатель указанного домена. */ virtual DbDomainDesc get_domain (const char* column) const; /** Сравнить значения в ячейках указанного домена. */ virtual Compar compare_lines (const char* column, DbIndex line1, DbIndex line2); /** Получить имя типа таблицы. */ const char* tt_name () const; /** Вернуть TRUE если таблица была модифицирована и FALSE в противном случае. */ Logic is_modified () const; /** Вернуть TRUE если таблица может быть модифицирована в памяти и FALSE в противном случае. */ Logic is_modifiable () const; /* * Операции над таблицей в памяти. */ /** Очистить таблицу в памяти (формат остается, содержимое пропадает). */ virtual void clean (); /** Записать значение указанного столбца-строки таблицы */ virtual void set_value (const char* column, DbIndex line, const void* ptr); /** Групповая операция по записи колонки значений в указанный столбец. Значения записываются начиная с указанной строки в указанном количестве. */ virtual void set_values (const char* column, DbIndex start_line, DbIndex lines_cnt, const void* ptr); /** Сделать ячейку пустой. */ virtual void set_empty_value (const char* column, DbIndex line); /** Изменить значение физической величины столбца на указанное */ virtual void set_unit (const char* column, UnitId unid); /** Вставить в таблицу строку (строки) перед указанной line. Если указана строка _last_, то после последней. Если аргумент bInit TRUE, то требуется инициализация строк. */ virtual void insert_line (DbIndex line, DbIndex lines_cnt = 1, Logic bInit = TRUE); /** Удалить из таблицы указанный диапазон строк [line1..line2] */ virtual void remove_lines (DbIndex line1, DbIndex line2); /** Обменять местами две строки таблицы */ virtual void exchange_lines (DbIndex line1, DbIndex line2); /** Добавить строки указанной таблицы в конец этой. */ virtual void merge (DbTable& src); /** Добавить указанные строки таблицы в указанное место этой. Запрещено использование _last_ в качестве индекса. */ virtual void copy_lines (DbIndex iWhere, DbTable& src, DbIndex iFrom, DbIndex nLines); /** Выполнение операции приведет к тому, что таблица будет считаться изменившейся. Этот метод вызывается во всех модифицирующих операциях. */ virtual void modify (); /** Выполнение операции приведет к тому, что таблица будет считаться не изменившейся несмотря на предыдущие операции с ней. */ virtual void not_modified (); /** Установить признак модифицируемости таблицы. Если установить FALSE, то любая операция изменения содержимого таблицы завершится с ошибкой. По умолчанию флаг TRUE. */ virtual void set_modifiability (Logic bFlag); /* * Операции файлового ввода/вывода. * Имеются два способа ввода/вывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */
10  *
11  * Использование, копирование или передача регулируются законами
12  * Российской Федерации "Об авторском праве и смежных правах", "О * правовой охране программ для электронных вычислительных машин и баз * данных" * * Encoding: ISO-8859-5 (GOST) * *********************************************************************/ #ifndef __DbTable_H #define __DbTable_H /** \file *********************************************************************** * * Локальная База Данных (версия 4) * Доступ к файлу таблицы ЛБД и работа с таблицей в памяти. * ***********************************************************************/ #ifndef NO_HASH #include <map> #include <string> #endif /* NO_HASH */ #include <mix/mutex.h> #include <mix/wenv.h> #include <ldb/DbTableTypes.H> #include <ldb/DbBufStorage.H> #include <ldb/DbFileStorage.H> /** Включить если требуется иметь статистику по числу записанных/прочитанных строк. */ //#define DB_RW_LOG_ENABLED /** Количество памяти в строках таблицы на которое будет увеличиваться сегмент памяти при росте размера таблицы. Значение по умолчанию. */ #define DB_QUANT 200 /** Количество памяти в строках выделяемое по умолчанию под пустую таблицу. Значение по умолчанию. */ #define DB_START_VOLUME 500 /** Стандартный размер буферизации при чтении в байтах. */ #define DB_NORMAL_PREREAD (500*1024) /** Большой размер буферизации при чтении в байтах. */ #define DB_LARGE_PREREAD (10*1024*1024) /** Малый размер буферизации при чтении в байтах. */ #define DB_SMALL_PREREAD (50*1024) /** *********************************************************************** * Класс по работе с таблицей ЛБД на нижнем уровне. Обеспечивает * отображение файла таблицы ЛБД в память. * * Номер строки в таблице БД отсчитывается от 0 и должен быть * положительным. Допускается использовать _last_ из DynAr.H для * доступа к последней строке таблицы. * * Для массивов из N символов (типы CHAR_1, CHAR_EBCDIC) используются * специальные правила доступа. При записи в таблицу по set_value() * копируются до N символов включительно пока не встретится признак * конца строки '\0'. В таблице БД всегда хранится N символов (концевой * '\0' может не уместиться). При чтении из таблицы по get_value() * приемный буфер должен иметь на один байт больше длины строки, так как * признак конца строки формируется автоматически. То есть, для * гарантии под приемный буфер должно быть выделено N+1 байтов памяти. * Массивы остальных типов копируется байт в байт. ***********************************************************************/ class DbTable { public: /** Создать пустую таблицу указанной структуры в памяти. */ DbTable (const DbTTDesc& dbtt, DbIndex quant = DB_QUANT, DbIndex start_volume = DB_START_VOLUME); /** Создать копию указанной таблицы в памяти. */ DbTable (DbTable& dbt); /** Освободить память из-под таблицы и разрушить объект. */ virtual ~DbTable (); /* * Информационные методы. */ /** Вернуть ссылку на описание таблицы. */ const DbTTDesc& table_format () const; /** Вернуть количество строк в таблице. */ virtual DbIndex lines_count () const; /** Вернуть количество строк в диапазоне, убрать _last_ и вернуть в line[] пару упорядоченных по возрастанию индексов строк - первой и последней. */ virtual DbIndex lines_range (DbIndex line1, DbIndex line2, DbIndex* line = NULL) const; /** Получить доступ к указанному столбцу-строке таблицы */ virtual void get_value (const char* column, DbIndex line, void* ptr); /** Групповая операция по чтению колонки значений из указанного столбца. Значения считываются начиная с указанной строки в указанном количестве. */ virtual void get_values (const char* column, DbIndex start_line, DbIndex lines_cnt, void* ptr); /** Проверить, является ли указанная ячейка пустой */ virtual Logic check_empty_value (const char* column, DbIndex line); /** Получить значение физической величины столбца */ virtual UnitId get_unit (const char* column) const; /** Вернуть ссылку на массив описателей доменов. */ virtual const DmnDescAr& get_domains (); /** Вернуть структуру-описатель указанного домена. */ virtual DbDomainDesc get_domain (const char* column) const; /** Сравнить значения в ячейках указанного домена. */ virtual Compar compare_lines (const char* column, DbIndex line1, DbIndex line2); /** Получить имя типа таблицы. */ const char* tt_name () const; /** Вернуть TRUE если таблица была модифицирована и FALSE в противном случае. */ Logic is_modified () const; /** Вернуть TRUE если таблица может быть модифицирована в памяти и FALSE в противном случае. */ Logic is_modifiable () const; /* * Операции над таблицей в памяти. */ /** Очистить таблицу в памяти (формат остается, содержимое пропадает). */ virtual void clean (); /** Записать значение указанного столбца-строки таблицы */ virtual void set_value (const char* column, DbIndex line, const void* ptr); /** Групповая операция по записи колонки значений в указанный столбец. Значения записываются начиная с указанной строки в указанном количестве. */ virtual void set_values (const char* column, DbIndex start_line, DbIndex lines_cnt, const void* ptr); /** Сделать ячейку пустой. */ virtual void set_empty_value (const char* column, DbIndex line); /** Изменить значение физической величины столбца на указанное */ virtual void set_unit (const char* column, UnitId unid); /** Вставить в таблицу строку (строки) перед указанной line. Если указана строка _last_, то после последней. Если аргумент bInit TRUE, то требуется инициализация строк. */ virtual void insert_line (DbIndex line, DbIndex lines_cnt = 1, Logic bInit = TRUE); /** Удалить из таблицы указанный диапазон строк [line1..line2] */ virtual void remove_lines (DbIndex line1, DbIndex line2); /** Обменять местами две строки таблицы */ virtual void exchange_lines (DbIndex line1, DbIndex line2); /** Добавить строки указанной таблицы в конец этой. */ virtual void merge (DbTable& src); /** Добавить указанные строки таблицы в указанное место этой. Запрещено использование _last_ в качестве индекса. */ virtual void copy_lines (DbIndex iWhere, DbTable& src, DbIndex iFrom, DbIndex nLines); /** Выполнение операции приведет к тому, что таблица будет считаться изменившейся. Этот метод вызывается во всех модифицирующих операциях. */ virtual void modify (); /** Выполнение операции приведет к тому, что таблица будет считаться не изменившейся несмотря на предыдущие операции с ней. */ virtual void not_modified (); /** Установить признак модифицируемости таблицы. Если установить FALSE, то любая операция изменения содержимого таблицы завершится с ошибкой. По умолчанию флаг TRUE. */ virtual void set_modifiability (Logic bFlag); /* * Операции файлового ввода/вывода. * Имеются два способа ввода/вывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */
13  * правовой охране программ для электронных вычислительных машин и баз * данных" * * Encoding: ISO-8859-5 (GOST) * *********************************************************************/ #ifndef __DbTable_H #define __DbTable_H /** \file *********************************************************************** * * Локальная База Данных (версия 4) * Доступ к файлу таблицы ЛБД и работа с таблицей в памяти. * ***********************************************************************/ #ifndef NO_HASH #include <map> #include <string> #endif /* NO_HASH */ #include <mix/mutex.h> #include <mix/wenv.h> #include <ldb/DbTableTypes.H> #include <ldb/DbBufStorage.H> #include <ldb/DbFileStorage.H> /** Включить если требуется иметь статистику по числу записанных/прочитанных строк. */ //#define DB_RW_LOG_ENABLED /** Количество памяти в строках таблицы на которое будет увеличиваться сегмент памяти при росте размера таблицы. Значение по умолчанию. */ #define DB_QUANT 200 /** Количество памяти в строках выделяемое по умолчанию под пустую таблицу. Значение по умолчанию. */ #define DB_START_VOLUME 500 /** Стандартный размер буферизации при чтении в байтах. */ #define DB_NORMAL_PREREAD (500*1024) /** Большой размер буферизации при чтении в байтах. */ #define DB_LARGE_PREREAD (10*1024*1024) /** Малый размер буферизации при чтении в байтах. */ #define DB_SMALL_PREREAD (50*1024) /** *********************************************************************** * Класс по работе с таблицей ЛБД на нижнем уровне. Обеспечивает * отображение файла таблицы ЛБД в память. * * Номер строки в таблице БД отсчитывается от 0 и должен быть * положительным. Допускается использовать _last_ из DynAr.H для * доступа к последней строке таблицы. * * Для массивов из N символов (типы CHAR_1, CHAR_EBCDIC) используются * специальные правила доступа. При записи в таблицу по set_value() * копируются до N символов включительно пока не встретится признак * конца строки '\0'. В таблице БД всегда хранится N символов (концевой * '\0' может не уместиться). При чтении из таблицы по get_value() * приемный буфер должен иметь на один байт больше длины строки, так как * признак конца строки формируется автоматически. То есть, для * гарантии под приемный буфер должно быть выделено N+1 байтов памяти. * Массивы остальных типов копируется байт в байт. ***********************************************************************/ class DbTable { public: /** Создать пустую таблицу указанной структуры в памяти. */ DbTable (const DbTTDesc& dbtt, DbIndex quant = DB_QUANT, DbIndex start_volume = DB_START_VOLUME); /** Создать копию указанной таблицы в памяти. */ DbTable (DbTable& dbt); /** Освободить память из-под таблицы и разрушить объект. */ virtual ~DbTable (); /* * Информационные методы. */ /** Вернуть ссылку на описание таблицы. */ const DbTTDesc& table_format () const; /** Вернуть количество строк в таблице. */ virtual DbIndex lines_count () const; /** Вернуть количество строк в диапазоне, убрать _last_ и вернуть в line[] пару упорядоченных по возрастанию индексов строк - первой и последней. */ virtual DbIndex lines_range (DbIndex line1, DbIndex line2, DbIndex* line = NULL) const; /** Получить доступ к указанному столбцу-строке таблицы */ virtual void get_value (const char* column, DbIndex line, void* ptr); /** Групповая операция по чтению колонки значений из указанного столбца. Значения считываются начиная с указанной строки в указанном количестве. */ virtual void get_values (const char* column, DbIndex start_line, DbIndex lines_cnt, void* ptr); /** Проверить, является ли указанная ячейка пустой */ virtual Logic check_empty_value (const char* column, DbIndex line); /** Получить значение физической величины столбца */ virtual UnitId get_unit (const char* column) const; /** Вернуть ссылку на массив описателей доменов. */ virtual const DmnDescAr& get_domains (); /** Вернуть структуру-описатель указанного домена. */ virtual DbDomainDesc get_domain (const char* column) const; /** Сравнить значения в ячейках указанного домена. */ virtual Compar compare_lines (const char* column, DbIndex line1, DbIndex line2); /** Получить имя типа таблицы. */ const char* tt_name () const; /** Вернуть TRUE если таблица была модифицирована и FALSE в противном случае. */ Logic is_modified () const; /** Вернуть TRUE если таблица может быть модифицирована в памяти и FALSE в противном случае. */ Logic is_modifiable () const; /* * Операции над таблицей в памяти. */ /** Очистить таблицу в памяти (формат остается, содержимое пропадает). */ virtual void clean (); /** Записать значение указанного столбца-строки таблицы */ virtual void set_value (const char* column, DbIndex line, const void* ptr); /** Групповая операция по записи колонки значений в указанный столбец. Значения записываются начиная с указанной строки в указанном количестве. */ virtual void set_values (const char* column, DbIndex start_line, DbIndex lines_cnt, const void* ptr); /** Сделать ячейку пустой. */ virtual void set_empty_value (const char* column, DbIndex line); /** Изменить значение физической величины столбца на указанное */ virtual void set_unit (const char* column, UnitId unid); /** Вставить в таблицу строку (строки) перед указанной line. Если указана строка _last_, то после последней. Если аргумент bInit TRUE, то требуется инициализация строк. */ virtual void insert_line (DbIndex line, DbIndex lines_cnt = 1, Logic bInit = TRUE); /** Удалить из таблицы указанный диапазон строк [line1..line2] */ virtual void remove_lines (DbIndex line1, DbIndex line2); /** Обменять местами две строки таблицы */ virtual void exchange_lines (DbIndex line1, DbIndex line2); /** Добавить строки указанной таблицы в конец этой. */ virtual void merge (DbTable& src); /** Добавить указанные строки таблицы в указанное место этой. Запрещено использование _last_ в качестве индекса. */ virtual void copy_lines (DbIndex iWhere, DbTable& src, DbIndex iFrom, DbIndex nLines); /** Выполнение операции приведет к тому, что таблица будет считаться изменившейся. Этот метод вызывается во всех модифицирующих операциях. */ virtual void modify (); /** Выполнение операции приведет к тому, что таблица будет считаться не изменившейся несмотря на предыдущие операции с ней. */ virtual void not_modified (); /** Установить признак модифицируемости таблицы. Если установить FALSE, то любая операция изменения содержимого таблицы завершится с ошибкой. По умолчанию флаг TRUE. */ virtual void set_modifiability (Logic bFlag); /* * Операции файлового ввода/вывода. * Имеются два способа ввода/вывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */
14  * данных"
15  *
16  * Encoding: ISO-8859-5 (GOST)
17  *
18  *********************************************************************/
19 
20 #ifndef __DbTable_H
21 #define __DbTable_H
22 
31 #ifndef NO_HASH
32 #include <map>
33 #include <string>
34 #endif /* NO_HASH */
35 
36 #include <mix/mutex.h>
37 #include <mix/wenv.h>
38 #include <ldb/DbTableTypes.H>
39 #include <ldb/DbBufStorage.H>
40 #include <ldb/DbFileStorage.H>
41 
44 //#define DB_RW_LOG_ENABLED
45 
48 #define DB_QUANT 200
49 
52 #define DB_START_VOLUME 500
53 
55 #define DB_NORMAL_PREREAD (500*1024)
56 
58 #define DB_LARGE_PREREAD (10*1024*1024)
59 
61 #define DB_SMALL_PREREAD (50*1024)
62 
63 
84 class DbTable
85 {
86 public:
87 
89  DbTable (const DbTTDesc& dbtt,
90  DbIndex quant = DB_QUANT,
91  DbIndex start_volume = DB_START_VOLUME);
92 
94  DbTable (DbTable& dbt);
95 
97  virtual ~DbTable ();
98 
99  /*
100  * Информационные методы. */ /** Вернуть ссылку на описание таблицы. */ const DbTTDesc& table_format () const; /** Вернуть количество строк в таблице. */ virtual DbIndex lines_count () const; /** Вернуть количество строк в диапазоне, убрать _last_ и вернуть в line[] пару упорядоченных по возрастанию индексов строк - первой и последней. */ virtual DbIndex lines_range (DbIndex line1, DbIndex line2, DbIndex* line = NULL) const; /** Получить доступ к указанному столбцу-строке таблицы */ virtual void get_value (const char* column, DbIndex line, void* ptr); /** Групповая операция по чтению колонки значений из указанного столбца. Значения считываются начиная с указанной строки в указанном количестве. */ virtual void get_values (const char* column, DbIndex start_line, DbIndex lines_cnt, void* ptr); /** Проверить, является ли указанная ячейка пустой */ virtual Logic check_empty_value (const char* column, DbIndex line); /** Получить значение физической величины столбца */ virtual UnitId get_unit (const char* column) const; /** Вернуть ссылку на массив описателей доменов. */ virtual const DmnDescAr& get_domains (); /** Вернуть структуру-описатель указанного домена. */ virtual DbDomainDesc get_domain (const char* column) const; /** Сравнить значения в ячейках указанного домена. */ virtual Compar compare_lines (const char* column, DbIndex line1, DbIndex line2); /** Получить имя типа таблицы. */ const char* tt_name () const; /** Вернуть TRUE если таблица была модифицирована и FALSE в противном случае. */ Logic is_modified () const; /** Вернуть TRUE если таблица может быть модифицирована в памяти и FALSE в противном случае. */ Logic is_modifiable () const; /* * Операции над таблицей в памяти. */ /** Очистить таблицу в памяти (формат остается, содержимое пропадает). */ virtual void clean (); /** Записать значение указанного столбца-строки таблицы */ virtual void set_value (const char* column, DbIndex line, const void* ptr); /** Групповая операция по записи колонки значений в указанный столбец. Значения записываются начиная с указанной строки в указанном количестве. */ virtual void set_values (const char* column, DbIndex start_line, DbIndex lines_cnt, const void* ptr); /** Сделать ячейку пустой. */ virtual void set_empty_value (const char* column, DbIndex line); /** Изменить значение физической величины столбца на указанное */ virtual void set_unit (const char* column, UnitId unid); /** Вставить в таблицу строку (строки) перед указанной line. Если указана строка _last_, то после последней. Если аргумент bInit TRUE, то требуется инициализация строк. */ virtual void insert_line (DbIndex line, DbIndex lines_cnt = 1, Logic bInit = TRUE); /** Удалить из таблицы указанный диапазон строк [line1..line2] */ virtual void remove_lines (DbIndex line1, DbIndex line2); /** Обменять местами две строки таблицы */ virtual void exchange_lines (DbIndex line1, DbIndex line2); /** Добавить строки указанной таблицы в конец этой. */ virtual void merge (DbTable& src); /** Добавить указанные строки таблицы в указанное место этой. Запрещено использование _last_ в качестве индекса. */ virtual void copy_lines (DbIndex iWhere, DbTable& src, DbIndex iFrom, DbIndex nLines); /** Выполнение операции приведет к тому, что таблица будет считаться изменившейся. Этот метод вызывается во всех модифицирующих операциях. */ virtual void modify (); /** Выполнение операции приведет к тому, что таблица будет считаться не изменившейся несмотря на предыдущие операции с ней. */ virtual void not_modified (); /** Установить признак модифицируемости таблицы. Если установить FALSE, то любая операция изменения содержимого таблицы завершится с ошибкой. По умолчанию флаг TRUE. */ virtual void set_modifiability (Logic bFlag); /* * Операции файлового ввода/вывода. * Имеются два способа ввода/вывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */
101  */
102 
104  const DbTTDesc& table_format () const;
105 
107  virtual DbIndex lines_count () const;
108 
112  virtual DbIndex lines_range (DbIndex line1, DbIndex line2,
113  DbIndex* line = NULL) const;
114 
116  virtual void get_value (const char* column, DbIndex line,
117  void* ptr);
118 
122  virtual void get_values (const char* column, DbIndex start_line,
123  DbIndex lines_cnt, void* ptr);
124 
126  virtual Logic check_empty_value (const char* column, DbIndex line);
127 
129  virtual UnitId get_unit (const char* column) const;
130 
132  virtual const DmnDescAr& get_domains ();
133 
135  virtual DbDomainDesc get_domain (const char* column) const;
136 
138  virtual Compar compare_lines (const char* column,
139  DbIndex line1, DbIndex line2);
140 
142  const char* tt_name () const;
143 
146  Logic is_modified () const;
147 
150  Logic is_modifiable () const;
151 
152 
153  /*
154  * Операции над таблицей в памяти.
155  */
156 
158  virtual void clean ();
159 
161  virtual void set_value (const char* column, DbIndex line,
162  const void* ptr);
163 
167  virtual void set_values (const char* column, DbIndex start_line,
168  DbIndex lines_cnt, const void* ptr);
169 
171  virtual void set_empty_value (const char* column, DbIndex line);
172 
174  virtual void set_unit (const char* column, UnitId unid);
175 
179  virtual void insert_line (DbIndex line, DbIndex lines_cnt = 1,
180  Logic bInit = TRUE);
181 
183  virtual void remove_lines (DbIndex line1, DbIndex line2);
184 
186  virtual void exchange_lines (DbIndex line1, DbIndex line2);
187 
189  virtual void merge (DbTable& src);
190 
193  virtual void copy_lines (DbIndex iWhere, DbTable& src,
194  DbIndex iFrom, DbIndex nLines);
195 
199  virtual void modify ();
200 
203  virtual void not_modified ();
204 
208  virtual void set_modifiability (Logic bFlag);
209 
210 
211  /*
212  * Операции файлового вводавывода. * Имеются два способа ввода/вывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */ /вывода.
213  * Имеются два способа вводавывода: * 1) последовательный (может работать через канал (pipe, socket)) * 2) произвольный (не может работать через канал (pipe, socket)) * Способ #1 включает в себя операции чтения и записи заголовка, * атрибутов и строк данных таблицы. * Способ #2 включает в себя только операции чтения и записи диапазонов * строк данных таблицы. */ /* * Последовательный доступ к файлу. */ /** Прочитать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. Скорректировать число доменов и размер записи до совпадающего с файлом БД. Возвратить число строк в таблице, число доменов в файле (может отличаться от ftm.dmns->count()!) и формат хранения. Может работать с каналом. */ void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt, unsigned& nDmnsCnt); /** Прочитать собственно строки таблицы ЛБД из файла в количестве nLineCnt штук с приведением из формата eBO. Может работать с каналом. */ void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Прочитать в память содержимое указанного файла (в конец имеющегося содержимого). Может работать с каналом. */ void read (int fd); /** Записать преамбулу файла таблицы ЛБД (заголовок + атрибуты доменов). Диагностировать возможные проблемы. В заголовке записывается указанное количество трасс, что позволяет записывать в файл произвольное их число. Задается также формат хранения в файле. Может работать с каналом. */ void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt); /** Записать указанное количество строк начиная с указанной в файл таблицы ЛБД. Данные приводятся к формату eBO. Может работать с каналом. */ void record_table (int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt); /** Записать в указанный файл содержимое таблицы. Может работать с каналом. */ void write (int fd); /* * Произвольный доступ к файлу. */ /** Установить размер буфера предчтения в байтах при произвольном доступе к файлу. */ void set_preread_size (size_t nSize); /** Получить информацию о размере буфера предчтения в байтах. */ size_t get_preread_size () const; /** Записать в файл содержимое изменившихся строк. */ void write_changed (); /** Загрузить в память все строки файла таблицы. */ void load_all_lines (); /** Mutex to use in MT applications */ MutexId* mutex () const; protected:/* methods */ /* * Операции переопределяемого ввода/вывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */ /вывода:
214  * 1) последовательный (может работать через канал (pipe, socket))
215  * 2) произвольный (не может работать через канал (pipe, socket))
216  * Способ #1 включает в себя операции чтения и записи заголовка,
217  * атрибутов и строк данных таблицы.
218  * Способ #2 включает в себя только операции чтения и записи диапазонов
219  * строк данных таблицы.
220  */
221 
222  /*
223  * Последовательный доступ к файлу.
224  */
225 
232  void read_leader (int fd, ByteOrder& eBO, DbIndex& nLineCnt,
233  unsigned& nDmnsCnt);
234 
238  void append_table (int fd, ByteOrder eBO, DbIndex nLineCnt);
239 
242  void read (int fd);
243 
249  void write_leader (int fd, ByteOrder eBO, DbIndex nLineCnt);
250 
254  void record_table (int fd, ByteOrder eBO,
255  DbIndex iStartLine, DbIndex nLineCnt);
256 
259  void write (int fd);
260 
261  /*
262  * Произвольный доступ к файлу.
263  */
264 
267  void set_preread_size (size_t nSize);
268 
270  size_t get_preread_size () const;
271 
272 
274  void write_changed ();
275 
277  void load_all_lines ();
278 
279 
281  MutexId* mutex () const;
282 
283 protected:/* methods */
284 
285  /*
286  * Операции переопределяемого вводавывода (no _last_ support). */ /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void read_lines (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Можно задавать произвольный диапазон строк. */ virtual void write_lines (DbIndex line1, DbIndex line2); /** Безусловно прочитать из файла на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void read_line_seq (DbIndex line1, DbIndex line2); /** Безусловно сохранить в файл на диске указанные строки [line1..line2]. Гарантируется, что в памяти строки идут последовательно. */ virtual void write_line_seq (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Однажды загруженные строчки не трогаются. _last_ support. */ virtual void load_lines (DbIndex line1, DbIndex line2); /** Загрузить строки [line1..line2] из файла, выделив для них место. Пометить строчки как изменившиеся. _last_ support. */ virtual void change_lines (DbIndex line1, DbIndex line2); /* * Навигационные операции. */ /** Получить индекс домена по имени. Возможно, фактическая таблица БД может и не содержать столбца с таким индексом в силу того, что она создана по старому описателю. */ unsigned n2i (const char* column) const; /** Получить индекс домена по имени и проверить его на соответствие формату конкретной таблицы БД - кидает ERROR__DB_DMN_NOT_FOUND */ virtual unsigned valid_n2i (const char* column) const; /** Получить адрес ячейки, указанной индексами столбца и строки. Строка может оказаться незагруженной в память! */ void* i2ptr (unsigned dmn_i, DbIndex line) const { DbIndex line_i = (_last_ == line)? lines_count() - 1: line; return (char*)dtable.line_pointer(line_i) + fmt.dmns->fetch(dmn_i).offset; } /** Получить размер ячейки, указанной индексом домена. */ size_t i2size (unsigned dmn_i) const { DbDomainDesc& dd = fmt.dmns->fetch(dmn_i); return dd.dim * AtomTypeToSize[dd.atype]; } protected:/* data */ /** Формат таблицы. */ DbTTDesc fmt; /** Буфер хранения данных таблицы. */ DbBufStorage dtable; /** Массив атрибутов столбцов. */ DbFileDomainAttr *dmn_attrs; /** Количество доменов в файле (возможно, отличается от fmt.dmns->count()) */ unsigned nFileDmnsCnt; private: /** Признак изменененного содержимого таблицы. */ Logic bModified; /** Признак возможности изменения содержимого таблицы. Не влияет на старое состояние bModified, но запрещает его изменение. */ Logic bModifiable; /** Признаки вызова неперекрытых методов, для того, чтобы не повторять многократно сообщение об ошибке. */ Logic bLoadErrorSaid, bSaveErrorSaid; #ifdef DB_RW_LOG_ENABLED /** Списки реально прочитанных и записанных строк в таблице к моменту ее закрытия. */ DbIndexAr rlines; /**< прочитанные пары строк line1..line2 */ DbIndexAr wlines; /**< записанные пары строк line1..line2 */ #endif /* DB_RW_LOG_ENABLED */ #ifndef NO_HASH /** Hash to make n2i() faster: map string to index of domain in fmt */ std::map<std::string,unsigned> mHash; #endif /* NO_HASH */ /** Mutex id to provide MT safe access. */ MutexId *pMutexId; /** Size of preread buffer in bytes. */ size_t nPreReadSize; }; inline const DbTTDesc& DbTable::table_format () const { return fmt; } #endif /* DbTable.H */ /вывода (no _last_ support).
287  */
288 
291  virtual void read_lines (DbIndex line1, DbIndex line2);
292 
295  virtual void write_lines (DbIndex line1, DbIndex line2);
296 
300  virtual void read_line_seq (DbIndex line1, DbIndex line2);
301 
305  virtual void write_line_seq (DbIndex line1, DbIndex line2);
306 
307 
310  virtual void load_lines (DbIndex line1, DbIndex line2);
311 
314  virtual void change_lines (DbIndex line1, DbIndex line2);
315 
316  /*
317  * Навигационные операции.
318  */
319 
323  unsigned n2i (const char* column) const;
324 
327  virtual unsigned valid_n2i (const char* column) const;
328 
331  void* i2ptr (unsigned dmn_i, DbIndex line) const
332  {
333  DbIndex line_i = (_last_ == line)? lines_count() - 1: line;
334  return (char*)dtable.line_pointer(line_i)
335  + fmt.dmns->fetch(dmn_i).offset;
336  }
337 
339  size_t i2size (unsigned dmn_i) const
340  {
341  DbDomainDesc& dd = fmt.dmns->fetch(dmn_i);
342  return dd.dim * AtomTypeToSize[dd.atype];
343  }
344 
345 protected:/* data */
346 
349 
352 
355 
358  unsigned nFileDmnsCnt;
359 
360 private:
361 
363  Logic bModified;
364 
367  Logic bModifiable;
368 
371  Logic bLoadErrorSaid, bSaveErrorSaid;
372 
373 #ifdef DB_RW_LOG_ENABLED
374 
376  DbIndexAr rlines;
377  DbIndexAr wlines;
379 #endif /* DB_RW_LOG_ENABLED */
380 
381 #ifndef NO_HASH
382 
383  std::map<std::string,unsigned> mHash;
384 #endif /* NO_HASH */
385 
387  MutexId *pMutexId;
388 
390  size_t nPreReadSize;
391 
392 };
393 
394 
395 inline const DbTTDesc&
397 {
398  return fmt;
399 }
400 
401 
402 #endif /* DbTable.H */
virtual void remove_lines(DbIndex line1, DbIndex line2)
virtual void set_values(const char *column, DbIndex start_line, DbIndex lines_cnt, const void *ptr)
void write_leader(int fd, ByteOrder eBO, DbIndex nLineCnt)
void write_changed()
DbTTDesc fmt
Definition: DbTable.H:348
virtual Logic check_empty_value(const char *column, DbIndex line)
virtual void modify()
void read_leader(int fd, ByteOrder &eBO, DbIndex &nLineCnt, unsigned &nDmnsCnt)
virtual const DmnDescAr & get_domains()
virtual void read_lines(DbIndex line1, DbIndex line2)
const char * tt_name() const
virtual void load_lines(DbIndex line1, DbIndex line2)
Definition: IntAr.H:80
virtual void set_modifiability(Logic bFlag)
virtual void set_unit(const char *column, UnitId unid)
DbBufStorage dtable
Definition: DbTable.H:351
DmnDescAr * dmns
Definition: DbTableTypes.H:65
const DbTTDesc & table_format() const
Definition: DbTable.H:396
Definition: DbBufStorage.H:275
MutexId * mutex() const
virtual void write_line_seq(DbIndex line1, DbIndex line2)
virtual DbDomainDesc get_domain(const char *column) const
size_t i2size(unsigned dmn_i) const
Definition: DbTable.H:339
void * line_pointer(DbIndex line) const
virtual void get_values(const char *column, DbIndex start_line, DbIndex lines_cnt, void *ptr)
DbTable(const DbTTDesc &dbtt, DbIndex quant=DB_QUANT, DbIndex start_volume=DB_START_VOLUME)
virtual DbIndex lines_range(DbIndex line1, DbIndex line2, DbIndex *line=NULL) const
size_t get_preread_size() const
virtual ~DbTable()
Definition: dbdefs.h:169
virtual void clean()
void record_table(int fd, ByteOrder eBO, DbIndex iStartLine, DbIndex nLineCnt)
#define DB_QUANT
Definition: DbTable.H:48
virtual void exchange_lines(DbIndex line1, DbIndex line2)
virtual UnitId get_unit(const char *column) const
void load_all_lines()
virtual void merge(DbTable &src)
virtual void copy_lines(DbIndex iWhere, DbTable &src, DbIndex iFrom, DbIndex nLines)
virtual void insert_line(DbIndex line, DbIndex lines_cnt=1, Logic bInit=TRUE)
virtual void get_value(const char *column, DbIndex line, void *ptr)
void append_table(int fd, ByteOrder eBO, DbIndex nLineCnt)
Logic is_modifiable() const
virtual void set_empty_value(const char *column, DbIndex line)
virtual unsigned valid_n2i(const char *column) const
void set_preread_size(size_t nSize)
virtual Compar compare_lines(const char *column, DbIndex line1, DbIndex line2)
void write(int fd)
unsigned nFileDmnsCnt
Definition: DbTable.H:358
Definition: DbTable.H:84
virtual void write_lines(DbIndex line1, DbIndex line2)
virtual void not_modified()
virtual void read_line_seq(DbIndex line1, DbIndex line2)
Definition: dbdefs.h:158
virtual void change_lines(DbIndex line1, DbIndex line2)
void read(int fd)
Definition: DbTableTypes.H:61
Logic is_modified() const
AtomType atype
Definition: dbdefs.h:172
void * i2ptr(unsigned dmn_i, DbIndex line) const
Definition: DbTable.H:331
virtual DbIndex lines_count() const
virtual void set_value(const char *column, DbIndex line, const void *ptr)
Int4 dim
Definition: dbdefs.h:173
#define DB_START_VOLUME
Definition: DbTable.H:52
unsigned n2i(const char *column) const
DbFileDomainAttr * dmn_attrs
Definition: DbTable.H:354