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