source: tags/arb_5.5/ARBDBPP/arbdb++.hxx

Last change on this file was 5968, checked in by westram, 16 years ago
  • new flag -w to aisc_mkpt (add include wrapper)
  • uniform style for several include wrappers
  • removed duplicated includes
  • removed useless nt_concatenate.hxx
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.4 KB
Line 
1// =========================================================== //
2//                                                             //
3//   File      : arbdb++.hxx                                   //
4//   Purpose   :                                               //
5//                                                             //
6//   Institute of Microbiology (Technical University Munich)   //
7//   http://www.arb-home.de/                                   //
8//                                                             //
9// =========================================================== //
10
11#ifndef ARBDBPP_HXX
12#define ARBDBPP_HXX
13
14/* KLASSENDEFINITIONEN fuer die Datenbankschnittstelle
15
16AD_ERR  Fehlerklasse, oft Rueckgabewert von Funktionen
17       
18AD_MAIN Hauptklasse, oeffnen und schliessen der Datenbank, sowie
19beginn und Ende von Transaktionen
20
21folgende Klassen entsprechen im wesentlichen den Containern der
22ARB Database. Nach der Deklaration eines Objekts muss vor einem
23Funktionsaufruf init(), vor der Deallokierung ein exit()
24mit den entsprechenden Parametern aufgerufen werden.
25
26AD_SPECIES                 
27AD_ALI          ->alignment
28AD_CONT
29AD_SEQ
30AD_MARK
31
32***********************************************************/
33
34#ifndef AW_KEYSYM_HXX
35#include <aw_keysym.hxx>
36#endif
37
38#define ADPP_CORE *(int *)0=0;
39#define AD_ERR_WARNING  1
40// Punktzeichen fuer sequenz     
41#define SEQ_POINT '.'   
42#define ALIGN_STRING ".-~?"     // characters allowed to change in align_mod
43#define ADPP_IS_ALIGN_CHARACTER(chr) (strchr (ALIGN_STRING,chr))
44
45const int MINCACH = 1;
46const int MAXCACH = 0;  // schaltet cach ein bei open Funktionen
47const int CORE = 1;
48
49typedef enum ad_edit_modus {
50    AD_allign       = 0,    // add & remove of . possible (default)
51    AD_nowrite      = 1,    // no edits allowed
52    AD_replace      = 2,    // all edits
53    AD_insert       = 3     //
54} AD_EDITMODI;
55
56typedef enum ad_types {
57    ad_none         = 0,
58    ad_bit          = 1,
59    ad_byte         = 2,
60    ad_int          = 3,
61    ad_float        = 4,
62    ad_bits         = 6,
63    ad_bytes        = 8,
64    ad_ints         = 9,
65    ad_floats       = 10,
66    ad_string       = 12,
67    ad_db           = 15,
68    ad_type_max     = 16
69} AD_TYPES;     // equal GBDATA types
70/*******************************
71class AD_ERR
72*******************************/
73
74class AD_ERR
75{
76    int modus;      // Mode  0 = Errors, 1 = Warnings
77    int  anzahl;    // Number of errors
78    char *text;     // error text
79       
80public:
81    AD_ERR();               // create error
82    AD_ERR(const char *errorstring); // create error
83    AD_ERR(const char *, int core); // setzt den Fehler und bricht mit core ab falls core == CORE
84    ~AD_ERR();
85    char *show();   // returns the error text
86};
87
88
89class AD_READWRITE {
90    // Klasse, die es den anderen AD_Klassen ermoeglicht
91    // Eintraege zu lesen und zu schreiben.
92public:
93    GBDATA *gbdataptr;      // jeweiliger Zeiger auf GBDATA eintrag
94    // am Besten in initpntr bzw init auf jeweiligen
95    // Eintrag setzen.
96    char    *readstring(char *feld);
97    int     readint(char *feld);
98    float   readfloat(char *feld);
99    AD_ERR  *writestring(char *feld,char *eintrag);
100    AD_ERR  *writeint(char *feld,int eintrag);
101    AD_ERR  *writefloat(char *feld,float eintrag);
102    AD_ERR  *create_entry(char *key, AD_TYPES type);
103    AD_TYPES read_type(char *key);
104    GBDATA  *get_GBDATA(void) { return gbdataptr; };
105};
106
107/*************************
108class: AD_MAIN
109
110***************************/
111 
112
113class AD_MAIN : public AD_READWRITE
114{
115    friend class AD_SPECIES; // fuer den zugriff auf gbd
116    friend class AD_SAI;
117    friend class AD_ALI;
118    friend class AD_SEQ;
119
120    GBDATA      *gbd;           // Zeiger auf container der DB
121    GBDATA      *species_data;
122    GBDATA      *sai_data;
123    GBDATA      *presets;
124    int          AD_fast;       // Flag fuer schnelen Zugriff
125    AD_EDITMODI  mode;          // for seq modes
126
127public:
128
129
130    AD_MAIN();
131    ~AD_MAIN();
132       
133    AD_ERR *open(const char *);
134    AD_ERR *open(const char *,int );
135    AD_ERR *close();
136    AD_ERR *save(const char *modus);
137    AD_ERR *save_as(const char *modus);
138    AD_ERR *save_home(const char *modus);
139    AD_ERR *push_transaction();
140    AD_ERR *pop_transaction();
141    AD_ERR *begin_transaction();
142    AD_ERR *commit_transaction();
143    AD_ERR *abort_transaction();
144    AD_ERR *change_security_level(int level);
145    int     time_stamp(void);
146
147    int get_cach_flag();
148};
149
150/*******************************
151class AD_ALI
152container alignment
153*******************************/
154
155class AD_ALI : public AD_READWRITE
156{
157    friend class AD_CONT;
158   
159    AD_MAIN *ad_main;
160    GBDATA  *gb_ali;
161    GBDATA  *gb_aligned;
162    GBDATA  *gb_name;
163    GBDATA  *gb_len;
164    GBDATA  *gb_type;
165    char    *ad_name;
166    long     ad_len;
167    char    *ad_type;
168    long     ad_aligned;
169
170
171    int     count;
172    int     last;
173    AD_ERR *initpntr();
174    AD_ERR *release();
175public:
176    AD_ALI();
177    ~AD_ALI();
178
179    AD_ERR *init(AD_MAIN *gbptr);
180    AD_ERR *exit();
181    AD_ERR *find(char*name);
182    AD_ERR *first();
183    AD_ERR *ddefault();
184    AD_ERR *next();
185    //      AD_ERR *default();
186
187    AD_MAIN *get_ad_main() { return ad_main; };
188    int     eof();          // 1 ,falls letztes alignment
189    int     aligned();
190    int     len();
191    char *type();
192    char *name();
193    int time_stamp();
194
195    void    operator = (AD_ALI& );
196
197};
198
199
200/**********************************************
201AD_SPECIES
202***********************************************/
203class CONTLIST;
204class AD_SPECIES;
205
206int AD_SPECIES_destroy(GBDATA *,AD_SPECIES *);
207int AD_SPECIES_name_change(GBDATA *,AD_SPECIES *);
208
209class AD_SPECIES : public AD_READWRITE
210{
211    GBDATA  *gb_spdata;     // um lange Zeigerzugriffe zu vermeiden
212    // kopie von AD_MAIN.speciesdata
213protected:
214    AD_MAIN *ad_main;       // fuer DB zugriff
215    GBDATA *gb_species;     // zeiger auf species
216    GBDATA *gb_name;
217
218    char *spname;           // enthaelt kopie des namens
219
220    int last;               // 1 -> EOF
221    int count;              // zaehler fuer die daranhaengenden
222    // container
223
224    AD_ERR *error();
225    AD_ERR *ddefault();
226    class CONTLIST *container;
227
228    friend class AD_CONT;
229    friend int AD_SPECIES_destroy(GBDATA *,AD_SPECIES *);
230    friend int AD_SPECIES_name_change(GBDATA *,AD_SPECIES *);
231    // Funktion die callback behandelt
232
233    void initpntr();        // internes Aufbereiten der Klasse
234    void release();         // behandelt speicherverwaltung
235
236
237public:
238    AD_SPECIES();
239    ~AD_SPECIES();
240
241    AD_ERR *init(AD_MAIN *);
242    AD_ERR *exit();
243    AD_ERR *first();
244    AD_ERR *next();
245    AD_ERR *firstmarked();
246    AD_ERR *nextmarked();
247    AD_ERR *find(const char *name);
248    AD_ERR *create(const char *name);
249
250    void    operator = (const AD_SPECIES&); // zum kopieren
251
252    int time_stamp();
253
254    const char      *name();
255    int     flag();
256    const char      *fullname();
257    int     eof();
258};
259
260
261/**********************************************
262AD_SAI
263***********************************************/
264class AD_SAI : public AD_SPECIES
265{
266    GBDATA  *gb_main;       // um lange Zeigerzugriffe zu vermeiden
267    // kopie von AD_MAIN.speciesdata
268public:
269    AD_SAI();
270    ~AD_SAI();
271
272    int     flag();
273    AD_ERR *init(AD_MAIN *);
274    AD_ERR *exit();
275    AD_ERR *first();
276    AD_ERR *next();
277    AD_ERR *firstmarked();
278    AD_ERR *nextmarked();
279    AD_ERR *find(char *);
280    AD_ERR *create(char *name);
281
282    char    *fullname();
283    void    operator = (const AD_SAI&);     // zum kopieren
284    char    *name();        // liefert name zurueck
285
286};
287/*************************************
288 *AD_CONT
289 ************************************/
290class AD_CONT : public AD_READWRITE
291                // Containerklasse in der die Sequenzinformationen fuer
292                // ein Spezies gehalten und verwaltet wird
293                // muss ein spezies und ein alignment objekt
294                // beim initialisieren bekommen
295{
296    AD_SPECIES      *ad_species;
297    AD_ALI          *ad_ali;
298
299    GBDATA *gb_species; // wird 0, wenn species deleted
300    GBDATA *gb_ali;         // pointer to ali_xxx container
301
302    friend class AD_SEQ;
303    friend class AD_STAT;
304    // funktionen zum einfuegen in die AD_SPECIES Containerliste
305    int con_insert(AD_SPECIES *,AD_ALI *);
306    void con_remove(AD_SPECIES *,AD_ALI *);
307    // gibt cach flag zurueck (implementiert um mehrfachzeiger
308    int get_cach_flag();
309
310public:
311    AD_CONT();
312    ~AD_CONT();
313
314    AD_MAIN *get_ad_main() { return ad_ali->get_ad_main(); };
315    AD_ERR *init(AD_SPECIES *,AD_ALI *);
316    AD_ERR *create(AD_SPECIES *,AD_ALI *);
317    int     eof(void);
318    AD_ERR *exit();
319};
320
321
322// einfach verkettete Liste CONTLIST
323
324struct CLISTENTRY {
325    AD_SPECIES *entry;      // werden zum vergleich verwendet
326    AD_ALI  *entry2;
327    CLISTENTRY *next;
328    CLISTENTRY();
329};
330
331class CONTLIST {
332    // einfach verkettete liste mit AD_CONT eintraegen
333    // mit der nachgeprueft werden soll welche container
334    // enthalten sind.
335    CLISTENTRY *first;
336    int anzahl;
337
338
339public:
340    CONTLIST();
341    ~CONTLIST();
342
343    int insert(AD_SPECIES *,AD_ALI *);
344    int element(AD_SPECIES *,AD_ALI *);
345    void remove(AD_SPECIES *,AD_ALI *);
346};
347
348
349/*****************************
350        AD_STAT
351****************************/
352
353class AD_STAT;
354int   AD_STAT_updatecall(GBDATA *,AD_STAT*);
355
356class AD_STAT                   // Sequenzklasse in der die Sequenz und ihre
357// markierung gespeichert ist
358{
359    class AD_CONT *ad_cont;
360
361    friend int AD_STAT_updatecall(GBDATA *,AD_STAT*);
362   
363    AD_TYPES  marktype;
364    char     *markkey;
365    char     *markdata;         // Markierungsdaten String
366    float    *markdatafloat;
367    GB_UINT4 *markdataint;
368    long      nmark;            // anzahl der floats`
369
370    char c_0, c_1;              // Zeichen fuer die markierung
371    int  last;
372
373    int     updated;            // flag fuer aufgetretenen update
374    int     inited_object;      // fuer init/exit ueberpruefung
375    GBDATA *gb_mark;            // Zeiger auf ali_xxx container
376    GBDATA *gb_char_mark;
377    GBDATA *GB_FLOAT_mark;
378    GBDATA *GB_INT_mark;
379    GBDATA *gb_markdata;        // aktuelle markierung (aller 3 typen)
380
381    AD_ERR *initpntr();
382    AD_ERR *release();
383public:
384    AD_STAT();
385    ~AD_STAT();
386
387    AD_ERR *init(AD_CONT *);
388    AD_ERR *exit();
389
390    AD_ERR *first();
391    AD_ERR *first(AD_TYPES type);
392
393    AD_ERR *next();
394    AD_ERR *next(AD_TYPES type);
395
396    int      *eof();
397    AD_TYPES  type();
398    GB_UINT4 *getint();
399
400    char   *getbits();
401    float  *getfloat();
402    AD_ERR *put();
403    AD_ERR *put(char *markings, int len);
404    AD_ERR *put(float *markings, int len);
405    AD_ERR *put(GB_UINT4 *markings, int len);
406    int     time_stamp();
407};
408
409
410/**********************************
411        AD SEQ
412*********************************/
413class AD_SEQ: public AD_READWRITE
414              // Sequenzklasse in der die Sequenz und ihre
415              // markierung gespeichert ist
416{
417    friend int AD_SEQ_updatecall(GBDATA *,AD_SEQ  *);
418    GBDATA *gb_seq;         // zeiger auf ali_xxx container
419
420protected:
421    int     updated;        // flag fuer aufgetretenen update
422    int     nseq_but_filter; // show filter, no sequence
423    long    seq_len;        // hier steht die max laenge der sequenz
424
425    char    *seq;               // Sequenzdata
426    long     timestamp;         // Zeit des letzten zugriffs auf DB
427    AD_CONT *ad_cont;
428
429    AD_ERR *check_base(char chr,long position, int direction);
430    AD_ERR *push(long position, int direction);
431    AD_ERR *jump(long position, int direction);
432    AD_ERR *fetch(long position, int direction);
433    long    get_next_base(long position, int direction);
434    long    get_next_gap(long position, int direction);
435
436public:
437    AD_SEQ();
438    ~AD_SEQ();
439
440    AD_ERR *init(AD_CONT *);
441    AD_ERR *exit();
442
443    AD_ERR *update();       // reread data froam database
444
445    char        *get();         // read the sequence
446    AD_ERR      *put();         // write the internal cash to the database
447    AD_ERR      *create(void);
448    AD_ERR      *changemode(AD_EDITMODI mod);
449    AD_EDITMODI  mode();
450    AD_MAIN *get_ad_main() { return ad_cont->get_ad_main(); };
451
452    int     s_inited();
453    int     time_stamp(void);
454    int     len();
455    // EDITIERFUNKTINEN
456    // position ab 0 bis strlen(seq)
457    //
458    AD_ERR *insert(char *,long position, int direction);
459    AD_ERR *remove(int len,long position, int direction);
460    AD_ERR *replace(char *text,long position, int direction);
461    AD_ERR *swap_gaps(long position, char ch);
462    AD_ERR *command( AW_key_mod keymod, AW_key_code keycode, char key, int direction, long &cursorpos, int & changed_flag);
463};
464
465#else
466#error arbdb++.hxx included twice
467#endif // ARBDBPP_HXX
Note: See TracBrowser for help on using the repository browser.