source: tags/initial/ARBDB/adlocal.h

Last change on this file was 2, checked in by oldcode, 24 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1#ifdef arbdb_h_included
2#error Please do not include "arbdb.h" yourself when also including "adlocal.h"
3#endif
4
5
6#ifndef GBL_INCLUDED
7#define GBL_INCLUDED
8
9/* ================ Test memory @@@===================== */
10#if defined(DEBUG)
11#define MEMORY_TEST 1
12#else
13#define MEMORY_TEST 0
14#endif
15
16#if (MEMORY_TEST==1)
17
18#define gbb_put_memblk(block,size)
19#define gbb_get_memblk(size)            (char*)(GB_calloc(1,size))
20#define gbm_get_mem(size,index)         (char*)(GB_calloc(1,size))
21#define gbm_free_mem(block,size,index)  free(block)
22#define fread(block,size,nelem,stream)  (memset(block,0,size*nelem),\
23                                        (fread)(block,size,nelem,stream))
24#endif
25
26/* ================ Assert's ======================== */
27
28#ifdef DEBUG
29#define ad_assert(bed) do { if (!(bed)) *(int *)0=0; } while (0)
30#else
31#define ad_assert(bed)
32#endif
33
34/* ================================================== */
35
36#define GBTUM_MAGIC_NUMBER 0x17488400
37#define GBTUM_MAGIC_NUMBER_FILTER 0xffffff00
38
39#define GBTUM_MAGIC_REVERSED 0x00844817
40
41#define GB_MAX_PROJECTS 256
42#define GBTUM_COMPRESS_TREE_SIZE 32
43#define GB_MAX_USERS 4
44#define GB_MAX_KEYS 0x1000000   /* 24 bit see flags also */
45
46#define CROSS_BUFFER_DIFF 20
47#define SIZOFINTERN 10
48
49#define GB_SYSTEM_FOLDER "__SYSTEM__"
50#define GB_SYSTEM_KEY_DATA "@key_data"
51
52#define GB_MAX_MAPPED_FILES 10
53
54
55/********** RELATIVE ADRESSING *************/
56
57#if (MEMORY_TEST==1)
58typedef void                                        *GB_REL_ADD;
59typedef char                                        *GB_REL_STRING;
60typedef struct gb_data_base_type            *GB_REL_GBDATA;
61typedef struct gb_data_base_type2           *GB_REL_CONTAINER;
62typedef struct gb_header_list_struct    *GB_REL_HLS;
63typedef struct gb_if_entries                *GB_REL_IFES;
64typedef struct gb_index_files_struct    *GB_REL_IFS;
65typedef struct gb_if_entries                **GB_REL_PIFES;
66#else
67typedef long    GB_REL_ADD;             /* relative adress */
68typedef long    GB_REL_STRING;          /* relative adress */
69typedef long    GB_REL_GBDATA;          /* relative adress */
70typedef long    GB_REL_CONTAINER;               /* relative adress */
71typedef long    GB_REL_HLS;             /* relative adress */
72typedef long    GB_REL_IFES;            /* relative adress */
73typedef long    GB_REL_IFS;             /* relative adress */
74typedef long    GB_REL_PIFES;           /* relative adress */
75#endif
76
77typedef short   GB_MAIN_IDX;            /* random-index */
78typedef struct gbs_hash_struct GB_HASH;
79
80#define GB_MAIN_ARRAY_SIZE 4096
81
82/********************************************/
83
84enum {
85    GBM_CB_INDEX = -1,
86    GBM_HASH_INDEX = -2,
87    GBM_HEADER_INDEX = -3,
88    GBM_UNDO = -4,
89    GBM_DICT_INDEX = -5
90};
91
92typedef long gb_bool;
93struct gb_map_header;
94
95#define _GB_UNDO_TYPE_DEFINED
96typedef enum {                  /* Warning: Same typedef in arbdb.h */
97    GB_UNDO_NONE,
98    GB_UNDO_KILL,       /* no undo and delete all old undos */
99    GB_UNDO_UNDO,
100    GB_UNDO_REDO,
101    GB_UNDO_UNDO_REDO
102} GB_UNDO_TYPE;
103
104typedef enum gb_changed_types {
105    gb_not_changed = 0,
106    gb_son_changed = 2,
107    gb_changed = 4,
108    gb_created = 5,
109    gb_deleted = 6,
110    gb_deleted_in_master = 7
111} GB_CHANGED;
112
113enum gb_open_types {
114    gb_open_all         =       0,
115    gb_open_read_only_all       =       16,
116    gb_open_read_only_small     =       17
117};
118
119typedef enum gb_call_back_type {
120    GB_CB_DELETE = 1,
121    GB_CB_CHANGED = 2,
122    GB_CB_SON_CREATED = 4,
123    GB_CB_ALL = 7
124} GB_CB_TYPE;
125
126/* #define GBDATA struct gb_data_base_type */
127typedef struct gb_data_base_type GBDATA;
128
129/*#define GB_CB void (*func)(GBDATA *,int *clientdata, GB_CB_TYPE gbtype)*/
130
131#ifdef __cplusplus
132extern "C" {
133#endif
134
135    typedef void (*GB_CB)(GBDATA *,int *clientdata, GB_CB_TYPE gbtype);
136
137#ifdef __cplusplus
138}
139#endif
140
141
142typedef int GBQUARK;
143
144/********************* compress ******************/
145enum GB_COMPRESSION_TYPES {
146    GB_COMPRESSION_NONE         = 0,
147    GB_COMPRESSION_RUNLENGTH    = 1,
148    GB_COMPRESSION_HUFFMANN     = 2,
149    GB_COMPRESSION_DICTIONARY   = 4,
150    GB_COMPRESSION_SEQUENCE     = 8,
151    GB_COMPRESSION_SORTBYTES    = 16,
152    GB_COMPRESSION_BITS         = 32,
153    GB_COMPRESSION_LAST         = 128
154};
155typedef int GB_NINT;            /* Network byte order int */
156
157typedef struct {
158    int words;
159    int textlen;
160    unsigned char *text;
161    GB_NINT     *offsets;       /* in network byte order */
162    GB_NINT *resort;            /* in network byte order */
163
164} GB_DICTIONARY;
165
166extern int gb_convert_type_2_compression_flags[];
167extern int gb_convert_type_2_sizeof[];
168extern int gb_convert_type_2_appendix_size[];
169extern int gb_verbose_mode;
170
171struct gb_compress_tree {
172    char        leave;
173    struct gb_compress_tree *son[2];
174};
175
176enum gb_compress_list_commands {
177    gb_cs_ok    =0,
178    gb_cs_sub   =1,
179    gb_cs_id    =2,
180    gb_cs_end   =3,
181    gb_cd_node  =4
182};
183
184struct gb_compress_list {
185    enum gb_compress_list_commands      command;
186    int value;
187    int bitcnt;
188    int bits;
189    int mask;
190
191    long        count;
192    struct gb_compress_list *son[2];
193};
194
195/********************* main ******************/
196
197struct gb_user_struct {
198    char        *username;
199    int userid;
200    int userbit;
201    int nusers; /* number of clients of this user */
202};
203
204struct gb_project_struct {
205    char        *projectname;
206    int projectid;
207    struct gb_export_project {
208        struct gb_export_project *next;
209        char    *username;
210    }   *export_;
211    long        export_2_users; /* bits , one bit for each logged in user */
212};
213
214struct gb_data_base_type;
215struct gb_key_struct {
216    char *key;
217
218    long nref;
219    long next_free_key;
220    long nref_last_saved;
221
222    struct gb_data_base_type *gb_key;   /* for fast access and dynamic loading */
223    struct gb_data_base_type *gb_master_ali; /* Pointer to the master container */
224    int         gb_key_disabled;        /* There will never be a gb_key */
225    int         compression_mask;       /* maximum compression for this type */
226    GB_DICTIONARY *dictionary;          /* optional dictionary */
227
228};
229
230struct gb_quick_save_struct {
231    char                *quick_save_disabled;   /* GB_BOOL if set, than text decsribes reason*/
232    int                 last_index;
233};
234
235struct gb_cache_entry_struct {
236    struct gb_data_base_type *gbd;
237    long        prev;
238    long        next;
239    char        *data;
240    long        clock;
241    int sizeof_data;
242};
243
244struct gb_cache_struct {
245    struct gb_cache_entry_struct *entries;
246    long        firstfree_entry;
247    long        newest_entry;
248    long        oldest_entry;
249    long        sum_data_size;
250    long        max_data_size;
251    long        max_entries;
252};
253
254
255
256/** root structure for each database */
257struct gbcmc_comm;
258struct g_b_undo_mgr_struct;
259struct gb_callback_list;
260struct gb_data_base_type2;
261
262typedef struct gb_main_type {
263    int                 transaction;
264    int                 aborted_transaction;
265    int                 local_mode;
266    int                 client_transaction_socket;
267    struct gbcmc_comm   *c_link;
268    void                        *server_data;
269    struct gb_data_base_type2 *dummy_father;
270    struct gb_data_base_type2 *data;
271    struct gb_data_base_type  *gb_key_data;
272    char                        *path;
273    enum gb_open_types  opentype;
274    char                        *disabled_path;
275    int                 allow_corrupt_file_recovery;
276
277    struct gb_quick_save_struct qs;
278    struct gb_cache_struct              cache;
279    int                         compression_mask;
280
281    int                 keycnt;         /* first non used key */
282    long                        sizeofkeys;     /* malloc size */
283    long                        first_free_key; /* index of first gap */
284    struct gb_key_struct        *keys;
285    GB_HASH                     *key_2_index_hash;
286    long                        key_clock;      /* trans. nr. of last change */
287
288    char                        *keys_new[256];
289    unsigned int                last_updated;
290    long                        last_saved_time;
291    long                        last_saved_transaction;
292    long                        last_main_saved_transaction;
293
294    GB_UNDO_TYPE                requested_undo_type;
295    GB_UNDO_TYPE                undo_type;
296    struct g_b_undo_mgr_struct *undo;
297
298    char                        *dates[256];
299    unsigned int                security_level;
300    int                 old_security_level;
301    int                 pushed_security_level;
302    long                        clock;
303    long                        remote_hash;
304
305    GB_HASH                     *command_hash;
306    GB_HASH                     *resolve_link_hash;
307    GB_HASH                     *table_hash;
308
309    struct gb_callback_list *cbl;
310    struct gb_callback_list *cbl_last;
311
312    struct gb_callback_list *cbld;
313    struct gb_callback_list *cbld_last;
314
315    struct gb_user_struct       *users[GB_MAX_USERS];   /* user 0 is server */
316    struct gb_project_struct *projects[GB_MAX_PROJECTS]; /* projects */
317    struct gb_user_struct       *this_user;
318    struct gb_project_struct *this_project;
319} GB_MAIN_TYPE;
320
321extern GB_MAIN_TYPE *gb_main_array[];
322
323
324typedef enum trans_type {       ARB_COMMIT, ARB_ABORT, ARB_TRANS } ARB_TRANS_TYPE;
325
326
327/** global data structure that is valid for all databases*/
328struct gb_local_data {
329    char        *buffer2;
330    long        bufsize2;
331    char        *buffer;
332    long        bufsize;
333    char        *write_buffer;
334    char        *write_ptr;
335    long        write_bufsize;
336    long        write_free;
337    int iamclient;
338    int search_system_folder;
339    struct gb_compress_tree *bituncompress;
340    struct gb_compress_list *bitcompress;
341    long                        bc_size;
342    long        gb_compress_keys_count;
343    long        gb_compress_keys_level;
344    struct gb_main_type  *gb_compress_keys_main;
345    ARB_TRANS_TYPE              running_client_transaction;
346    struct {
347        struct gb_data_base_type *gb_main;
348    }   gbl;
349};
350
351extern struct gb_local_data *gb_local;
352extern const unsigned long crctab[];
353
354struct gb_header_flags {
355    unsigned int        flags:GB_MAX_USERS;     /* public */
356    unsigned int        key_quark:24;           /* == 0 -> invalid */
357    unsigned int        changed:3;
358    unsigned int        ever_changed:1;         /* is this element ever changed */
359} ;
360
361struct gb_header_list_struct {  /* public fast flags */
362    struct gb_header_flags flags;
363
364    GB_REL_GBDATA rel_hl_gbd;   /* Typ: (struct gb_data_base_type *) */
365                                /* pointer to data
366                                   if 0 & !key_index -> free data
367                                   if 0 & key_index -> data only in server */
368};
369
370struct gb_data_list {
371
372    GB_REL_HLS rel_header;      /* Typ: (struct gb_header_list_struct *) */
373
374    int headermemsize;
375    int size;           /* number of valid items */
376    int nheader;        /* size + deleted items */
377};
378struct gb_flag_types {          /* public flags, abort possible */
379    unsigned int                type:4;
380    unsigned int                security_delete:3;
381    unsigned int                security_write:3;
382    unsigned int                security_read:3;
383    unsigned int                compressed_data: 1;
384    unsigned int                unused: 1;      /* last bit saved */
385    unsigned int                user_flags:8;
386    unsigned int                temporary:1;    /* ==1 -> dont save entry */
387    unsigned int                saved_flags:8;
388};
389struct gb_flag_types2 {         /* private flags, abortable */
390    /* uncritic section undoable */
391    unsigned int                last_updated:8;
392    unsigned int                usr_ref:7;              /* for user access  */
393    /* critic section, do not update any below */
394    unsigned int                folded_container: 1;
395    unsigned int                update_in_server:1;     /* already informed */
396    unsigned int                extern_data:1;          /* data ref. by pntr*/
397    unsigned int                header_changed:1;       /* used by container*/
398    unsigned int                gbm_index:8;            /* memory section*/
399    unsigned int                tisa_index:1;   /* this should be indexed */
400    unsigned int                is_indexed:1;   /* this db. field is indexed*/
401};
402
403struct gb_flag_types3 {         /* user and project flags (public)
404                                   not abortable !!! */
405    unsigned int                project:8;
406    unsigned int                unused:24;
407};
408
409struct gb_if_entries
410{
411    GB_REL_IFES rel_ie_next;    /* Typ: (struct gb_if_entries *)        */
412    GB_REL_GBDATA rel_ie_gbd;           /* Typ: (struct gb_data_base_type *)    */
413};
414
415/** hash index to speed up GB_find(x,x,x,down_2_level) ***/
416
417struct gb_index_files_struct
418{
419    GB_REL_IFS  rel_if_next;    /* Typ: (struct gb_index_files_struct *) */
420
421    GBQUARK             key;
422    long                hash_table_size;
423    long                nr_of_elements;
424
425    GB_REL_PIFES  rel_entries;  /* Typ: (struct gb_if_entries **) */
426};
427
428struct gb_db_extended;
429
430typedef struct gb_data_base_type2 {     /* public area */
431    long        server_id;
432    GB_REL_CONTAINER rel_father;        /* Typ: (struct gb_data_base_type2 *) */
433    struct gb_db_extended       *ext;
434    long        index;
435    struct gb_flag_types        flags;
436    struct gb_flag_types2       flags2; /* privat area */
437    struct gb_flag_types3       flags3;
438    struct gb_data_list d;
439    long index_of_touched_one_son;      /* index of modified son
440                                           in case of a single mod. son
441                                           -1 more than one (or one with ind = 0)
442                                           0    no son
443                                           >0   index */
444    long        header_update_date;
445
446    GB_MAIN_IDX         main_idx;       /* Typ: (GB_MAIN_TYPE *) */
447    GB_REL_IFS  rel_ifs;        /* Typ: (struct gb_index_files_struct *) */
448
449} GBCONTAINER;
450
451
452struct gb_extern_data2 {
453    char        *data;  /* Typ: (char *) */
454    long        memsize;
455    long        size;
456};
457
458struct GB_INTern_strings2 {
459    char        data[SIZOFINTERN];
460    unsigned char memsize;
461    unsigned char size;
462};
463
464struct GB_INTern2 {
465    char        data[SIZOFINTERN];
466};
467
468union gb_data_base_type_union2 {
469    struct GB_INTern_strings2 istr;
470    struct GB_INTern2   in;
471    struct gb_extern_data2      ex;
472};
473
474struct gb_transaction_save {
475    struct gb_flag_types        flags;
476    struct gb_flag_types2       flags2;
477    union gb_data_base_type_union2 info;
478    short                       refcount;                       /* number of references to this object */
479};
480
481struct gb_callback
482{
483    struct gb_callback *next;
484    GB_CB func;
485    enum gb_call_back_type type;
486    int *clientdata;
487};
488
489struct gb_callback_list {
490    struct gb_callback_list *next;
491    GB_CB func;
492    struct gb_transaction_save *old;
493    GB_CB_TYPE type;
494    struct gb_data_base_type    *gbd;
495    int *clientdata;
496};
497
498/*#undef GBDATA*/
499
500enum gb_undo_commands {
501    _GBCMC_UNDOCOM_REQUEST_NOUNDO_KILL,
502    _GBCMC_UNDOCOM_REQUEST_NOUNDO,
503    _GBCMC_UNDOCOM_REQUEST_UNDO,
504    _GBCMC_UNDOCOM_INFO_UNDO,
505    _GBCMC_UNDOCOM_INFO_REDO,
506    _GBCMC_UNDOCOM_UNDO,
507    _GBCMC_UNDOCOM_REDO,
508
509    _GBCMC_UNDOCOM_SET_MEM = 10000              /* Minimum */
510};
511
512enum gb_scan_quicks_types {
513    GB_SCAN_NO_QUICK,
514    GB_SCAN_NEW_QUICK,
515    GB_SCAN_OLD_QUICK
516};
517
518struct gb_scandir {
519    int highest_quick_index;
520    int newest_quick_index;
521    unsigned long date_of_quick_file;
522    enum gb_scan_quicks_types type;             /* xxx.arb.quick? or xxx.a?? */ 
523};
524
525#define GBCM_SERVER_OK_WAIT 3
526#define GBCM_SERVER_ABORTED 2
527#define GBCM_SERVER_FAULT 1
528#define GBCM_SERVER_OK 0
529
530#ifndef arbdb_h_included
531# include "arbdb.h"
532#endif
533
534#include "adtune.h"
535#include "adlmacros.h"
536
537#endif
Note: See TracBrowser for help on using the repository browser.