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, size_t maxExtent) : dbBlobIterator(db,oid) {
00139 extent = maxExtent;
00140 }
00141
00145 ~dbBlobWriteIterator();
00146
00151 virtual void* mapBuffer();
00152
00159 virtual size_t getAvailableSize();
00160
00164 virtual void close();
00165
00166 private:
00167 size_t extent;
00168 };
00169
00173 const size_t dbDefaultFirstBlobSegmentSize = 16000;
00174 const size_t dbDefaultBlobExtent = 64000;
00175
00176
00183 class GIGABASE_DLL_ENTRY dbBlob : public dbAnyReference {
00184 public:
00185 dbBlob(oid_t oid = 0) : dbAnyReference(oid) {}
00186
00193 void create(dbDatabase& dbase, size_t size = dbDefaultFirstBlobSegmentSize);
00194
00200 size_t getSize(dbDatabase& db);
00201
00207 dbBlobReadIterator getReadIterator(dbDatabase& db);
00208
00218 dbBlobWriteIterator getWriteIterator(dbDatabase& db, size_t maxExtent = dbDefaultBlobExtent);
00219
00226 dbBlob& operator = (dbAnyReference const& ref) {
00227 oid = ref.getOid();
00228 return *this;
00229 }
00230
00236 void free(dbDatabase& db);
00237 };
00238
00239 END_GIGABASE_NAMESPACE
00240
00241 #endif
00242
00243
00244
00245