Attribute.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 #ifndef _EYEDB_ATTRIBUTE_H
00026 #define _EYEDB_ATTRIBUTE_H
00027 
00028 namespace eyedb {
00029 
00035   // forward definitions
00036   class ObjectHeader;
00037   class AgregatClass;
00038   class GenContext;
00039   class Index;
00040   class Class;
00041   class Schema;
00042   class ClassSequence;
00043   class ClassSeqItem;
00044   class AttrStack;
00045   class CardinalityConstraint;
00046   class UniqueConstraint;
00047   class NotNullConstraint;
00048   class ClassConversion;
00049   class AttributeComponent;
00050   class AttributeComponentSet;
00051   class CollAttrImpl;
00052   class Dataspace;
00053 
00054   class AttrIdxContext;
00055   class MultiIndex;
00056 
00060   class TypeModifier {
00061 
00062     // ----------------------------------------------------------------------
00063     // TypeModifier Interface
00064     // ----------------------------------------------------------------------
00065   public:
00066     enum {_Indirect = 0x1, _VarDim = 0x2};
00067 
00068     enum _mode {
00069       Direct         = 0,
00070       Indirect       = _Indirect,
00071       VarDim         = _VarDim,
00072       IndirectVarDim = _Indirect|_VarDim
00073     } mode;
00074 
00075     eyedblib::int16 ndims;
00076     eyedblib::int32 *dims;
00077     eyedblib::int32 pdims;
00078     eyedblib::int32 maxdims;
00079 
00087     static TypeModifier make(Bool isRef, int ndims, int *dims);
00088 
00096     Status codeIDR(Data* data, Offset* offset, Size* alloc_size);
00097 
00104     Status decodeIDR(Data data, Offset *offset);
00105 
00111     Bool compare(const TypeModifier *tmod) const;
00112 
00116     TypeModifier();
00117 
00122     TypeModifier(const TypeModifier &typmod);
00123 
00129     TypeModifier &operator=(const TypeModifier &typmod);
00130 
00134     ~TypeModifier();
00135   };
00136 
00140   class Attribute {
00141 
00142     // ----------------------------------------------------------------------
00143     // Attribute Interface
00144     // ----------------------------------------------------------------------
00145   public:
00146     enum {
00147       defaultSize  = -1,
00148       directAccess = -2,
00149       wholeData = -3
00150     };
00151 
00156     const char *getName() const;
00157 
00162     CardinalityConstraint *getCardinalityConstraint() const;
00163 
00175     Status getIdx(Database *db, int ind, int& maxind, Size &sz,
00176                   const AttrIdxContext &idx_ctx, Index *&idx,
00177                   eyedbsm::Idx *&se_idx) const;
00178 
00183     unsigned int getMagOrder() const {return magorder;}
00184 
00190     Status setCardinalityConstraint(CardinalityConstraint *card);
00191 
00196     virtual Bool isVarDim() const;
00197 
00202     virtual Bool isIndirect() const;
00203 
00208     virtual Bool isNative() const {return False;}
00209 
00214     virtual Bool isString() const {return IDBBOOL(is_string);}
00215 
00220     virtual Bool isBasicOrEnum() const {return IDBBOOL(is_basic_enum);}
00221 
00226     virtual Status check() const;
00227 
00236     virtual Status compile_perst(const AgregatClass *ma, int *offset, int *size, int *inisize);
00237 
00245     virtual Status compile_volat(const AgregatClass *ma, int *offset, int *size);
00246 
00253     virtual Status getSize(Data idr, Size& size) const;
00254 
00261     virtual Status getSize(const Object *agr, Size& size) const;
00262 
00270     virtual Status getSize(Database *db, const Oid *data_oid, Size& size) const;
00271 
00278     virtual Status setSize(Object *agr, Size size) const;
00279 
00289     virtual Status setOid(Object *agr, const Oid *oid, int=1, int=0, Bool=True) const;
00290 
00299     virtual Status getOid(const Object *agr, Oid *oid, int=1, int=0) const;
00300 
00310     virtual Status setValue(Object *agr, Data data, int nb, int from, Bool check_class=True) const;
00311 
00321     virtual Status getValue(const Object *agr, Data *data, int nb, int from, Bool *isnull = 0) const;
00322 
00335     virtual Status getTValue(Database *db, const Oid &objoid,
00336                              Data *data, int nb = 1, int from = 0,
00337                              Bool *isnull = 0, Size *rnb = 0, Offset poffset= 0) const;
00338 
00344     void *setUserData(void *nuser_data);
00345 
00350     void *getUserData(void) {return user_data;}
00351 
00356     const void *getUserData(void) const {return user_data;}
00357 
00358     // deprecated
00359     virtual Status getVal(Database *, const Oid *, Data,
00360                           int, int, int, Bool * = 0) const;
00361 
00362     /*
00363       virtual Status getField(Database *, const Oid *, Oid *, int *,
00364       int, int) const;
00365     */
00366 
00376     virtual Status update(Database *db,
00377                           const Oid& cloid,
00378                           const Oid& objoid,
00379                           Object *agr,
00380                           AttrIdxContext &idx_ctx) const;
00381 
00392     virtual Status realize(Database *db, Object *agr,
00393                            const Oid& cloid,
00394                            const Oid& objoid,
00395                            AttrIdxContext &idx_ctx,
00396                            const RecMode *rcm) const; 
00397 
00408     virtual Status remove(Database *db, Object *agr,
00409                           const Oid& cloid,
00410                           const Oid& objoid,
00411                           AttrIdxContext &idx_ctx,
00412                           const RecMode *rcm) const; 
00413 
00425     virtual Status load(Database *db,
00426                         Object *agr,
00427                         const Oid &cloid,
00428                         LockMode lockmode,
00429                         AttrIdxContext &idx_ctx,
00430                         const RecMode *rcm, 
00431                         Bool force = False) const; 
00432 
00442     virtual Status trace(const Object *agr, FILE *fd, int *indent, unsigned int flags,
00443                          const RecMode *rcm) const;
00444 
00449     const TypeModifier &getTypeModifier() const;
00450 
00459     Attribute(Class *tp, const char *s, Bool isref=False,
00460               int ndims=0, int *dims=0);
00461 
00468     Attribute(Class *tp, const char *s, int dim);
00469 
00478     Attribute(const Attribute*attr, const Class *cls, const Class *class_owner,
00479               const Class *dyn_class_owner, int n);
00480 
00488     void getPersistentIDR(Offset& p_off, Size& item_p_sz, Size& p_sz, Size& item_ini_sz) const;
00489 
00494     Offset getPersistentIDR() const {return idr_poff;}
00495 
00502     void getVolatileIDR(Offset& v_off, Size& item_v_sz, Size& v_sz) const;
00503 
00508     const Class *getClass() const {return cls;}
00509 
00514     const Class *getClassOwner() const {return class_owner;}
00515 
00520     const Class *getDynClassOwner() const {return dyn_class_owner;}
00521 
00526     int getNum() const {return num;}
00527 
00533     virtual Attribute *clone(Database *db = 0) const;
00534 
00539     virtual Bool isFlat() const {return False;}
00540 
00549     Status codeIDR(Database *db, Data* data, Offset* offset, Size* alloc_size);
00550 
00557     Status decodeIDR(Data data, Offset *offset);
00558 
00565     Bool compare(Database *db, const Attribute *item) const;
00566 
00572     Status setInverse(const Attribute *);
00573 
00580     Status setInverse(const char *, const char *);
00581 
00589     void getInverse(const char **, const char **, const Attribute **) const;
00590 
00595     Bool hasInverse() const;
00596 
00602     virtual Status getDefaultDataspace(const Dataspace *&dataspace) const;
00603 
00609     virtual Status setDefaultDataspace(const Dataspace *dataspace);
00610 
00616     virtual Status getLocations(ObjectLocationArray &);
00617 
00623     virtual Status move(const Dataspace *dataspace);
00624 
00625     // BE
00626     static unsigned char idxNull, idxNotNull;
00627 
00636     Status indexPrologue(Database *db, const AttrIdxContext &idx_ctx,
00637                          Index *&idx, Bool create);
00638 
00646     Status createDeferredIndex_realize(Database *db,
00647                                        const AttrIdxContext &idx_ctx,
00648                                        Index *idx);
00649 
00656     Status destroyIndex(Database *db, Index *idx) const;
00657 
00665     static Status getIndex(Database *db, const char *attrpath,
00666                            Index *&idx);
00667 
00675     static Status getUniqueConstraint(Database *db, const char *attrpath,
00676                                       UniqueConstraint *&unique);
00677 
00685     static Status getNotNullConstraint(Database *db, const char *attrpath,
00686                                        NotNullConstraint *&notnull);
00687 
00695     static Status getCollAttrImpl(Database *db, const char *attrpath,
00696                                   CollAttrImpl *&collimpl);
00697 
00704     static Status updateIndexEntries(Database *db,
00705                                      AttrIdxContext &idx_ctx);
00706 
00720     Status createIndexEntry_realize(Database *db, Data idr, const Oid *oid,
00721                                     const Oid *cloid, int offset, Bool novd,
00722                                     AttrIdxContext &idx_ctx,
00723                                     int count = 0, int size = -1);
00724 
00738     Status updateIndexEntry_realize(Database *db, Data idr, const Oid *oid,
00739                                     const Oid *cloid, int offset, Bool novd,
00740                                     const Oid *data_oid,
00741                                     AttrIdxContext &idx_ctx,
00742                                     int count = 0);
00743 
00757     Status removeIndexEntry_realize(Database *db, Data idr, const Oid *oid,
00758                                     const Oid *cloid, int offset, Bool novd,
00759                                     const Oid *data_oid,
00760                                     AttrIdxContext &idx_ctx,
00761                                     int count = 0);
00762   
00777     Status createIndexEntry(Database *db, Data pdata, const Oid *oid,
00778                             const Oid *cloid, int offset, int count, int,
00779                             Size, Bool,
00780                             AttrIdxContext &idx_ctx);
00781   
00796     Status updateIndexEntry(Database *db, Data pdata, const Oid *oid,
00797                             const Oid *cloid, int offset, const Oid *data_oid, int count,
00798                             Size varsize, Bool novd,
00799                             AttrIdxContext &idx_ctx);
00800 
00815     Status removeIndexEntry(Database *db, Data pdata, const Oid *oid,
00816                             const Oid *cloid, int offset, const Oid *data_oid, int count,
00817                             Size varsize, Bool novd,
00818                             AttrIdxContext &idx_ctx);
00819 
00835     Status sizesCompute(Database *db, const char fmt_error[],
00836                         const Oid *data_oid, int &offset,
00837                         Size varsize, Bool novd, int &sz,
00838                         int inisize, int &oinisize,
00839                         Bool &skipRemove, Bool &skipInsert);
00840 
00848     virtual Status createInverse_realize(Database *db, Data pdata, const Oid *oid) const;
00849 
00857     virtual Status updateInverse_realize(Database *db, Data pdata, const Oid *oid) const;
00858 
00866     virtual Status removeInverse_realize(Database *db, Data pdata, const Oid *oid) const;
00867 
00868 #ifdef GBX_NEW_CYCLE
00869     virtual void decrRefCountPropag(Object *, int) const;
00870 #endif
00871 
00877     virtual void garbage(Object *, int) const;
00878 
00885     Status addComponent(Database *db, AttributeComponent *comp) const;
00886 
00893     Status rmvComponent(Database *db, AttributeComponent *comp) const;
00894 
00901     static Bool isNull(Data inidata, const TypeModifier *tmod);
00902 
00910     static Bool isNull(Data inidata, int nb, int from);
00911 
00922     static Status checkAttrPath(Schema *m, const Class *&rcls,
00923                                 const Attribute *&attr,
00924                                 const char *attrpath,
00925                                 AttrIdxContext * idx_ctx = 0,
00926                                 Bool just_check_attr = False);
00927 
00931     virtual ~Attribute();
00932 
00933     static int composedMode;
00934 
00935     // ----------------------------------------------------------------------
00936     // Attribute Protected Part
00937     // ---------------------------------------------------------------------- 
00938   protected:
00939     const Dataspace *dataspace;
00940     short dspid;
00941 
00942     void setItem(Class *, const char *, Bool isRef,
00943                  int ndims, int *dims,
00944                  char _is_basic_enum = -1,
00945                  char _is_string = -1);
00946 
00947     void _setCSDROffset(Offset, Size);
00948     Status checkTypes(Data, Size, int ) const;
00949     virtual Status checkRange(int, int&) const;
00950     virtual Status checkVarRange(const Object *, int, int&, Size*) const;
00951     virtual Status checkVarRange(int from, int nb, Size size) const;
00952     Status setValue(Object *, Data, Data, Size, Size,
00953                     int, int, Data, Bool, Data = 0, Bool = True) const;
00954 
00955     Status getValue(Database *, Data, Data*, Size, int, int,
00956                     Data, Bool *) const;
00957 
00958     Attribute(Database *, Data, Offset *, const Class *, int);
00959     Offset endoff;
00960 
00961     unsigned int magorder;
00962 
00963     Oid attr_comp_set_oid;
00964     AttributeComponentSet *attr_comp_set;
00965 
00966     // C++ generation methods
00967     virtual Status
00968     generateCollInsertClassMethod_C(Class *,
00969                                     GenContext *,
00970                                     const GenCodeHints &hints,
00971                                     Bool);
00972 
00973     virtual Status
00974     generateCollSuppressClassMethod_C(Class *,
00975                                       GenContext *,
00976                                       const GenCodeHints &hints,
00977                                       Bool);
00978     virtual Status
00979     generateCollRealizeClassMethod_C(Class *,
00980                                      GenContext *,
00981                                      const GenCodeHints &hints,
00982                                      Bool,
00983                                      int acctype);
00984 
00985     virtual Status
00986     generateCode_C(Class*, const GenCodeHints &,
00987                    GenContext *, GenContext *);
00988     virtual Status generateClassDesc_C(GenContext *);
00989     virtual Status generateBody_C(Class *, GenContext *,
00990                                   const GenCodeHints &hints);
00991     virtual Status generateGetMethod_C(Class *, GenContext *,
00992                                        Bool isoid,
00993                                        const GenCodeHints &hints,
00994                                        const char *_const);
00995     virtual Status generateCollGetMethod_C(Class *, GenContext *,
00996                                            Bool isoid,
00997                                            const GenCodeHints &hints,
00998                                            const char *_const);
00999     virtual Status generateSetMethod_C(Class *, GenContext *,
01000                                        const GenCodeHints &hints);
01001 
01002     virtual Status generateSetMethod_C(Class *, GenContext *,
01003                                        Bool,
01004                                        const GenCodeHints &hints);
01005 
01006     virtual void genAttrCacheDecl(GenContext *ctx);
01007 
01008     virtual void genAttrCacheEmpty(GenContext *ctx);
01009 
01010     virtual void genAttrCacheGarbage(GenContext *ctx);
01011 
01012     virtual void genAttrCacheGetPrologue(GenContext *ctx, int optype,
01013                                          Bool is_string = False);
01014 
01015     virtual void genAttrCacheGetEpilogue(GenContext *ctx, int optype,
01016                                          Bool is_string = False);
01017 
01018     virtual void genAttrCacheSetPrologue(GenContext *ctx, int optype,
01019                                          Bool is_string = False);
01020 
01021     virtual void genAttrCacheSetEpilogue(GenContext *ctx, int optype,
01022                                          Bool is_string = False);
01023 
01024     // Java generation methods
01025 
01026     virtual Status generateCollGetMethod_Java(Class *own,
01027                                               GenContext *ctx,
01028                                               Bool isoid,
01029                                               const GenCodeHints &hints,
01030                                               const char *_const);
01031 
01032     virtual Status generateCollInsertClassMethod_Java(Class *,
01033                                                       GenContext *,
01034                                                       const GenCodeHints &,
01035                                                       Bool);
01036     virtual Status
01037     generateCollSuppressClassMethod_Java(Class *,
01038                                          GenContext *,
01039                                          const GenCodeHints &,
01040                                          Bool);
01041     virtual Status
01042     generateCollRealizeClassMethod_Java(Class *,
01043                                         GenContext *,
01044                                         const GenCodeHints &hints,
01045                                         Bool,
01046                                         int acctype);
01047     virtual Status generateCode_Java(Class*,
01048                                      GenContext *,
01049                                      const GenCodeHints &,
01050                                      const char *);
01051     virtual Status generateClassDesc_Java(GenContext *);
01052     virtual Status generateBody_Java(Class *, GenContext *,
01053                                      const GenCodeHints &,
01054                                      const char *prefix);
01055     virtual Status generateGetMethod_Java(Class *, GenContext *,
01056                                           Bool isoid,
01057                                           const GenCodeHints &hints,
01058                                           const char *, const char *);
01059     virtual Status generateSetMethod_Java(Class *, GenContext *,
01060                                           Bool,
01061                                           const GenCodeHints &);
01062 
01063     virtual Status generateSetMethod_Java(Class *, GenContext *,
01064                                           const GenCodeHints &);
01065 
01066 
01067     virtual Status copy(Object*, Bool) const;
01068     Status incrRefCount(Object *, Data, int) const;
01069     void manageCycle(Object *, Data, int, gbxCycleContext &r) const;
01070     void garbage(Data, int) const;
01071 #ifdef GBX_NEW_CYCLE
01072     void decrRefCountPropag(Data, int) const;
01073 #endif
01074     Status add(Database *db, ClassConversion *conv,
01075                Data in_idr, Size in_size) const;
01076     const char *name;
01077     eyedblib::int16 num;
01078     eyedblib::int16 code;
01079     const Class *cls;
01080     const Class *class_owner;
01081     const Class *dyn_class_owner;
01082     TypeModifier typmod;
01083 
01084     char is_basic_enum;
01085     char is_string;
01086 
01087     // IDR
01088     // persistent
01089     Offset idr_poff;
01090     Size idr_item_psize;
01091     Size idr_psize;
01092     Offset idr_inisize;
01093 
01094     // volatile
01095     Offset idr_voff;
01096     Size idr_item_vsize;
01097     Size idr_vsize;
01098 
01099     Oid oid_cl;
01100     Oid oid_cl_own;
01101     virtual void getVarDimOid(const Object *, Oid *) const;
01102     virtual int iniCompute(const Database *, int, Data &, Data&) const;
01103  
01104     CardinalityConstraint *card;
01105 
01106     void setCollHints(Object *o, const Oid& oid,
01107                       CardinalityConstraint *card_to_set) const;
01108     Status setCollImpl(Database *db, Object *o,
01109                        const AttrIdxContext &idx_ctx) const;
01110     Status cardManage(Database *, Object *, int) const;
01111 
01112     //Status inverseSet(Object *, const Oid&) const;
01113     Status inverseManage(Database *, Object *, int) const;
01114     Status inverseManage(Database *, Object *, Object *) const;
01115 
01116     // ----------------------------------------------------------------------
01117     // Attribute Private Part
01118     // ----------------------------------------------------------------------
01119   private:
01120     friend class AgregatClass;
01121     friend class Agregat;
01122     friend class Class;
01123     void *user_data;
01124 
01125     friend Status
01126     agregatClassLoad(Database *, const Oid *, Object **,
01127                      const RecMode *, const ObjectHeader *);
01128     friend Status
01129     agregatLoad(Database *, const Oid *, Object **,
01130                 const RecMode *, const ObjectHeader *);
01131 
01132     Bool indexPrologue(Database *db, Data _idr, Bool novd,
01133                        int &count, Data &pdata, Size &varsize,
01134                        Bool create);
01135 
01136     Status getClassOid(Database *db, const Class *cls,
01137                        const Oid &oidcls, Oid &oid);
01138     Status getAttrComponents(Database *db, const Class *,
01139                              LinkedList &);
01140     void codeClassOid(Data, Offset *);
01141     virtual void newObjRealize(Object *) const;
01142     virtual int getBound(Database *, Data);
01143     virtual void getData(const Database *, Data, Data&, Data&) const;
01144     virtual void getData(const Object *, Data&, Data&) const;
01145     virtual void getVarDimOid(Data, Oid *) const;
01146     ClassComponent *getComp(Class::CompIdx idx,
01147                             Bool (*pred)(const ClassComponent *,
01148                                          void *),
01149                             void *client_data) const;
01150 
01151     virtual void manageCycle(Database *db, Object *o, gbxCycleContext &r) const;
01152 
01153     Status loadComponentSet(Database *db, Bool create) const;
01154     static Status getAttrComp(Database *db, const char *clsname,
01155                               const char *attrpath, Object *&);
01156 
01157   protected:
01158     struct invSpec {
01159       Oid oid_cl;
01160       eyedblib::int16 num;
01161       const Attribute *item;
01162       char *clsname, *fname;
01163 
01164       invSpec() {
01165         oid_cl.invalidate();
01166         num = 0;
01167         item = 0;
01168         clsname = fname = 0;
01169       }
01170 
01171       invSpec(const invSpec &inv) {
01172         *this = inv;
01173       }
01174 
01175       invSpec& operator=(const invSpec &inv) {
01176         oid_cl = inv.oid_cl;
01177         num = inv.num;
01178         item = inv.item;
01179         clsname = (inv.clsname ? strdup(inv.clsname) : 0);
01180         fname = (inv.fname ? strdup(inv.fname) : 0);
01181         return *this;
01182       }
01183 
01184       ~invSpec() {
01185         free(clsname);
01186         free(fname);
01187       }
01188     } inv_spec;
01189 
01190     struct InvCtx {
01191       Oid oid;
01192       Data idr;
01193 
01194       InvCtx() : idr(0) { }
01195       InvCtx(const Oid &_oid, Data _idr) : oid(_oid), idr(_idr) { }
01196     };
01197 
01198     Status constraintPrologue(Database *db,
01199                               const AttrIdxContext &idx_ctx,
01200                               Bool &notnull_comp, Bool &notnull,
01201                               Bool &unique_comp, Bool &unique) const;
01202     Status collimplPrologue(Database *db,
01203                             const AttrIdxContext &idx_ctx,
01204                             CollAttrImpl *&) const;
01205 
01206     // ----------------------------------------------------------------------
01207     // Attribute Restricted Access (conceptually private)
01208     // ----------------------------------------------------------------------
01209   public: 
01210     enum InvObjOp {
01211       invObjCreate = 1,
01212       invObjUpdate,
01213       invObjRemove
01214     };
01215 
01216     Status inverse_coll_perform(Database *, InvObjOp,
01217                                 const Oid &, const Oid &) const;
01218 
01219     void setNum(int _num) {num = _num;}
01220     void revert(Bool);
01221     static Status createEntries(Database *db, const Oid &oid,
01222                                 Object *o,
01223                                 AttrIdxContext &,
01224                                 Attribute *attrs[],
01225                                 int depth, int last,
01226                                 unsigned char entry[], Index *);
01227     static Status createEntries_realize(Database *db,
01228                                         Attribute *attr,
01229                                         const Oid &oid,
01230                                         Object *o,
01231                                         AttrIdxContext &idx_ctx,
01232                                         unsigned char entry[],
01233                                         Index *idx);
01234     Status completeInverse(Schema *);
01235     void setMagOrder(unsigned int _magorder) {magorder = _magorder;}
01236     Status updateIndexForInverse(Database *db, const Oid &obj_oid,
01237                                  const Oid &new_oid) const;
01238     static const char *template_name;
01239     Oid getAttrCompSetOid() const {return attr_comp_set_oid;}
01240     void setAttrCompSetOid(Oid _attr_comp_set_oid) {
01241       attr_comp_set_oid = _attr_comp_set_oid;
01242     }
01243 
01244     Bool compare(Database *, const Attribute *,
01245                  Bool compClassOwner,
01246                  Bool compNum,
01247                  Bool compName,
01248                  Bool inDepth) const;
01249 
01250     static Status openMultiIndexRealize(Database *db, Index *);
01251 
01252     const char *dumpData(Data);
01253     static const char *log_item_entry_fmt;
01254     static const char *log_comp_entry_fmt;
01255     virtual Status convert(Database *db, ClassConversion *,
01256                            Data in_idr, Size in_size) const;
01257 
01258     Status clean(Database *db);
01259     virtual void reportAttrCompSetOid(Offset *offset, Data idr) const;
01260 
01261     void pre_release();
01262 
01263   private:
01264     Status clean_realize(Schema *, const Class *&);
01265     Status createComponentSet(Database *);
01266 
01267     Status hasIndex(Database *db, bool &has_index, std::string &idx_str) const;
01268 
01269     void completeInverseItem(Schema *);
01270     Status completeInverse(Database *);
01271     Status checkInverse(const Attribute * = 0) const;
01272 
01273     Status inverse_1_1(Database *, InvObjOp,
01274                        const Attribute *, const Oid &,
01275                        const Oid &,
01276                        const InvCtx &) const;
01277     Status inverse_1_N(Database *, InvObjOp,
01278                        const Attribute *, const Oid &,
01279                        const Oid &,
01280                        const InvCtx &) const;
01281     Status inverse_N_1(Database *,  InvObjOp,
01282                        const Attribute *, const Oid &,
01283                        const Oid &,
01284                        const InvCtx &) const;
01285     Status inverse_N_N(Database *,  InvObjOp,
01286                        const Attribute *, const Oid &,
01287                        const Oid &,
01288                        const InvCtx &) const;
01289     Status inverse_update(Database *,
01290                           const Attribute *, const Oid &,
01291                           const Oid &) const;
01292     Status inverse_realize(Database *, InvObjOp, Data, 
01293                            const Oid &) const;
01294 
01295     Status inverse_get_collection(Database *db,
01296                                   const Oid &inv_obj_oid,
01297                                   Collection*& coll) const;
01298 
01299     Oid inverse_get_inv_obj_oid(Data) const;
01300 
01301     static Status inverse_read_oid(Database *db, const Attribute *item,
01302                                    const Oid &obj_oid,
01303                                    Oid &old_obj_oid);
01304     static Status inverse_write_oid(Database *db, const Attribute *item,
01305                                     const Oid &obj_oid,
01306                                     const Oid &new_obj_oid,
01307                                     const InvCtx &);
01308 
01309     Status inverse_create_collection(Database *db,
01310                                      const Attribute *inv_item,
01311                                      const Oid &obj_oid,
01312                                      Bool is_N_N,
01313                                      const Oid &master_oid,
01314                                      Collection *&coll) const;
01315 
01316     Status inverse_get_inv_collection(Database *db,
01317                                       const Attribute *inv_item,
01318                                       const Oid &inv_obj_oid, 
01319                                       const Oid &obj_oid, 
01320                                       Bool is_N_N,
01321                                       Collection *&coll) const;
01322     Status inverse_coll_perform(Database *db, InvObjOp op,
01323                                 const Attribute *inv_item,
01324                                 Collection *coll,
01325                                 const Oid &obj_oid) const;
01326 
01327     Status inverse_coll_perform_N_1(Database *, InvObjOp,
01328                                     const Oid &, const Oid &) const;
01329 
01330     Status inverse_coll_perform_N_N(Database *, InvObjOp,
01331                                     const Oid &, const Oid &) const;
01332 
01333     Status makeClassSequence(Database *db, Index *idx,
01334                              ClassSequence& seq);
01335 
01336     Status realizeIndexes(ClassSequence& seq, int, Bool);
01337 
01338 
01339     void directFind(Class *rootcl, Class *cl, ClassSeqItem *clitem,
01340                     ClassSequence& seq, AttrStack&);
01341 
01342     void makeClassSequenceRealize(Class *cl, ClassSequence& seq);
01343   };
01344 
01345   extern
01346   Attribute *makeAttribute(const Attribute *, const Class *,
01347                            const Class *, const Class *, int);
01348   extern
01349   Attribute *makeAttribute(Database *db, Data, Offset *,
01350                            const Class *, int);
01351 
01356 }
01357 
01358 #endif

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