00001
00002
00003
00004
00005
00006
00007 #ifndef __TABLE_H
00008 #define __TABLE_H
00009
00010 #ifdef _MSC_VER
00011 #pragma warning( push )
00012 #endif
00013
00014 #include "DS_List.h"
00015 #include "DS_BPlusTree.h"
00016 #include "RakMemoryOverride.h"
00017 #include "Export.h"
00018 #include "RakString.h"
00019
00020 #define _TABLE_BPLUS_TREE_ORDER 16
00021 #define _TABLE_MAX_COLUMN_NAME_LENGTH 64
00022
00025 namespace DataStructures
00026 {
00027
00033 class RAK_DLL_EXPORT Table
00034 {
00035 public:
00036
00037 enum ColumnType
00038 {
00039
00040 NUMERIC,
00041
00042
00043 STRING,
00044
00045
00046 BINARY,
00047
00048
00049 POINTER,
00050 };
00051
00052
00054
00055 struct RAK_DLL_EXPORT Cell
00056 {
00057 Cell();
00058 ~Cell();
00059 Cell(double numericValue, char *charValue, void *ptr, ColumnType type);
00060 void SetByType(double numericValue, char *charValue, void *ptr, ColumnType type);
00061 void Clear(void);
00062
00064 void Set(int input);
00065 void Set(unsigned int input);
00066 void Set(double input);
00067
00069 void Set(const char *input);
00070
00072 void Set(const char *input, int inputLength);
00073
00075 void SetPtr(void* p);
00076
00078 void Get(int *output);
00079 void Get(double *output);
00080
00082 void Get(char *output);
00083
00085 void Get(char *output, int *outputLength);
00086
00087 RakNet::RakString ToString(ColumnType columnType);
00088
00089
00090 Cell& operator = ( const Cell& input );
00091 Cell( const Cell & input);
00092
00093 ColumnType EstimateColumnType(void) const;
00094
00095 bool isEmpty;
00096 double i;
00097 char *c;
00098 void *ptr;
00099 };
00100
00103
00104 struct RAK_DLL_EXPORT ColumnDescriptor
00105 {
00106 ColumnDescriptor();
00107 ~ColumnDescriptor();
00108 ColumnDescriptor(const char cn[_TABLE_MAX_COLUMN_NAME_LENGTH],ColumnType ct);
00109
00110 char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH];
00111 ColumnType columnType;
00112 };
00113
00115
00116 struct RAK_DLL_EXPORT Row
00117 {
00118
00119 DataStructures::List<Cell*> cells;
00120
00122 void UpdateCell(unsigned columnIndex, double value);
00123
00125 void UpdateCell(unsigned columnIndex, const char *str);
00126
00128 void UpdateCell(unsigned columnIndex, int byteLength, const char *data);
00129 };
00130
00131
00132 enum FilterQueryType
00133 {
00134 QF_EQUAL,
00135 QF_NOT_EQUAL,
00136 QF_GREATER_THAN,
00137 QF_GREATER_THAN_EQ,
00138 QF_LESS_THAN,
00139 QF_LESS_THAN_EQ,
00140 QF_IS_EMPTY,
00141 QF_NOT_EMPTY,
00142 };
00143
00144
00145
00146 struct RAK_DLL_EXPORT FilterQuery
00147 {
00148 FilterQuery();
00149 ~FilterQuery();
00150 FilterQuery(unsigned column, Cell *cell, FilterQueryType op);
00151
00152
00153 char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH];
00154 unsigned columnIndex;
00155 Cell *cellValue;
00156 FilterQueryType operation;
00157 };
00158
00160 enum SortQueryType
00161 {
00162 QS_INCREASING_ORDER,
00163 QS_DECREASING_ORDER,
00164 };
00165
00166
00167
00168 struct RAK_DLL_EXPORT SortQuery
00169 {
00171 unsigned columnIndex;
00172
00174 SortQueryType operation;
00175 };
00176
00177
00178 Table();
00179
00180
00181 ~Table();
00182
00187 unsigned AddColumn(const char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH], ColumnType columnType);
00188
00191 void RemoveColumn(unsigned columnIndex);
00192
00197 unsigned ColumnIndex(char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH]) const;
00198 unsigned ColumnIndex(const char *columnName) const;
00199
00203 char* ColumnName(unsigned index) const;
00204
00208 ColumnType GetColumnType(unsigned index) const;
00209
00212 unsigned GetColumnCount(void) const;
00213
00216 unsigned GetRowCount(void) const;
00217
00227 Table::Row* AddRow(unsigned rowId);
00228 Table::Row* AddRow(unsigned rowId, DataStructures::List<Cell> &initialCellValues);
00229 Table::Row* AddRow(unsigned rowId, DataStructures::List<Cell*> &initialCellValues, bool copyCells=false);
00230
00234 bool RemoveRow(unsigned rowId);
00235
00238 void RemoveRows(Table *tableContainingRowIDs);
00239
00246 bool UpdateCell(unsigned rowId, unsigned columnIndex, int value);
00247 bool UpdateCell(unsigned rowId, unsigned columnIndex, char *str);
00248 bool UpdateCell(unsigned rowId, unsigned columnIndex, int byteLength, char *data);
00249 bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int value);
00250 bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, char *str);
00251 bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int byteLength, char *data);
00252
00255 void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, int *output);
00256 void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output);
00257 void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output, int *outputLength);
00258
00263 Row* GetRowByID(unsigned rowId) const;
00264
00270 Row* GetRowByIndex(unsigned rowIndex, unsigned *key) const;
00271
00280 void QueryTable(unsigned *columnIndicesSubset, unsigned numColumnSubset, FilterQuery *inclusionFilters, unsigned numInclusionFilters, unsigned *rowIds, unsigned numRowIDs, Table *result);
00281
00289 void SortTable(Table::SortQuery *sortQueries, unsigned numSortQueries, Table::Row** out);
00290
00292 void Clear(void);
00293
00298 void PrintColumnHeaders(char *out, int outLength, char columnDelineator) const;
00299
00306 void PrintRow(char *out, int outLength, char columnDelineator, bool printDelineatorForBinary, Table::Row* inputRow) const;
00307
00309 const DataStructures::List<ColumnDescriptor>& GetColumns(void) const;
00310
00312 const DataStructures::BPlusTree<unsigned, Row*, _TABLE_BPLUS_TREE_ORDER>& GetRows(void) const;
00313
00315 DataStructures::Page<unsigned, DataStructures::Table::Row*, _TABLE_BPLUS_TREE_ORDER> * GetListHead(void);
00316
00319 unsigned GetAvailableRowId(void) const;
00320
00321 Table& operator = ( const Table& input );
00322
00323 protected:
00324 Table::Row* AddRowColumns(unsigned rowId, Row *row, DataStructures::List<unsigned> columnIndices);
00325
00326 void DeleteRow(Row *row);
00327
00328 void QueryRow(DataStructures::List<unsigned> &inclusionFilterColumnIndices, DataStructures::List<unsigned> &columnIndicesToReturn, unsigned key, Table::Row* row, FilterQuery *inclusionFilters, Table *result);
00329
00330
00331
00332 DataStructures::BPlusTree<unsigned, Row*, _TABLE_BPLUS_TREE_ORDER> rows;
00333
00334
00335 DataStructures::List<ColumnDescriptor> columns;
00336 };
00337 }
00338
00339 #ifdef _MSC_VER
00340 #pragma warning( pop )
00341 #endif
00342
00343 #endif