Attribute_p.h

00001 /* 
00002    EyeDB Object Database Management System
00003    Copyright (C) 1994-2008 SYSRA
00004    
00005    EyeDB is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009    
00010    EyeDB is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014    
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with this library; if not, write to the Free Software
00017    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA 
00018 */
00019 
00020 /*
00021    Author: Eric Viara <viara@sysra.com>
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     // deprecated
00058     Status getVal(Database *, const Oid *, Data,
00059                   int, int, int, Bool * = NULL) const;
00060     /*
00061       Status getField(Database *, const Oid *, Oid *, int *,
00062       int, int) const;
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     // deprecated
00114     Status getVal(Database *, const Oid *, Data,
00115                   int, int, int, Bool * = NULL) const;
00116     /*
00117       Status getField(Database *, const Oid *, Oid *, int *,
00118       int, int) const;
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     // deprecated
00168     Status getVal(Database *, const Oid *, Data,
00169                   int, int, int, Bool * = NULL) const;
00170     /*
00171       Status getField(Database *, const Oid *, Oid *, int *,
00172       int, int) const;
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: // forbidden
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>

Generated on Mon Dec 22 18:15:50 2008 for eyedb by  doxygen 1.5.3