| 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
 
 
  |