• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

DS_Table.h

Go to the documentation of this file.
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                         // Cell::i used
00040                         NUMERIC,
00041 
00042                         // Cell::c used to hold a null terminated string.
00043                         STRING,
00044 
00045                         // Cell::c holds data.  Cell::i holds data length of c in bytes.
00046                         BINARY,
00047 
00048                         // Cell::c holds data.  Not deallocated. Set manually by assigning ptr.
00049                         POINTER,
00050                 };
00051                 
00052                 
00054                 // Note: If this structure is changed the struct in the swig files need to be changed as well
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                         // assignment operator and copy constructor
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                 // Note: If this structure is changed the struct in the swig files need to be changed as well
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                 // Note: If this structure is changed the struct in the swig files need to be changed as well
00116                 struct RAK_DLL_EXPORT Row
00117                 {
00118                         // list of cells
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                 // Operations to perform for cell comparison
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                 // Compare the cell value for a row at columnName to the cellValue using operation.
00145                 // Note: If this structure is changed the struct in the swig files need to be changed as well
00146                 struct RAK_DLL_EXPORT FilterQuery
00147                 {
00148                         FilterQuery();
00149                         ~FilterQuery();
00150                         FilterQuery(unsigned column, Cell *cell, FilterQueryType op);
00151 
00152                         // If columnName is specified, columnIndex will be looked up using it.
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                 // Sort on increasing or decreasing order for a particular column
00167                 // Note: If this structure is changed the struct in the swig files need to be changed as well
00168                 struct RAK_DLL_EXPORT SortQuery
00169                 {
00171                         unsigned columnIndex;
00172 
00174                         SortQueryType operation;
00175                 };
00176 
00177                 // Constructor
00178                 Table();
00179 
00180                 // Destructor
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                 // 16 is arbitrary and is the order of the BPlus tree.  Higher orders are better for searching while lower orders are better for
00331                 // Insertions and deletions.
00332                 DataStructures::BPlusTree<unsigned, Row*, _TABLE_BPLUS_TREE_ORDER> rows;
00333 
00334                 // Columns in the table.
00335                 DataStructures::List<ColumnDescriptor> columns;
00336         };
00337 }
00338 
00339 #ifdef _MSC_VER
00340 #pragma warning( pop )
00341 #endif
00342 
00343 #endif

Generated on Thu Sep 30 2010 01:27:23 for RakNet by  doxygen 1.7.1