00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #pragma once
00031 #ifndef __OPENTABLE_MS_H__
00032 #define __OPENTABLE_MS_H__
00033
00034 #include "cslib/CSDefs.h"
00035 #include "cslib/CSFile.h"
00036
00037 #include "engine_ms.h"
00038
00039 #include "database_ms.h"
00040
00041 class MSOpenTablePool;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #ifdef DEBUG
00053
00054 #define MS_OT_BUFFER_SIZE ((uint16_t)(16384))
00055 #else
00056
00057 #define MS_OT_BUFFER_SIZE ((uint16_t)(16384))
00058 #endif
00059
00060 #define MS_UB_SAME_TAB 0
00061 #define MS_UB_NEW_HANDLE 1
00062 #define MS_UB_NEW_BLOB 2
00063 #define MS_UB_RETAINED 3
00064 #define MS_UB_NEW_RETAINED 4
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 class MSOpenTable : public CSRefObject, public CSPooled {
00083 public:
00084 bool inUse;
00085 bool isNotATable;
00086 MSOpenTable *nextTable;
00087 MSOpenTablePool *myPool;
00088
00089 CSFile *myTableFile;
00090
00091 MSRepository *myWriteRepo;
00092 MSRepoFile *myWriteRepoFile;
00093
00094 MSTempLogFile *myTempLogFile;
00095
00096 char myOTBuffer[MS_OT_BUFFER_SIZE];
00097
00098 MSOpenTable();
00099 virtual ~MSOpenTable();
00100
00101 virtual void returnToPool();
00102
00103 void close();
00104
00105 void createBlob(PBMSBlobURLPtr bh, uint64_t size, char *metadata, uint16_t metadata_size, CSInputStream *stream, CloudKeyPtr cloud_key = NULL, Md5Digest *checksum = NULL);
00106 void createBlob(PBMSBlobIDPtr blob_id, uint64_t blob_size, char *metadata, uint16_t metadata_size);
00107 void sendRepoBlob(uint64_t blob_id, uint64_t req_offset, uint64_t req_size, uint32_t auth_code, bool info_only, CSHTTPOutputStream *stream);
00108 void useBlob(int type, uint32_t db_id, uint32_t tab_id, uint64_t blob_id, uint32_t auth_code, uint16_t col_index, uint64_t blob_size, uint64_t blob_ref_id, PBMSBlobURLPtr ret_blob_url);
00109
00110 void releaseReference(uint64_t blob_id, uint64_t blob_ref_id);
00111 void freeReference(uint64_t blob_id, uint64_t blob_ref_id);
00112 void commitReference(uint64_t blob_id, uint64_t blob_ref_id);
00113 void checkBlob(CSStringBuffer *buffer, uint64_t blob_id, uint32_t auth_code, uint32_t temp_log_id, uint32_t temp_log_offset);
00114 bool deleteReferences(uint32_t temp_log_id, uint32_t temp_log_offset, bool *must_quit);
00115
00116 void openForReading();
00117 void closeForWriting();
00118
00119 bool haveTable() { return (myPool != NULL); }
00120 uint32_t getTableID();
00121 MSTable *getDBTable();
00122 MSDatabase *getDB();
00123
00124 void formatBlobURL(PBMSBlobURLPtr blob_url, uint64_t blob_id, uint32_t auth_code, uint64_t blob_size, uint32_t tab_id, uint64_t blob_ref_id);
00125 void formatBlobURL(PBMSBlobURLPtr blob_url, uint64_t blob_id, uint32_t auth_code, uint64_t blob_size, uint64_t blob_ref_id);
00126 void formatRepoURL(PBMSBlobURLPtr blob_url, uint32_t log_id, uint64_t log_offset, uint32_t auth_code, uint64_t blob_size);
00127
00128
00129 virtual CSObject *getNextLink() { return iNextLink; }
00130 virtual CSObject *getPrevLink() { return iPrevLink; }
00131 virtual void setNextLink(CSObject *link) { iNextLink = link; }
00132 virtual void setPrevLink(CSObject *link) { iPrevLink = link; }
00133
00134 private:
00135 CSObject *iNextLink;
00136 CSObject *iPrevLink;
00137
00138
00139
00140
00141
00142
00143 void openForWriting();
00144
00145 public:
00146 static MSOpenTable *newOpenTable(MSOpenTablePool *pool);
00147 };
00148
00149 class MSOpenTablePool : public CSRefObject, public CSPooled {
00150 public:
00151 uint32_t myPoolTableID;
00152 bool isRemovingTP;
00153 MSTable *myPoolTable;
00154 MSDatabase *myPoolDB;
00155
00156 MSOpenTablePool();
00157 virtual ~MSOpenTablePool();
00158
00159 MSOpenTable *getPoolTable();
00160 void returnOpenTable(MSOpenTable *otab);
00161
00162 void addOpenTable(MSOpenTable *otab);
00163 void removeOpenTable(MSOpenTable *otab);
00164
00165 void removeOpenTablesNotInUse();
00166
00167 virtual void returnToPool();
00168
00169 #ifdef DEBUG
00170 void check();
00171 #endif
00172
00173 uint32_t getSize() { return iPoolTables.getSize(); }
00174
00175 private:
00176 MSOpenTable *iTablePool;
00177 CSLinkedList iPoolTables;
00178
00179 public:
00180 static MSOpenTablePool *newPool(uint32_t db_id, uint32_t tab_id);
00181 };
00182
00183 class MSTableList : public CSObject {
00184 public:
00185 MSTableList();
00186 ~MSTableList();
00187
00188 static void startUp();
00189 static void shutDown();
00190
00191 static void debug(MSOpenTable *otab);
00192
00193 static MSOpenTable *getOpenTableByID(uint32_t db_id, uint32_t tab_id);
00194 static MSOpenTable *getOpenTableForDB(uint32_t db_id);
00195 static void releaseTable(MSOpenTable *otab);
00196
00197 static bool removeTablePoolIfEmpty(MSOpenTablePool *pool);
00198 static void removeTablePool(MSOpenTablePool *pool);
00199 static void removeTablePool(MSOpenTable *otab);
00200 static void removeDatabaseTables(MSDatabase *database);
00201
00202 static MSOpenTablePool *lockTablePoolForDeletion(uint32_t db_id, uint32_t tab_id, CSString *db_name, CSString *tab_name);
00203 static MSOpenTablePool *lockTablePoolForDeletion(MSTable *table);
00204 static MSOpenTablePool *lockTablePoolForDeletion(CSString *table_url);
00205 static MSOpenTablePool *lockTablePoolForDeletion(MSOpenTable *otab);
00206 static void unlockTablePool(MSOpenTablePool *pool);
00207
00208 private:
00209 static CSSyncOrderedList *gPoolListByID;
00210
00211 };
00212
00213 #endif