1 /*
2  * Copyright 2001-2004 Brandon Long
3  * All Rights Reserved.
4  *
5  * ClearSilver Templating System
6  *
7  * This code is made available under the terms of the ClearSilver License.
8  * http://www.clearsilver.net/license.hdf
9  *
10  */
11 
12 #ifndef __WDB_H_
13 #define __WDB_H_ 1
14 
15 #include "util/skiplist.h"
16 #include "util/dict.h"
17 #include "util/ulist.h"
18 #include <db.h>
19 
20 typedef struct _column
21 {
22   char *name;
23   int ondisk_index;       /* index# on disk, constant for life of db,
24 			     must be 1 or higher */
25   int inmem_index;        /* load time specific, needs to be flushed on
26 				 alter table */
27   char type;
28 } WDBColumn;
29 
30 typedef struct _row
31 {
32   int table_version;     /* random number which maps to the same number
33 			    of the table defn when loaded to verify they
34 			    match */
35   char *key_value;
36   int data_count;
37   void *data[1];
38 } WDBRow;
39 
40 typedef struct _cursor
41 {
42   int table_version;     /* random number which maps to the same number
43 			    of the table defn when loaded to verify they
44 			    match */
45   DBC *db_cursor;
46 } WDBCursor;
47 
48 typedef struct _wdb
49 {
50   char *name;
51   char *key;
52   char *path;
53   dictCtx attrs;
54   dictCtx cols;
55   skipList ondisk;
56   ULIST *cols_l;
57   DB *db;
58   int last_ondisk;
59   int defn_dirty;        /* must save defn on destroy */
60   int table_version;     /* random number which maps to the same number
61 			    of the table defn when loaded/changed to
62 			    verify they match */
63 } WDB;
64 
65 
66 #define WDB_TYPE_STR 's'
67 #define WDB_TYPE_INT 'i'
68 
69 #define WDBC_FIRST (1<<0)
70 #define WDBC_NEXT  (1<<1)
71 #define WDBC_FIND  (1<<2)
72 
73 #define WDBR_INSERT (1<<0)
74 
75 NEOERR * wdb_open (WDB **wdb, const char *name, int flags);
76 NEOERR * wdb_save (WDB *wdb);
77 NEOERR * wdb_update (WDB *wdb, const char *name, const char *key);
78 NEOERR * wdb_create (WDB **wdb, const char *path, const char *name,
79                      const char *key, ULIST *col_def, int flags);
80 void wdb_destroy (WDB **wdb);
81 NEOERR * wdb_column_insert (WDB *wdb, int loc, const char *key, char type);
82 NEOERR * wdb_column_delete (WDB *wdb, const char *name);
83 NEOERR * wdb_column_update (WDB *wdb, const char *oldkey, const char *newkey);
84 NEOERR * wdb_column_exchange (WDB *wdb, const char *key1, const char *key2);
85 
86 /*
87  * function: wdb_keys
88  * description: this function returns the key and column names for the
89  *              current database
90  * input: wdb - open database
91  * output: primary_key - pointer to the primary key
92  *         data - pointer to a ULIST of the columns.
93  *         both of these are allocated structures, you can clear data
94  *         with uListDestroy (data, ULIST_FREE)
95  * return: STATUS_OK on no error or egerr.h error
96  */
97 NEOERR * wdb_keys (WDB *wdb, char **primary_key, ULIST **data);
98 
99 NEOERR * wdb_attr_get (WDB *wdb, const char *key, char **value);
100 NEOERR * wdb_attr_set (WDB *wdb, const char *key, const char *value);
101 NEOERR * wdb_attr_next (WDB *wdb, char **key, char **value);
102 NEOERR * wdbr_lookup (WDB *wdb, const char *key, WDBRow **row);
103 NEOERR * wdbr_create (WDB *wdb, const char *key, WDBRow **row);
104 NEOERR * wdbr_save (WDB *wdb, WDBRow *row, int flags);
105 NEOERR * wdbr_delete (WDB *wdb, const char *key);
106 NEOERR * wdbr_destroy (WDB *wdb, WDBRow **row);
107 NEOERR * wdbr_get (WDB *wdb, WDBRow *row, const char *key, void **value);
108 NEOERR * wdbr_set (WDB *wdb, WDBRow *row, const char *key, void *value);
109 NEOERR * wdbr_dump (WDB *wdb, WDBRow *row);
110 NEOERR * wdbr_next (WDB *wdb, WDBCursor *cursor, WDBRow **row, int flags);
111 NEOERR * wdbr_find (WDB *wdb, WDBCursor *cursor, const char *key, WDBRow **row);
112 NEOERR * wdbc_create (WDB *wdb, WDBCursor **cursor);
113 NEOERR * wdbc_destroy (WDB *wdb, WDBCursor **cursor);
114 
115 #endif /* __WDB_H_ */
116