/* * Copyright 2001-2004 Brandon Long * All Rights Reserved. * * ClearSilver Templating System * * This code is made available under the terms of the ClearSilver License. * http://www.clearsilver.net/license.hdf * */ #ifndef __WDB_H_ #define __WDB_H_ 1 #include "util/skiplist.h" #include "util/dict.h" #include "util/ulist.h" #include <db.h> typedef struct _column { char *name; int ondisk_index; /* index# on disk, constant for life of db, must be 1 or higher */ int inmem_index; /* load time specific, needs to be flushed on alter table */ char type; } WDBColumn; typedef struct _row { int table_version; /* random number which maps to the same number of the table defn when loaded to verify they match */ char *key_value; int data_count; void *data[1]; } WDBRow; typedef struct _cursor { int table_version; /* random number which maps to the same number of the table defn when loaded to verify they match */ DBC *db_cursor; } WDBCursor; typedef struct _wdb { char *name; char *key; char *path; dictCtx attrs; dictCtx cols; skipList ondisk; ULIST *cols_l; DB *db; int last_ondisk; int defn_dirty; /* must save defn on destroy */ int table_version; /* random number which maps to the same number of the table defn when loaded/changed to verify they match */ } WDB; #define WDB_TYPE_STR 's' #define WDB_TYPE_INT 'i' #define WDBC_FIRST (1<<0) #define WDBC_NEXT (1<<1) #define WDBC_FIND (1<<2) #define WDBR_INSERT (1<<0) NEOERR * wdb_open (WDB **wdb, const char *name, int flags); NEOERR * wdb_save (WDB *wdb); NEOERR * wdb_update (WDB *wdb, const char *name, const char *key); NEOERR * wdb_create (WDB **wdb, const char *path, const char *name, const char *key, ULIST *col_def, int flags); void wdb_destroy (WDB **wdb); NEOERR * wdb_column_insert (WDB *wdb, int loc, const char *key, char type); NEOERR * wdb_column_delete (WDB *wdb, const char *name); NEOERR * wdb_column_update (WDB *wdb, const char *oldkey, const char *newkey); NEOERR * wdb_column_exchange (WDB *wdb, const char *key1, const char *key2); /* * function: wdb_keys * description: this function returns the key and column names for the * current database * input: wdb - open database * output: primary_key - pointer to the primary key * data - pointer to a ULIST of the columns. * both of these are allocated structures, you can clear data * with uListDestroy (data, ULIST_FREE) * return: STATUS_OK on no error or egerr.h error */ NEOERR * wdb_keys (WDB *wdb, char **primary_key, ULIST **data); NEOERR * wdb_attr_get (WDB *wdb, const char *key, char **value); NEOERR * wdb_attr_set (WDB *wdb, const char *key, const char *value); NEOERR * wdb_attr_next (WDB *wdb, char **key, char **value); NEOERR * wdbr_lookup (WDB *wdb, const char *key, WDBRow **row); NEOERR * wdbr_create (WDB *wdb, const char *key, WDBRow **row); NEOERR * wdbr_save (WDB *wdb, WDBRow *row, int flags); NEOERR * wdbr_delete (WDB *wdb, const char *key); NEOERR * wdbr_destroy (WDB *wdb, WDBRow **row); NEOERR * wdbr_get (WDB *wdb, WDBRow *row, const char *key, void **value); NEOERR * wdbr_set (WDB *wdb, WDBRow *row, const char *key, void *value); NEOERR * wdbr_dump (WDB *wdb, WDBRow *row); NEOERR * wdbr_next (WDB *wdb, WDBCursor *cursor, WDBRow **row, int flags); NEOERR * wdbr_find (WDB *wdb, WDBCursor *cursor, const char *key, WDBRow **row); NEOERR * wdbc_create (WDB *wdb, WDBCursor **cursor); NEOERR * wdbc_destroy (WDB *wdb, WDBCursor **cursor); #endif /* __WDB_H_ */