root/trunk/ARBDB/gb_storage.h

Revision 6661, 4.9 KB (checked in by westram, 2 years ago)
  • gbm_get_mem / gbm_free_mem use void* (like malloc/free)
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : gb_storage.h                                      //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#ifndef GB_STORAGE_H
12#define GB_STORAGE_H
13
14#ifndef GB_KEY_H
15#include "gb_key.h"
16#endif
17
18
19// ------------------------
20//      indexed keys
21
22inline void GB_INDEX_CHECK_IN(GBDATA *gbd) { if (gbd->flags2.tisa_index) gb_index_check_in(gbd); }
23inline void GB_INDEX_CHECK_OUT(GBDATA *gbd) { if ((gbd)->flags2.is_indexed) gb_index_check_out(gbd); }
24
25#define GB_GBM_INDEX(gbd) ((gbd)->flags2.gbm_index)
26
27// ---------------------------------------------------------
28//      extern data storage (not directly inside GBDATA)
29
30inline bool GB_CHECKINTERN(int size, int memsize) { return size<256 && memsize<SIZOFINTERN; }
31
32inline void GB_SETINTERN(GBDATA *gbd) { gbd->flags2.extern_data = 0; }
33inline void GB_SETEXTERN(GBDATA *gbd) { gbd->flags2.extern_data = 1; }
34
35inline char *GB_EXTERN_DATA_DATA(gb_extern_data& ex) { return GB_RESOLVE(char*, (&(ex)), rel_data); }
36inline void SET_GB_EXTERN_DATA_DATA(gb_extern_data& ex, char *data) { GB_SETREL(&ex, rel_data, data); }
37
38inline void GB_CREATE_EXT(GBDATA *gbd) { if (!gbd->ext) gb_create_extended(gbd); }
39inline void GB_DELETE_EXT(GBDATA *gbd, long gbm_index) {
40    if (gbd->ext) {
41        gbm_free_mem(gbd->ext, sizeof(gb_db_extended), gbm_index);
42        gbd->ext = 0;
43    }
44}
45
46inline long GB_GET_EXT_CREATION_DATE(GBDATA *gbd) { return gbd->ext ? gbd->ext->creation_date : 0; }
47inline long GB_GET_EXT_UPDATE_DATE(GBDATA *gbd) { return gbd->ext ? gbd->ext->update_date : 0; }
48
49inline gb_callback *GB_GET_EXT_CALLBACKS(GBDATA *gbd) { return gbd->ext ? gbd->ext->callback : 0; }
50inline gb_transaction_save *GB_GET_EXT_OLD_DATA(GBDATA *gbd) { return gbd->ext ? gbd->ext->old : 0; }
51
52// --------------------------
53//      data and datasize
54
55inline long GB_GETSIZE(const GBDATA *gbd)       { return gbd->flags2.extern_data ? gbd->info.ex.size     : gbd->info.istr.size; }
56inline long GB_GETMEMSIZE(const GBDATA *gbd)    { return gbd->flags2.extern_data ? gbd->info.ex.memsize  : gbd->info.istr.memsize; }
57inline char *GB_GETDATA(GBDATA *gbd)            { return gbd->flags2.extern_data ? GB_EXTERN_DATA_DATA(gbd->info.ex)  : &((gbd)->info.istr.data[0]); }
58
59inline void GB_FREEDATA(GBDATA *gbd) {
60    GB_INDEX_CHECK_OUT(gbd);
61    if (gbd->flags2.extern_data && GB_EXTERN_DATA_DATA(gbd->info.ex)) {
62        gbm_free_mem(GB_EXTERN_DATA_DATA(gbd->info.ex), (size_t)(gbd->info.ex.memsize), GB_GBM_INDEX(gbd));
63        SET_GB_EXTERN_DATA_DATA(gbd->info.ex, 0);
64    }
65}
66
67// wtf means SMD ???
68
69inline void GB_SETSMD(GBDATA *gbd, long siz, long memsiz, char *dat) {
70    /* insert external data into any db. field
71     * Warning: this function has a lot of side effects:
72     * 1. extern_data must be set by the user before calling this
73     * 2. if !extern_data the data is not set
74     *
75     * -> better use GB_SETSMDMALLOC
76     */
77
78    if (gbd->flags2.extern_data) {
79        gbd->info.ex.size = siz;
80        gbd->info.ex.memsize = memsiz;
81        SET_GB_EXTERN_DATA_DATA(gbd->info.ex, dat);
82    }
83    else {
84        gbd->info.istr.size = (unsigned char)siz;
85        gbd->info.istr.memsize = (unsigned char)memsiz;
86    }
87    GB_INDEX_CHECK_IN(gbd);
88}
89
90inline void GB_SETSMDMALLOC(GBDATA *gbd, long siz, long memsiz, const char *dat) {
91    gb_assert(dat);
92
93    if (GB_CHECKINTERN(siz, memsiz)) {
94        GB_SETINTERN(gbd);
95        gbd->info.istr.size = (unsigned char)siz;
96        gbd->info.istr.memsize = (unsigned char)memsiz;
97        if (dat) memcpy(&(gbd->info.istr.data[0]), (char *)dat, (size_t)(memsiz));
98    }
99    else {
100        char *exData;
101        GB_SETEXTERN(gbd);
102        gbd->info.ex.size = siz;
103        gbd->info.ex.memsize = memsiz;
104        exData = (char*)gbm_get_mem((size_t)memsiz, GB_GBM_INDEX(gbd));
105        SET_GB_EXTERN_DATA_DATA(gbd->info.ex, exData);
106        if (dat) memcpy(exData, (char *)dat, (size_t)(memsiz));
107    }
108    GB_INDEX_CHECK_IN(gbd);
109}
110
111inline void GB_SETSMDMALLOC_UNINITIALIZED(GBDATA *gbd, long siz, long memsiz) {
112    if (GB_CHECKINTERN(siz, memsiz)) {
113        GB_SETINTERN(gbd);
114        gbd->info.istr.size = (unsigned char)siz;
115        gbd->info.istr.memsize = (unsigned char)memsiz;
116    }
117    else {
118        char *exData;
119        GB_SETEXTERN(gbd);
120        gbd->info.ex.size = siz;
121        gbd->info.ex.memsize = memsiz;
122        exData = (char*)gbm_get_mem((size_t)memsiz, GB_GBM_INDEX(gbd));
123        SET_GB_EXTERN_DATA_DATA(gbd->info.ex, exData);
124    }
125    GB_INDEX_CHECK_IN(gbd);
126}
127
128#else
129#error gb_storage.h included twice
130#endif // GB_STORAGE_H
Note: See TracBrowser for help on using the browser.