00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __BLOB_H__
00012 #define __BLOB_H__
00013
00014 BEGIN_GIGABASE_NAMESPACE
00015
00021 class GIGABASE_DLL_ENTRY dbBlobIterator {
00022 protected:
00023 size_t size;
00024 offs_t pos;
00025 dbDatabase& db;
00026 oid_t oid;
00027 oid_t next;
00028 void* buf;
00029 bool closed;
00030
00031 public:
00037 virtual size_t getAvailableSize() = 0;
00038
00044 size_t getAvailableBufferSize() {
00045 size_t rest = dbPageSize - ((int)pos & (dbPageSize-1));
00046 return rest < size ? rest : size;
00047 }
00048
00053 virtual void* mapBuffer() = 0;
00054
00059 virtual void unmapBuffer(size_t proceeded);
00060
00064 virtual void close();
00065
00071 dbBlobIterator(dbDatabase& db, oid_t oid);
00072
00076 virtual ~dbBlobIterator();
00077 };
00078
00079
00083 class GIGABASE_DLL_ENTRY dbBlobReadIterator : public dbBlobIterator {
00084 public:
00091 size_t read(void* buf, size_t bufSize);
00092
00098 dbBlobReadIterator(dbDatabase& db, oid_t oid) : dbBlobIterator(db,oid) {}
00099
00103 ~dbBlobReadIterator();
00104
00109 virtual void* mapBuffer();
00110
00116 virtual size_t getAvailableSize();
00117
00121 virtual void close();
00122 };
00123
00124 class GIGABASE_DLL_ENTRY dbBlobWriteIterator : public dbBlobIterator {
00125 public:
00131 void write(void const* buf, size_t bufSize);
00132
00138 dbBlobWriteIterator(dbDatabase& db, oid_t oid) : dbBlobIterator(db,oid) {}
00139
00143 ~dbBlobWriteIterator();
00144
00149 virtual void* mapBuffer();
00150
00157 virtual size_t getAvailableSize();
00158
00162 virtual void close();
00163 };
00164
00168 const size_t dbDefaultFirstBlobSegmentSize = 16000;
00169
00170
00177 class GIGABASE_DLL_ENTRY dbBlob : public dbAnyReference {
00178 public:
00185 void create(dbDatabase& dbase, size_t size = dbDefaultFirstBlobSegmentSize);
00186
00192 size_t getSize(dbDatabase& db);
00193
00199 dbBlobReadIterator getReadIterator(dbDatabase& db);
00200
00206 dbBlobWriteIterator getWriteIterator(dbDatabase& db);
00207
00214 dbBlob& operator = (dbAnyReference const& ref) {
00215 oid = ref.getOid();
00216 return *this;
00217 }
00218
00224 void free(dbDatabase& db);
00225 };
00226
00227 END_GIGABASE_NAMESPACE
00228
00229 #endif
00230
00231
00232
00233