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 #include <assert.h>
00026
00027 namespace eyedb {
00028
00029 class AttrDirect : public Attribute {
00030
00031 Status check() const;
00032 void newObjRealize(Object *) const;
00033 Status varDimCopy(Data, Data) const;
00034 #ifdef GBX_NEW_CYCLE
00035 void decrRefCountPropag(Object *, int) const;
00036 #endif
00037 void garbage(Object *, int) const;
00038 void manageCycle(Database *db, Object *o, gbxCycleContext &r) const;
00039
00040 public:
00041 AttrDirect(const Attribute*, const Class *, const Class *, const Class *, int);
00042 AttrDirect(Database *, Data, Offset *, const Class *, int);
00043
00044 inline Bool isVarDim() const {return False;}
00045 inline Bool isIndirect() const {return False;}
00046
00047 Status compile_perst(const AgregatClass *, int *, int *, int *);
00048 Status compile_volat(const AgregatClass *, int *, int *);
00049
00050 Status setOid(Object *, const Oid *, int=1, int=0, Bool=True) const;
00051 Status getOid(const Object *, Oid *, int=1, int=0) const;
00052 Status setValue(Object *, Data, int, int, Bool = True) const;
00053 Status getValue(const Object *, Data *, int, int, Bool * = NULL) const;
00054 Status getTValue(Database *db, const Oid &objoid,
00055 Data *data, int nb = 1, int from = 0,
00056 Bool *isnull = 0, Size *rnb = 0, Offset = 0) const;
00057
00058 Status getVal(Database *, const Oid *, Data,
00059 int, int, int, Bool * = NULL) const;
00060
00061
00062
00063
00064 Status realize(Database *, Object *,
00065 const Oid&,
00066 const Oid&,
00067 AttrIdxContext &idx_ctx,
00068 const RecMode *) const;
00069 Status remove(Database *, Object *,
00070 const Oid&,
00071 const Oid&,
00072 AttrIdxContext &idx_ctx,
00073 const RecMode *) const;
00074 Status load(Database *,
00075 Object *,
00076 const Oid &,
00077 LockMode lockmode,
00078 AttrIdxContext &,
00079 const RecMode *, Bool force = False) const;
00080 Status trace(const Object *, FILE *, int *, unsigned int, const RecMode *) const;
00081 Bool isFlat() const {return True;}
00082 virtual Status convert(Database *db, ClassConversion *,
00083 Data in_idr, Size in_size) const;
00084 };
00085
00086 class AttrIndirect : public Attribute {
00087
00088 Status check() const;
00089 #ifdef GBX_NEW_CYCLE
00090 void decrRefCountPropag(Object *, int) const;
00091 #endif
00092 void garbage(Object *, int) const;
00093 void manageCycle(Database *db, Object *o, gbxCycleContext &r) const;
00094
00095 public:
00096 AttrIndirect(const Attribute*, const Class *, const Class *, const Class *, int);
00097 AttrIndirect(Database *, Data, Offset *, const Class *, int);
00098
00099 inline Bool isVarDim() const {return False;}
00100 inline Bool isIndirect() const {return True;}
00101
00102 Status compile_perst(const AgregatClass *, int *, int *, int *);
00103 Status compile_volat(const AgregatClass *, int *, int *);
00104
00105 Status setOid(Object *, const Oid *, int=1, int=0, Bool=True) const;
00106 Status getOid(const Object *, Oid *, int=1, int=0) const;
00107 Status setValue(Object *, Data, int, int, Bool = True) const;
00108 Status getValue(const Object *, Data *, int, int, Bool * = NULL) const;
00109 Status getTValue(Database *db, const Oid &objoid,
00110 Data *data, int nb = 1, int from = 0,
00111 Bool *isnull = 0, Size *rnb = 0, Offset = 0) const;
00112
00113
00114 Status getVal(Database *, const Oid *, Data,
00115 int, int, int, Bool * = NULL) const;
00116
00117
00118
00119
00120 Status realize(Database *, Object *,
00121 const Oid&,
00122 const Oid&,
00123 AttrIdxContext &idx_ctx,
00124 const RecMode *) const;
00125 Status remove(Database *, Object *,
00126 const Oid&,
00127 const Oid&,
00128 AttrIdxContext &idx_ctx,
00129 const RecMode *) const;
00130 Status load(Database *,
00131 Object *,
00132 const Oid &,
00133 LockMode lockmode,
00134 AttrIdxContext &,
00135 const RecMode *, Bool force = False) const;
00136 Status trace(const Object *, FILE *, int *, unsigned int, const RecMode *) const;
00137 virtual Status convert(Database *db, ClassConversion *,
00138 Data in_idr, Size in_size) const;
00139 };
00140
00141 class AttrVD : public Attribute {
00142
00143 virtual void setVarDimOid(Object *, const Oid *) const = 0;
00144 virtual void setSizeChanged(Object *, Bool) const = 0;
00145 virtual Bool isSizeChanged(const Object *) const = 0;
00146 virtual Status getDefaultDataspace(const Dataspace *&) const;
00147 virtual Status setDefaultDataspace(const Dataspace *);
00148
00149 protected:
00150 AttrVD(const Attribute*, const Class *, const Class *, const Class *, int);
00151 AttrVD(Database *, Data, Offset *, const Class *, int);
00152
00153 Status update_realize(Database *, Object *, const Oid&,
00154 const Oid&, int, Size, Data,
00155 Oid &oid,
00156 AttrIdxContext &idx_ctx) const;
00157 Status remove_realize(Database *,
00158 const Oid&, const Oid&, Object *,
00159 AttrIdxContext &idx_ctx) const;
00160
00161 Status getSize(Data, Size&) const;
00162 Status getSize(const Object *, Size&) const;
00163 Status getSize(Database *, const Oid *, Size&) const;
00164
00165
00166 Status getVal(Database *, const Oid *, Data,
00167 int, int, int, Bool * = NULL) const;
00168
00169
00170
00171
00172 };
00173
00174 class AttrVarDim : public AttrVD {
00175
00176 Status check() const;
00177 void manageCycle(Database *db, Object *o, gbxCycleContext &r) const;
00178
00179 void newObjRealize(Object *) const;
00180 void getData(const Database *, Data, Data&, Data&) const;
00181 void getData(const Object *, Data&, Data&) const;
00182 void setData(const Database *, Data, Data, Data) const;
00183 void setData(const Object *, Data, Data) const;
00184 void getInfo(const Object *, Data&, Data&, Size&, Size&,
00185 Oid&) const;
00186 int iniCompute(const Database *, int, Data &, Data&) const;
00187 void setVarDimOid(Object *, const Oid *) const;
00188 void getVarDimOid(const Object *, Oid *) const;
00189 void getVarDimOid(Data, Oid *) const;
00190 Status setSize_realize(Object *, Data, Size, Bool,
00191 Bool noGarbage = False) const;
00192 int getBound(Database *, Data);
00193 Status copy(Object*, Bool) const;
00194 #ifdef GBX_NEW_CYCLE
00195 void decrRefCountPropag(Object *, int) const;
00196 #endif
00197 void garbage(Object *, int) const;
00198 void setSizeChanged(Object *, Bool) const;
00199 Bool isSizeChanged(const Object *) const;
00200 Status update(Database *, const Oid&,
00201 const Oid&, Object *,
00202 AttrIdxContext &idx_ctx) const;
00203 Bool getIsLoaded(const Object *agr) const;
00204 void setIsLoaded(const Object *agr, Bool) const;
00205 Bool getIsLoaded(Data) const;
00206 void setIsLoaded(Data, Bool) const;
00207
00208 public:
00209 AttrVarDim(const Attribute*, const Class *, const Class *, const Class *, int);
00210 AttrVarDim(Database *, Data, Offset *, const Class *, int);
00211
00212 inline Bool isVarDim() const {return True;}
00213 inline Bool isIndirect() const {return False;}
00214
00215 Status compile_perst(const AgregatClass *, int *, int *, int *);
00216 Status compile_volat(const AgregatClass *, int *, int *);
00217
00218 Status setSize(Object *, Size) const;
00219 Status setOid(Object *, const Oid *, int=1, int=0, Bool=True) const;
00220 Status getOid(const Object *, Oid *, int=1, int=0) const;
00221 Status setValue(Object *, Data, int, int, Bool = True) const;
00222 Status getValue(const Object *, Data *, int, int, Bool * = NULL) const;
00223 Status getTValue(Database *db, const Oid &objoid,
00224 Data *data, int nb = 1, int from = 0,
00225 Bool *isnull = 0, Size *rnb = 0, Offset = 0) const;
00226
00227 Status realize(Database *, Object *,
00228 const Oid&,
00229 const Oid&,
00230 AttrIdxContext &idx_ctx,
00231 const RecMode *) const;
00232 Status remove(Database *, Object *,
00233 const Oid&,
00234 const Oid&,
00235 AttrIdxContext &idx_ctx,
00236 const RecMode *) const;
00237 Status load(Database *,
00238 Object *,
00239 const Oid &,
00240 LockMode lockmode,
00241 AttrIdxContext &,
00242 const RecMode *, Bool force = False) const;
00243 Status trace(const Object *, FILE *, int *, unsigned int, const RecMode *) const;
00244 virtual Status convert(Database *db, ClassConversion *,
00245 Data in_idr, Size in_size) const;
00246 };
00247
00248 class AttrIndirectVarDim : public AttrVD {
00249
00250 Status check() const;
00251 void manageCycle(Database *db, Object *o, gbxCycleContext &r) const;
00252 void getData(const Database *, Data, Data&, Data&) const;
00253 void getData(const Object *, Data&, Data&) const;
00254 void setData(const Database *, Data, Data) const;
00255 void setData(const Object *, Data) const;
00256 void getInfo(const Object *, Size&, Data&, Oid&) const;
00257 void getInfoOids(const Object *, Size&, Data&, Oid&) const;
00258 void setVarDimOid(Object *, const Oid *) const;
00259 void getVarDimOid(const Object *, Oid *) const;
00260 void getVarDimOid(Data, Oid *) const;
00261 void setDataOids(Object *, Data) const;
00262 void setDataOids(Data, Data) const;
00263 void getDataOids(Data, Data&) const;
00264 void getDataOids(const Object *, Data&) const;
00265 Status copy(Object*, Bool) const;
00266 #ifdef GBX_NEW_CYCLE
00267 void decrRefCountPropag(Object *, int) const;
00268 #endif
00269 void garbage(Object *, int) const;
00270 void setSizeChanged(Object *, Bool) const;
00271 Bool isSizeChanged(const Object *) const;
00272 Status update(Database *, const Oid&,
00273 const Oid&, Object *,
00274 AttrIdxContext &idx_ctx) const;
00275 public:
00276 AttrIndirectVarDim(const Attribute*, const Class *, const Class *, const Class *, int);
00277 AttrIndirectVarDim(Database *, Data, Offset *, const Class *, int);
00278
00279 inline Bool isVarDim() const {return True;}
00280 inline Bool isIndirect() const {return True;}
00281
00282 Status compile_perst(const AgregatClass *, int *, int *, int *);
00283 Status compile_volat(const AgregatClass *, int *, int *);
00284
00285 Status setSize(Object *, Size) const;
00286
00287 Status setOid(Object *, const Oid *, int=1, int=0, Bool=True) const;
00288 Status getOid(const Object *, Oid *, int=1, int=0) const;
00289 Status setValue(Object *, Data, int, int, Bool = True) const;
00290 Status getValue(const Object *, Data *, int, int, Bool * = NULL) const;
00291 Status getTValue(Database *db, const Oid &objoid,
00292 Data *data, int nb = 1, int from = 0,
00293 Bool *isnull = 0, Size *rnb = 0, Offset = 0) const;
00294 Status realize(Database *, Object *,
00295 const Oid&,
00296 const Oid&,
00297 AttrIdxContext &idx_ctx,
00298 const RecMode *) const;
00299 Status remove(Database *, Object *,
00300 const Oid&,
00301 const Oid&,
00302 AttrIdxContext &idx_ctx,
00303 const RecMode *) const;
00304 Status load(Database *,
00305 Object *,
00306 const Oid &,
00307 LockMode lockmode,
00308 AttrIdxContext &,
00309 const RecMode *, Bool force = False) const;
00310 Status trace(const Object *, FILE *, int *, unsigned int, const RecMode *) const;
00311 virtual Status convert(Database *db, ClassConversion *,
00312 Data in_idr, Size in_size) const;
00313 };
00314
00315 class AttrIdxContext {
00316
00317 public:
00318 AttrIdxContext() {
00319 init();
00320 }
00321
00322 AttrIdxContext(const Class *_class_owner) {
00323 init();
00324 set(_class_owner, (Attribute *)0);
00325 }
00326
00327 AttrIdxContext(const Class *_class_owner, const Attribute *attr) {
00328 init();
00329 set(_class_owner, attr);
00330 }
00331
00332 AttrIdxContext(Class *_class_owner, Attribute **_attrs,
00333 int _attr_cnt) {
00334 init();
00335 if (!_attr_cnt)
00336 return;
00337 set(_class_owner, _attrs[0]);
00338 for (int i = 1; i < _attr_cnt; i++)
00339 push(_attrs[i]);
00340 }
00341
00342 AttrIdxContext(const Data, Size);
00343
00344 AttrIdxContext(AttrIdxContext *);
00345
00346 void set(const Class *_class_owner, const Attribute *attr) {
00347 garbage(False);
00348 set(_class_owner);
00349 attr_cnt = 0;
00350 if (attr)
00351 push(attr);
00352 }
00353
00354 void push(Database *db, const Oid &cloid, const Attribute *attr) {
00355 if (!class_owner) {
00356 set(db->getSchema()->getClass(cloid), attr);
00357 assert(class_owner);
00358 return;
00359 }
00360 push(attr);
00361 }
00362
00363 void push(const Class *_class_owner, const Attribute *attr) {
00364 if (!class_owner) {
00365 set(_class_owner, attr);
00366 return;
00367 }
00368 push(attr);
00369 }
00370
00371 void push(const Attribute *attr);
00372 void push(const char *attrname);
00373 void pop();
00374
00375 int getLevel() const {return attr_cnt;}
00376
00377 enum IdxOP {
00378 IdxInsert = 1,
00379 IdxRemove
00380 };
00381
00382 void addIdxOP(const Attribute *attr, IdxOP,
00383 Index *, eyedbsm::Idx *, unsigned char *data, unsigned int sz,
00384 Oid data_oid[2]);
00385
00386 Status realizeIdxOP(Bool);
00387
00388 Attribute *getAttribute(const Class *) const;
00389
00390 Data code(Size &) const;
00391 std::string getString() const;
00392
00393 std::string getAttrName(Bool ignore_class_owner = False) const;
00394 const char *getClassOwner() const {return class_owner;}
00395 const char *getAttrName(int n) const {return n >= attr_cnt ? 0 : attrs[n].c_str();}
00396 unsigned int getAttrCount() const {return attr_cnt;}
00397
00398 void pushOff(int off, const Oid &data_oid);
00399 void pushOff(int off);
00400 int getOff();
00401 void popOff();
00402
00403 Oid getDataOid();
00404
00405 int operator==(const AttrIdxContext &) const;
00406 int operator!=(const AttrIdxContext &idx_ctx) const {
00407 return !(*this == idx_ctx);
00408 }
00409
00410 ~AttrIdxContext() {
00411 garbage(True);
00412 }
00413
00414 private:
00415
00416 void set(const Class *_class_owner);
00417
00418 eyedblib::Mutex mut;
00419 struct IdxOperation {
00420 const Attribute *attr;
00421 IdxOP op;
00422 Index *idx_t;
00423 eyedbsm::Idx *idx;
00424 unsigned char *data;
00425 Oid data_oid[2];
00426 } *idx_ops;
00427
00428 int idx_ops_cnt;
00429 int idx_ops_alloc;
00430 AttrIdxContext *idx_ctx_root;
00431 Bool toFree;
00432
00433 void init() {
00434 toFree = False;
00435 attrpath_computed = False;
00436 attr_off_cnt = 0;
00437 attr_cnt = 0;
00438 class_owner = 0;
00439 idx_ops_cnt = 0;
00440 idx_ops_alloc = 0;
00441 idx_ops = 0;
00442 idx_ctx_root = 0;
00443 }
00444
00445 void garbage(Bool);
00446 char *class_owner;
00447 std::string attrs[64];
00448 struct {
00449 int off;
00450 Oid data_oid;
00451 } attr_off[64];
00452 eyedblib::int16 attr_off_cnt;
00453 eyedblib::int16 attr_cnt;
00454 mutable Bool attrpath_ignore_class_owner;
00455 mutable Bool attrpath_computed;
00456 mutable char attrpath[512];
00457
00458 private:
00459 AttrIdxContext(const AttrIdxContext &);
00460 AttrIdxContext &operator=(const AttrIdxContext &);
00461 };
00462
00463 enum {
00464 AttrDirect_Code = 0x31,
00465 AttrIndirect_Code,
00466 AttrVarDim_Code,
00467 AttrIndirectVarDim_Code,
00468 AttrNative_Code
00469 };
00470
00471 extern void
00472 get_prefix(const Object *, const Class *, char prefix[], int);
00473
00474 #define MULTIIDX_VERSION 20413
00475
00476 }
00477
00478 #include <eyedb/AttrNative.h>