source: branches/help/ARBDB/arbdb.h

Last change on this file was 17979, checked in by westram, 5 years ago
  • add security level objects to ARBDB.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 KB
Line 
1// ================================================================ //
2//                                                                  //
3//   File      : arbdb.h                                            //
4//   Purpose   : external ARB DB interface                          //
5//                                                                  //
6//   Institute of Microbiology (Technical University Munich)        //
7//   http://www.arb-home.de/                                        //
8//                                                                  //
9// ================================================================ //
10
11#ifndef ARBDB_H
12#define ARBDB_H
13
14#ifndef ARBTOOLS_H
15#include <arbtools.h>
16#endif
17#ifndef ARBDB_BASE_H
18#include <arbdb_base.h>
19#endif
20#ifndef ARB_ERROR_H
21#include <arb_error.h>
22#endif
23#ifndef _STDINT_H
24#include <stdint.h>
25#endif
26
27#define GB_SYSTEM_FOLDER   "__SYSTEM__"
28#define GB_SYSTEM_KEY_DATA "@key_data"
29
30#define GB_DEFAULT_ALIGNMENT "presets/use" // has to match ../WINDOW/aw_awar_defs.hxx@AWAR_DEFAULT_ALIGNMENT
31
32// ---------------------
33//      simple types
34
35typedef int GB_COMPRESSION_MASK;
36
37// ------------------------------
38//      forward declare types
39
40struct GB_NUMHASH;
41
42struct GBS_regex;
43struct GBS_string_matcher;
44struct GBS_strstruct;
45struct GEN_position;
46struct DictData;
47struct CharPtrArray;
48struct StrArray;
49struct ConstStrArray;
50
51// -------------------
52//      constants
53
54#define GB_USERFLAG_ANY       127  // maximum for gb_flag_types2::usr_ref
55#define GB_USERFLAG_QUERY     1    // bit used for search&query (used on species, genes, experiments)
56#define GB_USERFLAG_WASMARKED 2    // bit used to temp. store marks
57#define GB_USERFLAG_GHOSTNODE 1    // bit used by gbt_write_tree (only used on tree-nodes; so it does not clash with GB_USERFLAG_QUERY)
58
59// --------------
60//      enums
61
62enum GB_TYPES {                                     // supported DB entry types
63    GB_NONE        = 0,
64    GB_BIT         = 1,
65    GB_BYTE        = 2,
66    GB_INT         = 3,
67    GB_FLOAT       = 4,
68    GB_POINTER     = 5,                             // not savable! only allowed in temporary entries
69    GB_BITS        = 6,
70    // 7 is unused
71    GB_BYTES       = 8,
72    GB_INTS        = 9,
73    GB_FLOATS      = 10,
74    GB_OBSOLETE    = 11,                            // former GB_LINK (stay backward compatible until arb 6.2 or later)
75    GB_STRING      = 12,
76    GB_STRING_SHRT = 13,                            // used automatically during save
77    // 14 is unused
78    GB_DB          = 15,
79
80    // keep GB_TYPES consistent with AW_VARIABLE_TYPE
81    // see ../WINDOW/aw_base.hxx@sync_GB_TYPES_AW_VARIABLE_TYPE
82
83    GB_TYPE_MAX = 16,
84
85    GB_CREATE_CONTAINER = GB_DB,
86    GB_FIND             = GB_NONE,
87
88};
89
90inline bool GB_TYPE_readable_as_string(GB_TYPES type) {
91    /*! returns true if 'type' is readable using GB_read_as_string().
92     * For other types GB_read_as_string() returns NULp.
93     * Implies that it is writeable using GB_write_autoconv_string().
94     * @see GB_readable_as_string()
95     */
96    return type == GB_STRING || type == GB_BYTE || type == GB_INT || type == GB_FLOAT || type == GB_BITS;
97}
98
99enum GB_SEARCH_TYPE {
100    SEARCH_BROTHER       = 1,                       // [was: this_level]
101    SEARCH_CHILD         = 2,                       // [was: down_level]
102    SEARCH_GRANDCHILD    = 4,                       // [was: down_2_level]
103    SEARCH_NEXT_BROTHER  = SEARCH_BROTHER+8,        // [was: this_level|search_next]
104    SEARCH_CHILD_OF_NEXT = SEARCH_CHILD+8,          // [was: down_level|search_next]
105};
106
107enum GB_UNDO_TYPE {
108    GB_UNDO_NONE,                                   // no undo
109    GB_UNDO_KILL,                                   // no undo and delete all old undos
110    GB_UNDO_UNDO,                                   // normal undo -> deleted all redoes
111    GB_UNDO_REDO,                                   // moves to UNDO_REDO
112    GB_UNDO_UNDO_REDO                               // internal makes undo redoable
113};
114
115enum XCMD_TYPE {
116    // internal (use public values below):
117    _XCMD__ASYNC   = 1, // run asynchronous (otherwise wait for finish)
118    _XCMD__WAITKEY = 2, // always wait for keypress (otherwise only in case of error!)
119
120    // public:
121    XCMD_ASYNC_WAITKEY       = _XCMD__ASYNC|_XCMD__WAITKEY,
122    XCMD_ASYNC_WAIT_ON_ERROR = _XCMD__ASYNC,
123    XCMD_SYNC_WAITKEY        = _XCMD__WAITKEY,
124    XCMD_SYNC_WAIT_ON_ERROR  = 0,
125};
126
127// -----------------------
128//      callback types
129
130typedef long (*gb_hash_loop_type)(const char *key, long val, void *client_data);
131typedef void (*gb_hash_const_loop_type)(const char *key, long val, void *client_data);
132typedef int (*gbs_hash_compare_function) (const char *key0, long val0, const char *key1, long val1);
133
134typedef const char* (*gb_export_sequence_cb)(GBDATA *gb_species, size_t *seq_len, GB_ERROR *error);
135
136typedef GBDATA* (*GB_Link_Follower)(GBDATA *GB_root, GBDATA *GB_elem, const char *link);
137
138typedef const char *(*gb_getenv_hook)(const char *varname);
139
140// -----------------------
141//      GB_transaction
142
143class GB_transaction : virtual Noncopyable {
144    GBDATA   *ta_main;
145    bool      ta_open;          // is transaction open ?
146    GB_ERROR  ta_err;
147
148    void init(GBDATA *gb_main, bool initial);
149protected:
150    GB_transaction(GBDATA *gb_main, bool) { init(gb_main, true); }
151public:
152    GB_transaction(GBDATA *gb_main) { init(gb_main, false); }
153    ~GB_transaction();
154
155    bool ok() const { return ta_open && !ta_err; }  // ready to work on DB?
156    GB_ERROR close(GB_ERROR error);                 // abort transaction if error (e.g.: 'return ta.close(error);')
157    ARB_ERROR close(ARB_ERROR& error);              // abort transaction if error (e.g.: 'return ta.close(error);')
158};
159
160struct GB_initial_transaction : public GB_transaction {
161    GB_initial_transaction(GBDATA *gb_main) : GB_transaction(gb_main, true) {}
162};
163
164class GB_shell {
165    // initialize and cleanup module ARBDB
166    // No database usage is possible when no GB_shell exists!
167public:
168    GB_shell();
169    ~GB_shell();
170
171    static void ensure_inside();
172    static bool in_shell();
173};
174
175// --------------------------
176//      GB_securityLevel
177
178class GB_securityLevel : virtual Noncopyable {
179    // changes global security level until destruction of this.
180    // intended to be used as auto-variable.
181
182    GBDATA *gbdata;
183    int     previous_level;
184
185    int whats_my_security() const;
186    void change_my_security(int level);
187
188public:
189    GBDATA *get_gbd() const { return gbdata; } // internal use only
190
191    int previous() const { return previous_level; }
192    int current() const { return whats_my_security(); }
193
194    GB_securityLevel(GBDATA *gbd, int level) :
195        gbdata(gbd),
196        previous_level(current())
197    {
198        change_my_security(level);
199    }
200    ~GB_securityLevel() {
201        change_my_security(previous());
202    }
203
204};
205struct GB_topSecurityLevel : public GB_securityLevel { // derived from Noncopyable
206    // raise security level to top (allow everything).
207    // Note: the highest user-level is 6
208    GB_topSecurityLevel(GBDATA *gbd) :
209        GB_securityLevel(gbd, 7)
210    {}
211};
212struct GB_previousSecurityLevel : public GB_securityLevel { // derived from Noncopyable
213    // temporarily lower security again (while another GB_securityLevel is active).
214    GB_previousSecurityLevel(const GB_securityLevel& active) :
215        GB_securityLevel(active.get_gbd(), active.previous())
216    {}
217};
218
219// --------------------------------------------
220
221#if defined(DEBUG)
222struct GB_SizeInfo {
223    long containers; // no of containers
224    long terminals;  // no of terminals
225    long structure;  // structure size
226    long data;       // data size
227    long mem;        // data memory size (compressed)
228
229    GB_SizeInfo() : containers(0), terminals(0), structure(0), data(0), mem(0) {}
230
231    void collect(GBDATA *gbd);
232};
233#endif
234
235// --------------------------------------------
236//      include generated public prototypes
237
238#include <ad_prot.h>
239
240// to avoid arb-wide changes atm include some headers from CORE lib
241#ifndef ARB_MEM_H
242#include <arb_mem.h>
243#endif
244#ifndef ARB_MSG_H
245#include <arb_msg.h>
246#endif
247#ifndef ARB_STRING_H
248#include <arb_string.h>
249#endif
250
251// ----------------------------------------------------
252//      const wrappers for functions from ad_prot.h
253
254inline char *GBS_find_string(char *content, GB_CSTR key, int match_mode) {
255    return const_cast<char*>(GBS_find_string(const_cast<GB_CSTR>(content), key, match_mode));
256}
257
258// ---------------------------------
259//      error delivery functions
260
261inline void GB_end_transaction_show_error(GBDATA *gbd, ARB_ERROR& error, void (*error_handler)(GB_ERROR)) {
262    GB_end_transaction_show_error(gbd, error.deliver(), error_handler);
263}
264inline ARB_ERROR GB_end_transaction(GBDATA *gbd, ARB_ERROR& error) {
265    return GB_end_transaction(gbd, error.deliver());
266}
267
268
269#else
270#error arbdb.h included twice
271#endif // ARBDB_H
Note: See TracBrowser for help on using the repository browser.