123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /* ---------------------------------------------------------------------------
- Nullsoft Database Engine
- --------------------
- codename: Near Death Experience
- --------------------------------------------------------------------------- */
- /* ---------------------------------------------------------------------------
- Table Class Prototypes
- Windows implementation
- --------------------------------------------------------------------------- */
- #ifndef __TABLE_H
- #define __TABLE_H
- #include <stdio.h>
- //#include <io.h>
- #include "../Scanner.h"
- #include <map>
- #include "../IndexRecord.h"
- #include <assert.h>
- class Table : private Scanner
- {
- public:
- // TODO: move these back to protected
- VFILE *Handle = NULL;
- using Scanner::index;
- bool use_row_cache = false;
- BOOL GLocateUpToDate = FALSE;
- private:
- void Init();
- void Reset();
- private:
- LinkedList *Scanners;
- protected:
- wchar_t *Name;
- wchar_t *IdxName;
- VFILE *IdxHandle = NULL;
- BOOL AutoCreate;
- Record *FieldsRecord = NULL;
- IndexRecord *IndexList = NULL;
- Database *db;
- BOOL Cached;
- int numErrors = 0;
- using Scanner::Edition;
- bool columns_cached = false;
- unsigned char column_ids[256];
- typedef std::map<int, Record*> RowCache;
- RowCache rowCache;
- // Tables
- static bool Compact_ColumnWalk(Record *record, Field *entry, void *context_in);
- static bool Compact_ColumnWalk2(Record *record, Field *entry, void *context_in);
- static bool Compact_IndexWalk(Table *table, IndexField *entry, void *context);
- static bool IndexWriteWalker(IndexRecord *record, Field *entry, void *context);
- static bool IndexWalkerThunk(IndexRecord *record, Field *entry, void *context);
- static bool IndexNewWalker(IndexRecord *record, Field *entry, void *context);
- static bool BuildColumnCache(Record *record, Field *entry, void *context);
- public:
- typedef bool (*IndexWalker)(Table *table, IndexField *entry, void *context);
- Table(const wchar_t *TableName, const wchar_t *IdxName, BOOL Create, Database *db, BOOL Cached);
- ~Table();
- BOOL Open(void);
- void Close(void);
- // Columns
- ColumnField *NewColumn(unsigned char Id, const wchar_t *name, unsigned char type, BOOL indexUniques);
- void DeleteColumn(ColumnField *field); // todo
- void DeleteColumnByName(const wchar_t *name); // todo
- void DeleteColumnById(unsigned char Id); // todo
- void PostColumns(void);
- NDE_API Record *GetColumns(void);
- ColumnField *GetColumnByName(const wchar_t *FieldName);
- ColumnField *GetColumnById(unsigned char Idx);
- unsigned char GetColumnType(unsigned char Id);
- // Fields
- using Scanner::NewFieldByName;
- using Scanner::NewFieldById;
- using Scanner::GetFieldByName;
- using Scanner::GetFieldById;
- using Scanner::DeleteField;
- using Scanner::DeleteFieldByName;
- using Scanner::DeleteFieldById;
- // Records
- using Scanner::First;
- using Scanner::Last;
- using Scanner::Next;
- using Scanner::Previous;
- using Scanner::Eof;
- using Scanner::Bof;
- using Scanner::New;
- using Scanner::Insert;
- using Scanner::Edit;
- using Scanner::Cancel;
- using Scanner::Post;
- using Scanner::Delete;
- using Scanner::GetRecordsCount;
- using Scanner::GetRecordById;
- using Scanner::GetRecordId;
- void Sync(void);
- using Scanner::LocateByName;
- using Scanner::LocateById;
- BOOL LocateByIdEx(int Id, int From, Field *field, int comp_mode);
- // Indexes
- void AddIndexByName(const wchar_t *FieldName, const wchar_t *KeyName);
- void AddIndexById(unsigned char Id, const wchar_t *KeyName);
- void WalkIndices(IndexWalker callback, void *context);
- IndexField *GetIndexByName(const wchar_t *name);
- IndexField *GetIndexById(unsigned char Id);
- using Scanner::SetWorkingIndexByName;
- using Scanner::SetWorkingIndexById;
- NDE_API BOOL CheckIndexing(void);
- void DropIndexByName(const wchar_t *desc);
- void DropIndexById(unsigned char Id);
- void DropIndex(IndexField *Ptr);
- void IndexModified(void);
- // Filters
- using Scanner::AddFilterByName;
- using Scanner::AddFilterById;
- using Scanner::AddFilterOp;
- using Scanner::RemoveFilters;
- // Scanners
- Scanner *NewScanner();
- Scanner *GetDefaultScanner();
- void DeleteScanner(Scanner *scan);
- // Misc
- using Scanner::FragmentationLevel;
- void Compact(int *progress = NULL);
- void SetGlobalLocateUpToDate(BOOL is);
- // Row Cache
- void RowCache_Delete(int position);
- void RowCache_Remove(int position);
- void RowCache_Add(Record *record, int position);
- Record *RowCache_Get(int position);
- NDE_API void EnableRowCache();
- // Searching
- void SetFieldSearchableById(unsigned char field_id, bool searchable);
- int HasErrors()
- {
- return numErrors > 0;
- }
- int NumErrors()
- {
- return numErrors;
- }
- void IncErrorCount()
- {
- numErrors++;
- }
- };
- #endif
|