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 #ifndef _EYEDB_COLLECTION_H
00026 #define _EYEDB_COLLECTION_H
00027
00028 #define USE_VALUE_CACHE
00029
00030 namespace eyedb {
00031
00037 class ValueCache;
00038 class CollectionPeer;
00039 class CardinalityDescription;
00040 class CollImpl;
00041
00045 class Collection : public Instance {
00046
00047
00048
00049
00050 public:
00051
00052 typedef eyedblib::uint32 ItemId;
00053
00058 int getCount() const;
00059
00064 Bool isEmpty() const;
00065
00070 const char *getName() const {return name;}
00071
00076 void setName(const char *s);
00077
00082 Status getStatus() const;
00083
00084 static const Size defaultSize;
00085
00092 virtual Status insert(const Value &v, Bool noDup = False);
00093
00100 virtual Status suppress(const Value &item_value, Bool checkFirst = False);
00101
00106 Status empty();
00107
00108
00116 virtual Status isIn(const Value &value, Bool &found,
00117 Collection::ItemId *where = 0) const;
00118
00124 Status getElements(OidArray &oid_array) const;
00125
00132 Status getElements(ObjectPtrVector &obj_vect,
00133 const RecMode *recmode = RecMode::NoRecurs) const;
00134
00141 Status getElements(ObjectArray &obj_array,
00142 const RecMode *recmode = RecMode::NoRecurs) const;
00143
00150 Status getElements(ValueArray &value_array, Bool index = False) const;
00151
00152
00158 Status realize(const RecMode *recmod = RecMode::NoRecurs);
00159
00165 Status remove(const RecMode *recmode = RecMode::NoRecurs);
00166
00174 Status trace(FILE *fd = stdout, unsigned int flags = 0,
00175 const RecMode *recmode = RecMode::FullRecurs) const;
00176
00181 void setImplementation(const CollImpl *collimpl);
00182
00189 Status getImplementation(CollImpl *&collimpl, Bool remote = False) const;
00190
00199 Status getImplStats(std::string &xstats, Bool dspImpl = True,
00200 Bool full = False, const char *indent = "");
00201
00207 Status getImplStats(IndexStats *&stats);
00208
00218 Status simulate(const CollImpl &collimpl, std::string &xstats,
00219 Bool dspImpl = True, Bool full = False,
00220 const char *indent = "");
00221
00228 Status simulate(const CollImpl &collimpl, IndexStats *&stats);
00229
00235 virtual Status setDatabase(Database *mdb);
00236
00240 virtual void garbage();
00241
00246 void setCardinalityConstraint(Object *card);
00247
00252 CardinalityDescription *getCardinalityConstraint() const;
00253
00258 Status checkCardinality() const;
00259
00260 Status realizeCardinality();
00261
00266 int getBottom() const;
00267
00272 int getTop() const;
00273
00278 virtual Collection *asCollection() {return this;}
00279
00284 virtual const Collection *asCollection() const {return this;}
00285
00291 Status getDefaultDataspace(const Dataspace *&dataspace) const;
00292
00298 Status setDefaultDataspace(const Dataspace *dataspace);
00299
00305 Status moveElements(const Dataspace *dataspace);
00306
00307 Status getElementLocations(ObjectLocationArray &);
00308
00309 Bool isLiteral() const {return is_literal;}
00310 Bool isPureLiteral() const {return is_pure_literal;}
00311 Bool isLiteralObject() const;
00312
00313 Status setLiteralObject(bool force);
00314
00315 virtual ~Collection();
00316
00317 enum State {
00318 coherent = 1,
00319 added,
00320 removed,
00321 modified
00322 };
00323
00324
00325
00326
00327 protected:
00328 eyedblib::int32 type;
00329 char *name;
00330 Bool ordered;
00331 Bool allow_dup;
00332 Bool string_coll;
00333 int bottom, top;
00334 Bool implModified;
00335 Bool nameModified;
00336
00337 Class *coll_class;
00338 Bool isref;
00339 eyedblib::int16 dim;
00340 eyedblib::int16 item_size;
00341 Oid cl_oid;
00342
00343 Bool locked;
00344 CollImpl *collimpl;
00345 Oid inv_oid;
00346 eyedblib::int16 inv_item;
00347
00348 Bool is_literal;
00349 Bool is_pure_literal;
00350 Oid literal_oid;
00351 Size idx_data_size;
00352 Data idx_data;
00353
00354 CardinalityDescription *card;
00355 int card_bottom, card_bottom_excl, card_top, card_top_excl;
00356 Oid card_oid;
00357
00358 Oid idx1_oid, idx2_oid;
00359 eyedbsm::Idx *idx1, *idx2;
00360 int p_items_cnt;
00361 int v_items_cnt;
00362 ValueCache *cache;
00363 Bool is_complete;
00364 void create_cache();
00365
00366 struct ReadCache {
00367 ObjectArray *obj_arr;
00368 OidArray *oid_arr;
00369 ValueArray *val_arr;
00370 } read_cache;
00371
00372 Status status;
00373 Data make_data(Data, Size, Bool swap = False) const;
00374 void decode(Data) const;
00375
00376 Collection(const char *, Class * = NULL, Bool = True,
00377 const CollImpl * = 0);
00378 Collection(const char *, Class *, int, const CollImpl * = 0);
00379
00380 Status check(const Oid&, const Class *, Error) const;
00381 Status check(const Oid&, Error) const;
00382 Status check(const Object*, Error) const;
00383 Status check(Data, Size, Error) const;
00384 Status check(const Value &, Error) const;
00385
00386 Status trace_realize(FILE*, int, unsigned int, const RecMode *) const;
00387 Status trace_contents_realize(FILE*, int, unsigned int, const RecMode *) const;
00388 Status getIdxOid(Oid &idx1oid, Oid &idx2oid) const;
00389 void completeImplStats(IndexStats *stats) const;
00390
00391 void isStringColl();
00392
00393 Collection(const char *, Class *,
00394 const Oid&, const Oid&, int, int,
00395 int, const CollImpl *,
00396 Object *, Bool, Bool, Data, Size);
00397 void make(const char *, Class *, Bool, const CollImpl *);
00398 void make(const char *, Class *, int, const CollImpl *);
00399 Status getOidElementsRealize();
00400 Status getObjElementsRealize(const RecMode * = RecMode::NoRecurs);
00401 Status getValElementsRealize(Bool index = False);
00402
00403
00404
00405
00406 private:
00407 Collection::State read_cache_state_oid, read_cache_state_object,
00408 read_cache_state_value;
00409 Bool read_cache_state_index;
00410 Bool inverse_valid;
00411 virtual Status cache_compile(Offset &, Size&, unsigned char **, const RecMode *);
00412 void _init(const CollImpl *);
00413 Status init_idr();
00414 virtual const char *getClassName() const = 0;
00415 friend class CollectionPeer;
00416
00417 Status codeCollImpl(Data &, Offset &, Size &);
00418 Status setValue(Data);
00419 Status getValue(Data*) const;
00420 void cardCode(Data &, Offset &offset, Size &alloc_size);
00421 Status failedCardinality() const;
00422 Status create();
00423 Status update();
00424 Status updateLiteral();
00425 Status loadLiteral();
00426
00427 enum {
00428 CollObject = 0,
00429 CollPureLiteral = 1,
00430 CollLiteral = 2
00431 };
00432 char codeLiteral() const;
00433 Status literalMake(Collection *o);
00434 std::string getStringType() const;
00435 Offset inv_oid_offset;
00436
00437
00438
00439
00440 public:
00441 Collection(const Collection &);
00442 Collection& operator=(const Collection &);
00443 static Object *cardDecode(Database *, Data, Offset &);
00444 Status realizeInverse(const Oid&, int);
00445 void setInverse(const Oid&, int);
00446 void invalidateInverse() {inverse_valid = False;}
00447 void validateInverse() {inverse_valid = True;}
00448 void unvalidReadCache();
00449 void emptyReadCache();
00450 void setLiteral(Bool _is_literal);
00451 void setPureLiteral(Bool _is_pure_literal);
00452 Oid getLiteralOid() const {return literal_oid;}
00453 void setLiteralOid(Oid _literal_oid) {literal_oid = _literal_oid;}
00454 Oid& getOidC() {
00455 return is_literal ? literal_oid : oid;
00456 }
00457 const Oid& getOidC() const {
00458 return is_literal ? literal_oid : oid;
00459 }
00460
00461 static void decodeLiteral(char c, Bool &is_literal, Bool &is_pure_literal);
00462 Bool isPartiallyStored() const;
00463 virtual Status setMasterObject(Object *_master_object);
00464 virtual Status releaseMasterObject();
00465
00466 void makeValue(Value &);
00467
00468 Status create_realize(const RecMode *);
00469 Status update_realize(const RecMode *);
00470 Status realizePerform(const Oid& cloid,
00471 const Oid& objoid,
00472 AttrIdxContext &idx_ctx,
00473 const RecMode *);
00474 Status loadPerform(const Oid&,
00475 LockMode lockmode,
00476 AttrIdxContext &idx_ctx,
00477 const RecMode* = RecMode::NoRecurs);
00478 Status removePerform(const Oid& cloid,
00479 const Oid& objoid,
00480 AttrIdxContext &idx_ctx,
00481 const RecMode *);
00482 Status loadDeferred(LockMode lockmode = DefaultLock,
00483 const RecMode * = RecMode::NoRecurs);
00484 Status postRealizePerform(const Oid& cloid,
00485 const Oid& objoid,
00486 AttrIdxContext &idx_ctx,
00487 Bool&,
00488 const RecMode *rcm);
00489 virtual Status insert_p(const Oid &item_oid, Bool noDup = False) = 0;
00490 virtual Status insert_p(const Object *o, Bool noDup = False) = 0;
00491 virtual Status insert_p(Data val, Bool noDup = False,
00492 Size size = defaultSize) = 0;
00493 virtual Status suppress_p(const Oid &item_oid, Bool checkFirst = False);
00494 virtual Status suppress_p(const Object *item_o, Bool checkFirst = False);
00495 virtual Status suppress_p(Data data, Bool checkFirst = False,
00496 Size size = defaultSize);
00497 virtual Status isIn_p(const Oid &item_oid, Bool &found,
00498 Collection::ItemId *where = 0) const;
00499 virtual Status isIn_p(const Object *item_o, Bool &found,
00500 Collection::ItemId *where = 0) const;
00501 Status isIn_p(Data data, Bool &found, Size size = defaultSize,
00502 Collection::ItemId *where = 0) const;
00503
00504 };
00505
00506 class CollectionPtr : public InstancePtr {
00507
00508 public:
00509 CollectionPtr(Collection *o = 0) : InstancePtr(o) { }
00510
00511 Collection *getCollection() {return dynamic_cast<Collection *>(o);}
00512 const Collection *getCollection() const {return dynamic_cast<Collection *>(o);}
00513
00514 Collection *operator->() {return dynamic_cast<Collection *>(o);}
00515 const Collection *operator->() const {return dynamic_cast<Collection *>(o);}
00516 };
00517
00518 typedef std::vector<CollectionPtr> CollectionPtrVector;
00519
00524 }
00525
00526 #endif