UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
DbBufStorage.H
Go to the documentation of this file.
1 /* DbBufStorage.H */
2 /* $Id: DbBufStorage.H,v 1.9 2007/02/20 11:30:32 ibadm Exp $ */
3 #ifndef __DbBufStorage_H
4 #define __DbBufStorage_H
5 
6 
7 /***********************************************************************
8  *
9  * Локальная База Данных (версия 4)
10  * Хранение таблицы ЛБД в памяти и операции с ней
11  *
12  ***********************************************************************/
13 
14 #include <mix/wenv.h>
15 #include <mix/trans.h>
16 
17 #include <mix/DynAr.H>
18 #include <mix/IntAr.H>
19 #include <mix/LongAr.H>
20 
21 #include <ldb/DbTableTypes.H>
22 
23 
49 #define DB_CLUSTER_START_VOLUME 20
50 
53 #define DB_CLUSTER_DEFAULT_QUANT 20
54 
58 #define DB_CLUSTER_LIMIT_SIZE (200*1024) /* 200K */
59 
60 
68 {
69 public:
70 
73  DbDataCluster (unsigned nItemSize,
74  DbIndex nStartVolume = DB_CLUSTER_START_VOLUME);
75 
77  virtual ~DbDataCluster ();
78 
80  void* data_item (DbIndex iLocal) const;
81 
85  void add_items (DbIndex nCount, DbIndex* pLocal,
86  Logic* bSequent = NULL);
87 
89  void release_items (DbIndex nCount, const DbIndex* pLocal);
90 
92  Logic is_empty () const;
93 
95  DbIndex empty_slots () const;
96 
98  DbIndex total_slots () const;
99 
101  void print_self () const;
102 
103 private:
104 
106  Logic slot_is_empty (DbIndex iLocal) const;
107 
109  void slot_usage (DbIndex iLocal, Logic bUsed);
110 
112  DynAr arItemData;
113 
115  IntAr arItemAttr;
116 
118  DbIndex nEmptySlots;
119 
120 };
121 
122 
133 {
134 public:/* methods */
135 
137  DbLineEntry ();
138 
140  DbLineEntry& operator= (const DbLineEntry& rLEntry);
141 
145  Logic get_loaded () const;
147  void set_loaded (Logic bFlag);
149  /* @}*/
150 
154  Logic get_changed () const;
156  void set_changed (Logic bFlag);
158  /* @}*/
159 
161  void print_self () const;
162 
163 public:/* data */
164 
167 
169  DbIndex iLocalIndex;
170 
176  unsigned iAccessId;
177 
178 private:/* data */
179 
181  unsigned bLoaded:1;
182  unsigned bChanged:1;
184 };
185 
186 
187 /***********************************************************************
188  * INLINES
189  ***********************************************************************/
190 
194 inline Logic
196 {
197  return bLoaded;
198 }
199 
200 
204 inline void
206 {
207  bLoaded = !!bFlag;
208 }
209 
210 
214 inline Logic
216 {
217  return bChanged;
218 }
219 
220 
224 inline void
226 {
227  bChanged = !!bFlag;
228 }
229 
230 
231 
236 #define AnyAr DbLineEntries
237 #define AnyType DbLineEntry
238 #define AnyFormatSpec "\n\t%d: %s, %s, data location=(%p %u), access id=%u"
239 #define AnyPrintList i, item.get_loaded()? "loaded": "not loaded", \
240  item.get_changed()? "changed": "not changed", \
241  item.pDataClu, item.iLocalIndex, item.iAccessId
242 #define AnyPrintf fprintf(stderr,
243 #include <mix/AnyAr.H>
244 
245 
251 /* Из-за дурацкого компилятора AIX 3.2.5 xlC нужно делать промежуточный тип указателя. */ typedef DbDataCluster* DbDataClusterPtr; #define AnyAr DbDataClusters #define AnyType DbDataClusterPtr #define AnyPrintItem item->print_self() #include <mix/AnyAr.H> /** *********************************************************************** * Массив индексов строк. ***********************************************************************/ typedef UIntAr DbIndexAr; /** *********************************************************************** * Хранилище строк таблицы ЛБД. Не осуществляет собственно операции * загрузки, изменения, сохранения строк в файле. Но обеспечивает * выделение памяти и управления ею. ***********************************************************************/ class DbBufStorage { public: /** Создать пустое хранилище строк длиной nItemSize байт. */ DbBufStorage (unsigned nItemSize); /** Разрушить хранилище. */ virtual ~DbBufStorage (); /** Изменить размер строки на указанный. Это возможно только в случае пустого хранилица. Если хранилище не пустое, то произойден исключительная ситуация с кодом ERROR__MISMATCH. */ void set_item_size (unsigned nItemSize); /** Получить максимально допустимый размер кластера в строках. При этом размер кластера может превышать указанный предел в том случае, если этот кластер создан за одну операцию добавления строк. */ DbIndex max_lines_in_cluster () const; /** Подготовить указанные строки line1..line2 к загрузке в память. */ void preload_lines (DbIndex line1, DbIndex line2); /** Изменить указанные строки line1..line2 в памяти. */ void change_lines (DbIndex line1, DbIndex line2); /** Вставить указанное количество строк начиная с указанной. */ void insert_line (DbIndex line, DbIndex lines_cnt); /** Удалить указанные строки line1..line2 в памяти. */ void remove_lines (DbIndex line1, DbIndex line2); /** Поменять указанные строки line1 и line2 местами. */ void exchange_lines (DbIndex line1, DbIndex line2); /** Очистить хранилище. */ void clean_storage (); /** Возвратить указатель на место хранения указанной строки. */ void* line_pointer (DbIndex line) const; /** Возвратить в массивах arLine, arCnt участки диапазона строк line1..line2, расположенные в памяти последовательно. */ void sequent_lines (DbIndex line1, DbIndex line2, DbIndexAr& arLine, DbIndexAr& arCnt) const; /** Распечатать содержимое хранилища. */ void print_self (); /** Количество строк в таблице. */ DbIndex lines_count () const; /** Атрибуты каждой строки. */ DbLineEntry& operator[] (DbIndex line) const; /** Упорядочить заданную пару индексов строк так, чтобы line[1]>=line[0] */ static void good_line_range (DbIndex line1, DbIndex line2, DbIndex line[2]); private: /** Выделить память для указанных строк. */ void allocate_lines (const DbIndex* pIndeces, unsigned nIndeces); /** Массив ссылок на строки. */ DbLineEntries letable; /** Список кластеров данных. */ DbDataClusters dclist; /** Размер строки. */ unsigned nLineSize; /** Рекомендованное максимальное количество строк в кластере. */ unsigned nLinesLimit; /** Индекс операций доступа. С каждой атомарной операцией увеличивается на 1. */ unsigned nAccessId; /** Служебные массивы индексов, используемые для временного хранения списка строк (глобальных и локальных индексов соответственно). */ DbIndexAr arGlobal, arLocal; }; /*********************************************************************** * INLINES ***********************************************************************/ /** * Количество строк в таблице. */ inline DbIndex DbBufStorage::lines_count () const { return letable.count(); } /** * Атрибуты каждой строки. */ inline DbLineEntry& DbBufStorage::operator[] (DbIndex line) const { return *(DbLineEntry*)letable.item_ptr(line); } #endif /* DbBufStorage.H */
252  промежуточный тип указателя. */
254 
255 #define AnyAr DbDataClusters
256 #define AnyType DbDataClusterPtr
257 #define AnyPrintItem item->print_self()
258 #include <mix/AnyAr.H>
259 
260 
266 
267 
276 {
277 public:
278 
280  DbBufStorage (unsigned nItemSize);
281 
283  virtual ~DbBufStorage ();
284 
288  void set_item_size (unsigned nItemSize);
289 
294  DbIndex max_lines_in_cluster () const;
295 
297  void preload_lines (DbIndex line1, DbIndex line2);
298 
300  void change_lines (DbIndex line1, DbIndex line2);
301 
303  void insert_line (DbIndex line, DbIndex lines_cnt);
304 
306  void remove_lines (DbIndex line1, DbIndex line2);
307 
309  void exchange_lines (DbIndex line1, DbIndex line2);
310 
312  void clean_storage ();
313 
315  void* line_pointer (DbIndex line) const;
316 
319  void sequent_lines (DbIndex line1, DbIndex line2,
320  DbIndexAr& arLine, DbIndexAr& arCnt) const;
321 
323  void print_self ();
324 
326  DbIndex lines_count () const;
327 
329  DbLineEntry& operator[] (DbIndex line) const;
330 
331 
334  static void good_line_range (DbIndex line1, DbIndex line2,
335  DbIndex line[2]);
336 
337 private:
338 
340  void allocate_lines (const DbIndex* pIndeces, unsigned nIndeces);
341 
343  DbLineEntries letable;
344 
346  DbDataClusters dclist;
347 
349  unsigned nLineSize;
350 
352  unsigned nLinesLimit;
353 
356  unsigned nAccessId;
357 
361  DbIndexAr arGlobal, arLocal;
362 
363 };
364 
365 
366 /***********************************************************************
367  * INLINES
368  ***********************************************************************/
369 
373 inline DbIndex
375 {
376  return letable.count();
377 }
378 
379 
383 inline DbLineEntry&
384 DbBufStorage::operator[] (DbIndex line) const
385 {
386  return *(DbLineEntry*)letable.item_ptr(line);
387 }
388 
389 
390 #endif /* DbBufStorage.H */
DbDataCluster * pDataClu
Definition: DbBufStorage.H:166
unsigned iAccessId
Definition: DbBufStorage.H:176
void insert_line(DbIndex line, DbIndex lines_cnt)
void add_items(DbIndex nCount, DbIndex *pLocal, Logic *bSequent=NULL)
DbLineEntry & operator[](DbIndex line) const
Definition: DbBufStorage.H:384
static void good_line_range(DbIndex line1, DbIndex line2, DbIndex line[2])
void sequent_lines(DbIndex line1, DbIndex line2, DbIndexAr &arLine, DbIndexAr &arCnt) const
void print_self() const
Logic get_loaded() const
Definition: DbBufStorage.H:195
void change_lines(DbIndex line1, DbIndex line2)
Definition: IntAr.H:80
DbIndex iLocalIndex
Definition: DbBufStorage.H:169
void * data_item(DbIndex iLocal) const
DbDataCluster(unsigned nItemSize, DbIndex nStartVolume=DB_CLUSTER_START_VOLUME)
UIntAr DbIndexAr
Definition: DbBufStorage.H:265
Definition: DynAr.H:22
void print_self()
Definition: DbBufStorage.H:275
virtual ~DbDataCluster()
Definition: DbBufStorage.H:67
Definition: IntAr.H:14
void exchange_lines(DbIndex line1, DbIndex line2)
void * line_pointer(DbIndex line) const
Definition: DbBufStorage.H:132
void set_loaded(Logic bFlag)
Definition: DbBufStorage.H:205
DbIndex empty_slots() const
DbBufStorage(unsigned nItemSize)
void clean_storage()
DbLineEntry & operator=(const DbLineEntry &rLEntry)
DbDataCluster * DbDataClusterPtr
Definition: DbBufStorage.H:253
#define DB_CLUSTER_START_VOLUME
Definition: DbBufStorage.H:49
virtual ~DbBufStorage()
DbIndex total_slots() const
void print_self() const
void set_changed(Logic bFlag)
Definition: DbBufStorage.H:225
void remove_lines(DbIndex line1, DbIndex line2)
Logic is_empty() const
DbIndex max_lines_in_cluster() const
void release_items(DbIndex nCount, const DbIndex *pLocal)
Logic get_changed() const
Definition: DbBufStorage.H:215
DbIndex lines_count() const
Definition: DbBufStorage.H:374
void preload_lines(DbIndex line1, DbIndex line2)
void set_item_size(unsigned nItemSize)