// Пример работы с базой данных с использованием виртуальных функций. // В этом примере рассмотрена случай наличия в классах базы данных // виртуальных фуккций. Для работы этого примера необходимо при компиляции // определить TYPE_INFO (вставить опцию -DTYPE_INFO в параметры компилятора) #define USE_VIRTUAL_FUNCTIONS 1 #include #include #include "fstor.hpp" // используется простое файловое хранилище #include "oodbs.hpp" enum File_Object_Tags { Odb_Tag( Record ) }; // для каждого класса базы данных // нужно определить уникальный номер - идентификатор struct Record : File_Object { // каждый класс базы данных должен быть выведен Record* Next; // из File_Object char Text[ 1 ]; virtual char* Get() { return Text; } Odb_Constructor( Record ); // и иметь специальный конструктор }; struct Text_Base : Object_Database { // определение собственной СУБД Odb_File_Object( Record ); // нужно перечислить все классы входящие в базу Text_Base ( int Number, Dbs_Store** Files, V_Table* Table ) : Object_Database( Number, Files, Table ) {} }; Odb_Define_Initializer( Record ); // для каждого класса определить инициализатор V_Table DB_Table[] = { Odb_Initializer( Record ) }; // таблица для вызова инициализаторов, номер в таблице должен совпадать с // идентификатором класса, определеннын в File_Object_Tags Dbs_Channel DB_Vio ( 10 ) ; // создается пул каналов ввода/вывода Dbs_Pool DB_Cache ( 64 ) ; // создается пул страниц (размером 64 страницы) Dbs_File DB_File ( "test.dbs" ); // файл с которым работает база данных Dbs_F_Store DB_Store ( DB_File , DB_Cache ); // хранилище данного файла Dbs_Store* DB_List = &DB_Store; // список хранилищ исполззуемых базой данных Text_Base Db( 1, &DB_List, DB_Table ); // создание базы данных // первый параметр - количество хранилищ, 2ой - массив указателей на хранилища, // третий - указатель на инициализирующую таблицу main () { Db.Open(); // открываем базы данных if( Db.Empty() ) { // если она пуста, то нужно создать корневой объект char Buf[ 256 ]; Record* Rec = NULL; while( fgets( Buf, sizeof Buf, stdin ) ) { Record* New = new (strlen(Buf)) Record; // создание новой записи if( Rec != NULL ) Rec->Next = Pos(New); // получение виртуального strcpy( New->Text, Buf ); // адреса Rec = New; } if (Rec != NULL) { Rec->Next = NULL; } } else { // метод Start вернет виртуальный адрес корневого объекта for(Record* Rec = (Record*)Db.Start(); Rec != NULL; Rec = Db(Rec).Next) fputs( Db(Rec).Text, stdout ); // обращение по ссылке } Db.Close(); // надо не забыть закрыть базу return 0; }