1 #ifndef _GCDBYANK_H
2 #define _GCDBYANK_H
3 
4 #include "gcdb.h"
5 #include <stdio.h>
6 #include "GFastaFile.h"
7 // FastaSeq class and *charFunc() callback type
8 
9 #define DEF_CDBREC_DELIM ">"
10 
11 #ifdef ENABLE_COMPRESSION
12 #include <zlib.h>
13 #define GCDBZ_SBUF_LEN 8192
14 #define GCDBZ_LBUF_LEN 8192*2
15 
16 class GCdbZFasta {
17  private:
18   char* recdelim;
19   char lbuf[GCDBZ_LBUF_LEN]; //larger buffer
20   char sbuf[GCDBZ_SBUF_LEN]; //smaller buffer
21   char* defline; //defline copy storage -- compression only
22   int defline_cap; //currently allocated length of defline
23   int defline_len; //currently      used length of defline
24   z_stream zstream; // de/compression stream
25   FILE* zf; //compressed file
26   long zpos; //current position in zf
27   int  zrecsize; // the size of the compressed record
28   GFastaCharHandler* chrhandler;
29  public:
30   GCdbZFasta(FILE* af, int zrsize=0, char* r_delim=DEF_CDBREC_DELIM);
31   ~GCdbZFasta();
getZFile()32   FILE* getZFile() { return zf; }
33   void decomp_start(int zrsize);
34   void decomp_end();
35   int decompress(FastaSeq& rec, int csize=0, int zfofs=-1, charFunc* seqCallBack=NULL);
36     // uncompress csize bytes from file zf, from optional file offset zfofs,
37     // and send the uncompressed stream to callbackFn
38 };
39 
40 #endif
41 
42 class GCdbYank {
43   char* idxfile;
44   //char* dbfile;
45   char* recdelim; //record delimiter -- typically ">"
46   int warnings;
47   bool is_compressed;
48   char* dbname;
49   char* info_dbname;
50   off_t db_size;
51   cdbInfo dbstat;
52   GCdbRead* cdb;
53  #ifdef ENABLE_COMPRESSION
54   GCdbZFasta* cdbz;
55  #endif
56   int fdb;
57   int fd;
58   FILE* fz; // if compressed
59   GFastaCharHandler* fastahandler;
60 #ifdef ENABLE_COMPRESSION
61  protected:
62    GCdbZFasta* openCdbz(char* p);
63 #endif
64  public:
65   GCdbYank(const char* fidx, const char* recsep=DEF_CDBREC_DELIM);
66   ~GCdbYank();
67   int getRecord(const char* key, FastaSeq& rec, charFunc* seqCallBack=NULL);
68   off_t getRecordPos(const char* key, uint32* record_len=NULL);
getDbName()69   char* getDbName() { return dbname; }
70 
71 };
72 
73 #endif
74