ANNA Suite  2020b
Multipurpose development suite for Telco applications
StorageArea.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_dbos_StorageArea_hpp
10 #define anna_dbos_StorageArea_hpp
11 
12 #include <vector>
13 #include <map>
14 #include <list>
15 #include <deque>
16 
17 #include <algorithm>
18 
19 #include <anna/core/mt/Mutex.hpp>
20 #include <anna/config/defines.hpp>
22 
24 
25 #include <anna/dbos/defines.hpp>
27 
28 namespace anna {
29 
30 namespace xml {
31 class Node;
32 }
33 
34 namespace dbms {
35 class Connection;
36 }
37 
38 namespace dbos {
39 
40 class Accesor;
41 class Object;
42 class Creator;
43 class Loader;
44 class Recorder;
45 class Eraser;
46 class Repository;
47 class CrossedLoader;
48 
58 class StorageArea : public Mutex {
59  struct Instance;
60  class Block;
61  class Holes;
62 
63 public:
67  struct AccessMode {
68  enum _v {
88  ReadEver
89  };
90 
91  /*
92  Devuelve el literal correspondiente al codigo recibido.
93  \param v Codigo a traducir a literal.
94  \return el literal correspondiente al codigo recibido.
95  */
96  static const char* asString(const _v v) ;
97  };
98 
103  struct Flag {
104  enum _v {
105  None = 0, Dirty = 1, Incoherent = 2, Empty = 4, HasHole = 8, Ready = 16, InProgress = 32,
106  NoDirty = ~Dirty, NoIncoherent = ~Incoherent, NoEmpty = ~Empty, NoHasHole = ~HasHole, NoReady = ~Ready, Done = ~InProgress
107  };
108  };
109 
115  struct StandardSize {
116  enum Value {
117  Tiny = 16,
118  Little = 64,
119  Small = 256,
120  Medium = 2048,
121  Large = 8192,
122  Huge = 32768,
123  LargeHuge = 65536,
124  Biggest = 131072
125  };
126  };
127 
133  static const int NoExceptionWhenNotFound = -1;
134 
135  typedef std::vector <Block*> Blocks;
136  typedef std::map <Index, Instance*>::iterator iterator;
137  typedef std::map <Index, Instance*>::const_iterator const_iterator;
142  virtual ~StorageArea();
143 
148  int getErrorCode() const { return a_errorCode; }
149 
150  /*
151  * Devuelve el nombre de la este área de almacenamiento.
152  * \return el nombre de la este área de almacenamiento.
153  */
154  const std::string& getName() const { return a_name; }
155 
176  Object* instance(dbms::Connection& connection, Loader& loader) noexcept(false) {
177  return instance(&connection, loader);
178  }
179 
200  Object* instance(dbms::Connection* connection, Loader& loader) noexcept(false);
201 
224  Object* instance(dbms::Connection& connection, CrossedLoader& crossedLoader, Loader& loader)
225  noexcept(false) {
226  return instance(&connection, crossedLoader, loader);
227  }
228 
251  Object* instance(dbms::Connection* connection, CrossedLoader& crossedLoader, Loader& loader)
252  noexcept(false);
253 
273  Object* instance(Loader& loader) noexcept(false) {
274  return instance(NULL, loader);
275  }
276 
295  Object* create(dbms::Connection& connection, Creator& creator) noexcept(false) {
296  return create(&connection, creator);
297  }
298 
317  Object* create(dbms::Connection* connection, Creator& creator) noexcept(false);
318 
334  Object* create(Creator& creator) noexcept(false) { return create(NULL, creator); }
335 
352  Object* find(Loader& loader) noexcept(false);
353 
365  Object* duplicate(const Object* object) noexcept(false);
366 
377  bool isLoaded(const Loader& loader) noexcept(false);
378 
386  void apply(dbms::Connection& connection, Recorder& recorder) noexcept(false);
387 
397  void apply(dbms::Connection& connection, Eraser& eraser) noexcept(false);
398 
412  void release(Object** object) noexcept(false);
413 
424  void erase(Object** object) noexcept(false);
425 
435  void dirty(Object* object) noexcept(false);
436 
441  void setSizeof(const Size _sizeof) { a_sizeof = _sizeof + sizeof(Instance); }
442 
447  Size getMaxSizeOf() const { return a_maxSize * a_sizeof; }
448 
453  Size getSizeOf() const { return a_directory.size() * a_sizeof; }
454 
459  iterator begin() { return a_directory.begin(); }
460 
465  const_iterator begin() const { return a_directory.begin(); }
466 
471  iterator end() { return a_directory.end(); }
472 
477  const_iterator end() const { return a_directory.end(); }
478 
483  static Object* data(iterator ii) { return ii->second->object; }
484 
489  static const Object* data(const_iterator ii) { return ii->second->object; }
490 
495  std::string asString() const ;
496 
502  xml::Node* asXML(xml::Node* parent) const ;
503 
504 protected:
509  void clear() noexcept(false);
510 
515  static std::string asMemorySize(const Size size) ;
516 
517 private:
518  typedef std::map <Index, Instance*>::value_type value_type;
519 
520  friend class Holes;
521 
522  class Holes {
523  public:
524  struct Mode { enum _v { ReadyToReuse, TimeWait }; };
525 
526  typedef std::list <Instance*> hole_container;
527  typedef hole_container::iterator hole_iterator;
528 
529  Holes() : a_size(0) {;}
530 
531  bool insert(Instance* instance, const Mode::_v mode) ;
532  void erase(Instance* instance) ;
533  Instance* front() { return a_holes.front(); }
534  int size() const { return a_size; }
535  int empty() const { return a_holes.empty(); }
536  void pop_front() { a_holes.pop_front(); a_size --; }
537  void clear() { a_holes.clear(); a_size = 0; }
538 
539  private:
540  hole_container a_holes;
541  int a_size;
542  };
543 
544  //------------------------------------------------------------------------
545  // - object: Puntero a la instancia con el objeto cacheado.
546  // - msHoleTime: Millisecond en el que entra en la lista de huecos.
547  // - copyCounter: Numero de copias del objeto.
548  // - flags: Flags (Dirty, Incoherent, Empty).
549  //------------------------------------------------------------------------
550  friend struct Instance;
551 
552  struct Instance {
553  Object* object;
554  Counter copyCounter;
555  int flags;
556  Holes::hole_iterator holeIterator;
557 
558  Instance() : copyCounter(0), object(NULL), flags(Flag::None) {;}
559  };
560 
561  friend class Block;
562 
563  class Block {
564  public:
565  Block(ObjectAllocator objectAllocator, const Size maxSize);
566  Instance* getInstance() { return (a_size < a_maxSize) ? &a_instances [a_size ++] : NULL; }
567  void reset() { a_size = 0; }
568 
569  private:
570  Instance* a_instances;
571  Size a_maxSize;
572  Size a_size;
573  };
574 
575  const std::string a_name;
576  const Size a_maxSize;
577  ObjectAllocator a_objectAllocator;
578  const AccessMode::_v a_accessMode;
579  int a_errorCode;
580  Size a_sizeof;
581 
582  Blocks a_blocks;
583  std::map <Index, Instance*> a_directory;
584  Holes a_holes;
585  Block* a_currentBlock;
586  int a_indexBlock;
587  Counter a_hit;
588  Counter a_fault;
589  Counter a_doneReuse;
590 
591  /*
592  typedef std::deque <std::pair <DBIndex> inprogress_container;
593  typedef inprogress_container::iterator inprogress_iterator;
594  inprogress_container a_inprogress;
595 
596  inprogress_iterator inprogress_begin () const { return a_inprogress.begin (); }
597  inprogress_iterator inprogress_end () const { return a_inprogress.end (); }
598  static DBIndex index (inprogress_iterator ii) { return *ii; }
599  bool isInProgress (const DBIndex index) const ;
600  */
601 
602  /*
603  * Constructor.
604  * \warning Este método sólo debería usarse desde el método dbos::Repository::allocateStorageArea.
605  */
606  StorageArea(const char* name, const Size maxSize, ObjectAllocator, const AccessMode::_v, const int errorCode);
607  StorageArea(const StorageArea&);
608 
609  Object* reload(dbms::Connection*, Loader&, Instance*) noexcept(false);
610  void checkIncoherence(Instance*) ;
611  bool quickReusing(Instance*) ;
612  void verifyStatus(StorageArea::Instance*, const bool ignoreDirty = false) noexcept(false);
613  Instance* allocate() ;
614  Instance* reuse() ;
615 
616  static Instance* instance(iterator& ii) { return ii->second; }
617  static std::string asString(const Instance*) ;
618 
619  friend class Repository;
620 };
621 
622 }
623 }
624 
625 #endif
Object * instance(dbms::Connection &connection, Loader &loader) noexcept(false)
Definition: StorageArea.hpp:176
iterator end()
Definition: StorageArea.hpp:471
const_iterator end() const
Definition: StorageArea.hpp:477
Definition: StorageArea.hpp:103
Definition: StorageArea.hpp:115
Definition: Connection.hpp:38
Object * create(Creator &creator) noexcept(false)
Definition: StorageArea.hpp:334
_v
Definition: StorageArea.hpp:104
Definition: Node.hpp:56
Object * instance(dbms::Connection &connection, CrossedLoader &crossedLoader, Loader &loader) noexcept(false)
Definition: StorageArea.hpp:224
Definition: Object.hpp:35
const std::string & getName() const
Definition: StorageArea.hpp:154
Size getSizeOf() const
Definition: StorageArea.hpp:453
_v
Definition: StorageArea.hpp:68
unsigned int Counter
Definition: defines.hpp:20
std::vector< Block * > Blocks
Definition: StorageArea.hpp:135
static const Object * data(const_iterator ii)
Definition: StorageArea.hpp:489
Object * create(dbms::Connection &connection, Creator &creator) noexcept(false)
Definition: StorageArea.hpp:295
Definition: Creator.hpp:22
Definition: StorageArea.hpp:73
const_iterator begin() const
Definition: StorageArea.hpp:465
static Object * data(iterator ii)
Definition: StorageArea.hpp:483
Definition: Recorder.hpp:22
Definition: CrossedLoader.hpp:42
Definition: Repository.hpp:39
Value
Definition: StorageArea.hpp:116
unsigned int Size
Definition: defines.hpp:17
Definition: Loader.hpp:28
int getErrorCode() const
Definition: StorageArea.hpp:148
xml::Node Node
Definition: Node.hpp:21
iterator begin()
Definition: StorageArea.hpp:459
Definition: StorageArea.hpp:67
Definition: app.hpp:12
std::map< Index, Instance * >::iterator iterator
Definition: StorageArea.hpp:136
std::map< Index, Instance * >::const_iterator const_iterator
Definition: StorageArea.hpp:137
Definition: Eraser.hpp:24
Definition: Mutex.hpp:41
Definition: StorageArea.hpp:58
_v
Definition: StorageArea.hpp:524
Definition: StorageArea.hpp:524
Size getMaxSizeOf() const
Definition: StorageArea.hpp:447
Object * instance(Loader &loader) noexcept(false)
Definition: StorageArea.hpp:273
void setSizeof(const Size _sizeof)
Definition: StorageArea.hpp:441
Object *(* ObjectAllocator)()
Definition: ObjectAllocator.hpp:18