Update sdb from git and fix 'test.cparse'

This commit is contained in:
pancake 2014-02-08 03:09:03 +01:00
parent 3ff4490222
commit 8b40a53080
18 changed files with 141 additions and 148 deletions

View File

@ -21,7 +21,7 @@ extern void cdb_alloc_free(void*);
extern int cdb_alloc_re(void);
/* TODO THIS MUST GTFO! */
int getkvlen(int fd, ut32 *klen, ut32 *vlen);
int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen);
#define CDB_HASHSTART 5381
struct cdb {

View File

@ -117,7 +117,7 @@ ut32 sdb_hash (const char *key, int klen);
/* json api */
char *sdb_json_get (Sdb* s, const char *key, const char *p, ut32 *cas);
int sdb_json_geti (Sdb* s, const char *k, const char *p);
int sdb_json_geti (Sdb* s, const char *k, const char *p, ut32 *cas);
int sdb_json_seti (Sdb* s, const char *k, const char *p, int v, ut32 cas);
int sdb_json_set (Sdb* s, const char *k, const char *p, const char *v, ut32 cas);

View File

@ -1,8 +1,7 @@
#ifndef UINT32_H
#define UINT32_H
#ifndef _INCLUDE_TYPES_H_
#define _INCLUDE_TYPES_H_
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -22,7 +21,6 @@
#define DIRSEP '/'
#endif
#ifndef UNUSED
#ifdef __GNUC__
#define UNUSED __attribute__((__unused__))
@ -50,18 +48,10 @@
#include "config.h"
#define SET 0 /* sigh */
#define CUR 1 /* sigh */
#define seek_cur(fd) (lseek((fd), 0, CUR))
#define seek_begin(fd) (seek_set ((fd), (off_t) 0))
static inline int seek_set(int fd, off_t pos) {
return (fd==-1 || lseek (fd, (off_t) pos, SET) == -1)? 0:1;
return (fd==-1 || lseek (fd, (off_t) pos, SEEK_SET) == -1)? 0:1;
}
#define byte_equal(s,n,t) (!byte_diff((s),(n),(t)))
#define byte_copy(d,l,s) memcpy(d,s,l)
#define byte_diff(d,l,s) memcmp(d,s,l)
static inline void ut32_pack(char s[4], ut32 u) {
s[0] = u & 255;
u >>= 8;

View File

@ -25,7 +25,7 @@ R_API boolt r_file_is_regular(const char *str) {
return R_FALSE;
if (stat (str, &buf)==-1)
return R_FALSE;
return ((S_IFREG & buf.st_mode))? R_TRUE: R_FALSE;
return ((S_IFREG & buf.st_mode)==S_IFREG)? R_TRUE: R_FALSE;
}
R_API boolt r_file_is_directory(const char *str) {

View File

@ -32,12 +32,12 @@ int buffer_flush(buffer *s) {
int buffer_putalign(buffer *s, const char *buf, ut32 len) {
ut32 n;
while (len > (n = s->n - s->p)) {
byte_copy (s->x + s->p, n, buf);
memcpy (s->x + s->p, buf, n);
s->p += n; buf += n; len -= n;
if (!buffer_flush (s)) return 0;
}
/* now len <= s->n - s->p */
byte_copy (s->x + s->p, len, buf);
memcpy (s->x + s->p, buf, len);
s->p += len;
return 1;
}

View File

@ -9,7 +9,7 @@
#endif
/* XXX: this code must be rewritten . too slow */
int getkvlen(int fd, ut32 *klen, ut32 *vlen) {
int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen) {
ut8 buf[4];
if (fd == -1 || read (fd, buf, 4) != 4)
return 0;
@ -56,7 +56,7 @@ int cdb_read(struct cdb *c, char *buf, ut32 len, ut32 pos) {
if (c->map) {
if ((pos > c->size) || (c->size - pos < len))
return 0;
byte_copy (buf, len, c->map + pos);
memcpy (buf, c->map + pos, len);
return 1;
}
if (!seek_set (c->fd, pos))
@ -77,7 +77,7 @@ static int match(struct cdb *c, const char *key, ut32 len, ut32 pos) {
int n = (szb>len)? len: szb;
if (!cdb_read (c, buf, n, pos))
return -1;
if (byte_diff (buf, n, key))
if (memcmp (buf, key, n))
return 0;
pos += n;
key += n;
@ -95,9 +95,8 @@ int cdb_findnext(struct cdb *c, ut32 u, const char *key, unsigned int len) {
if (!cdb_read (c, buf, 8, (u << 3) & 2047))
return -1;
ut32_unpack (buf + 4, &c->hslots);
if (!c->hslots) {
if (!c->hslots)
return 0;
}
ut32_unpack (buf, &c->hpos);
c->khash = u;
u = ((u>>8)%c->hslots)<<3;
@ -117,7 +116,7 @@ int cdb_findnext(struct cdb *c, ut32 u, const char *key, unsigned int len) {
if (u == c->khash) {
if (!seek_set (c->fd, pos))
return -1;
if (!getkvlen (c->fd, &u, &c->dlen))
if (!cdb_getkvlen (c->fd, &u, &c->dlen))
return -1;
if (u == 0)
return -1;

View File

@ -21,7 +21,7 @@ extern void cdb_alloc_free(void*);
extern int cdb_alloc_re(void);
/* TODO THIS MUST GTFO! */
int getkvlen(int fd, ut32 *klen, ut32 *vlen);
int cdb_getkvlen(int fd, ut32 *klen, ut32 *vlen);
#define CDB_HASHSTART 5381
struct cdb {

View File

@ -159,7 +159,7 @@ int cdb_make_finish(struct cdb_make *c) {
}
if (!buffer_flush (&c->b)) return 0;
if (!seek_begin (c->fd)) return 0;
if (!seek_set (c->fd, 0)) return 0;
// free chills
for (x = c->head; x;) {

View File

@ -1,8 +1,7 @@
/* sdb - LGPLv3 - Copyright 2012-2013 - pancake */
/* sdb - LGPLv3 - Copyright 2012-2014 - pancake */
#include <stdarg.h>
#include "sdb.h"
//#include "json/json.h"
#include "json/api.c"
#include "json/js0n.c"
#include "json/path.c"
@ -43,19 +42,25 @@ SDB_API char *sdb_json_get (Sdb *s, const char *k, const char *p, ut32 *cas) {
}
SDB_API int sdb_json_inc(Sdb *s, const char *k, const char *p, int n, ut32 cas) {
int cur = sdb_json_geti (s, k, p);
ut32 c;
int cur = sdb_json_geti (s, k, p, &c);
if (cas && c != cas)
return 0;
sdb_json_seti (s, k, p, cur+n, cas);
return cur+n;
}
SDB_API int sdb_json_dec(Sdb *s, const char *k, const char *p, int n, ut32 cas) {
int cur = sdb_json_geti (s, k, p);
ut32 c;
int cur = sdb_json_geti (s, k, p, &c);
if (cas && c != cas)
return 0;
sdb_json_seti (s, k, p, cur-n, cas);
return cur-n;
}
SDB_API int sdb_json_geti (Sdb *s, const char *k, const char *p) {
char *v = sdb_get (s, k, 0); // XXX cas
SDB_API int sdb_json_geti (Sdb *s, const char *k, const char *p, ut32 *cas) {
char *v = sdb_get (s, k, cas);
if (v) {
Rangstr rs = json_get (v, p);
return rangstr_int (&rs);
@ -174,18 +179,13 @@ SDB_API char *sdb_json_unindent(const char *s) {
memset (O, 0, len);
for (o=O; *s; s++) {
if (instr) {
if (s[0] == '"') {
instr = 0;
} else {
if (s[0] != '"') {
if (s[0] == '\\' && s[1] == '"')
*o++ = *s;
}
} else instr = 0;
*o++ = *s;
continue;
} else {
if (s[0] == '"')
instr = 1;
}
} else if (s[0] == '"') instr = 1;
if (*s == '\n'|| *s == '\r' || *s == '\t' || *s == ' ')
continue;
*o++ = *s;
@ -195,11 +195,11 @@ SDB_API char *sdb_json_unindent(const char *s) {
}
SDB_API const char *sdb_json_format(SdbJsonString* s, const char *fmt, ...) {
va_list ap;
char *arg_s, *x, tmp[128];
float arg_f;
unsigned long long arg_l;
int i, arg_i;
float arg_f;
va_list ap;
#define JSONSTR_ALLOCATE(y) \
if (s->len+y>s->blen) {\

View File

@ -1,10 +1,12 @@
/* sdb - LGPLv3 - Copyright 2007-2013 - pancake */
/* sdb - LGPLv3 - Copyright 2007-2014 - pancake */
#include <string.h>
#include "ls.h"
SDB_API SdbList *ls_new() {
SdbList *list = R_NEW (SdbList);
if (!list)
return NULL;
list->head = NULL;
list->tail = NULL;
list->free = free; // HACK
@ -14,7 +16,7 @@ SDB_API SdbList *ls_new() {
SDB_API void ls_delete (SdbList *list, SdbListIter *iter) {
if (iter==NULL) {
printf ("ls_delete: null iter?\n");
fprintf (stderr, "ls_delete: null iter?\n");
return;
}
ls_split_iter (list, iter);
@ -41,12 +43,10 @@ SDB_API void ls_destroy (SdbList *list) {
SdbListIter *next = it->n;
ls_delete (list, it);
it = next;
// free (it);
}
list->head = list->tail = NULL;
list->length = 0;
}
//free (list);
}
SDB_API void ls_free (SdbList *list) {
@ -56,9 +56,13 @@ SDB_API void ls_free (SdbList *list) {
free (list);
}
// XXX: Too slow?
SDB_API SdbListIter *ls_append(SdbList *list, void *data) {
SdbListIter *it = R_NEW (SdbListIter);
SdbListIter *it;
if (!list)
return NULL;
it = R_NEW (SdbListIter);
if (!it)
return NULL;
if (list->tail)
list->tail->n = it;
it->data = data;
@ -72,15 +76,16 @@ SDB_API SdbListIter *ls_append(SdbList *list, void *data) {
}
SDB_API SdbListIter *ls_prepend(SdbList *list, void *data) {
SdbListIter *new = R_NEW (SdbListIter);
SdbListIter *it = R_NEW (SdbListIter);
if (!it) return NULL;
if (list->head)
list->head->p = new;
new->data = data;
new->n = list->head;
new->p = NULL;
list->head = new;
list->head->p = it;
it->data = data;
it->n = list->head;
it->p = NULL;
list->head = it;
if (list->tail == NULL)
list->tail = new;
list->tail = it;
list->length++;
return new;
return it;
}

View File

@ -12,7 +12,8 @@ static Sdb *s = NULL;
static void terminate(int sig UNUSED) {
if (!s) return;
if (save) sdb_sync (s);
if (save && !sdb_sync (s))
exit (1);
sdb_free (s);
exit (0);
}
@ -57,12 +58,12 @@ static int sdb_dump (const char *db, int qf) {
return 0;
}
static void createdb(const char *f) {
static int createdb(const char *f) {
char *line, *eq;
s = sdb_new (NULL, f, 0);
if (!sdb_create (s)) {
printf ("Cannot create database\n");
exit (1);
if (!s || !sdb_create (s)) {
fprintf (stderr, "Cannot create database\n");
return 1;
}
for (;(line = stdin_gets ());) {
if ((eq = strchr (line, '='))) {
@ -72,6 +73,7 @@ static void createdb(const char *f) {
free (line);
}
sdb_finish (s);
return 0;
}
static void showusage(int o) {
@ -107,7 +109,7 @@ int main(int argc, const char **argv) {
if (!strcmp (argv[2], "[]")) {
return sdb_dump (argv[1], 1);
} if (!strcmp (argv[2], "="))
createdb (argv[1]);
return createdb (argv[1]);
else if (!strcmp (argv[2], "-")) {
if ((s = sdb_new (NULL, argv[1], 0))) {
for (;(line = stdin_gets ());) {
@ -115,7 +117,9 @@ int main(int argc, const char **argv) {
free (line);
}
}
} else if ((s = sdb_new (NULL, argv[1], 0))) {
} else {
s = sdb_new (NULL, argv[1], 0);
if (!s) return 1;
for (i=2; i<argc; i++)
save = sdb_query (s, argv[i]);
}

View File

@ -66,6 +66,7 @@ SDB_API char *sdb_querys (Sdb *s, char *buf, size_t len, const char *cmd) {
if (*cmd == '.') {
sdb_query_file (s, cmd+1);
return buf;
} else
if (*cmd == '+' || *cmd == '-') {
d = 1;
@ -95,8 +96,8 @@ SDB_API char *sdb_querys (Sdb *s, char *buf, size_t len, const char *cmd) {
buf = malloc (0xff);
snprintf (buf, 0xff, "%"ULLFMT"d", n);
}
return buf;
}
return buf;
} else if (*cmd == '[') {
// [?] - count elements of array
if (cmd[1]=='?') {
@ -171,6 +172,7 @@ SDB_API char *sdb_querys (Sdb *s, char *buf, size_t len, const char *cmd) {
*buf = 0;
return buf;
}
return NULL;
} else {
/* (3)foo */
const char *out = sdb_getc (s, p, 0);

View File

@ -1,13 +1,12 @@
/* sdb - LGPLv3 - Copyright 2011-2014 - pancake */
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include "sdb.h"
// XXX: deprecate, or use the one inside Sdb*
@ -29,20 +28,22 @@ SDB_API void sdb_global_hook(SdbHook hook, void *user) {
// TODO: use mmap instead of read.. much faster!
SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) {
Sdb* s;
s = malloc (sizeof (Sdb));
struct stat st = {0};
Sdb* s = R_NEW (Sdb);
if (name && *name) {
if (path && *path) {
s->dir = malloc (strlen (path) + strlen (name)+2);
strcpy (s->dir, path);
strcat (s->dir, "/");
strcat (s->dir, name);
int plen = strlen (path);
int nlen = strlen (name);
s->dir = malloc (plen+nlen+2);
memcpy (s->dir, path, plen);
s->dir[plen] = '/';
memcpy (s->dir+plen+1, name, nlen+1);
} else s->dir = strdup (name);
if (lock && !sdb_lock (sdb_lockfile (s->dir))) {
free (s->dir);
free (s);
return NULL;
}
if (lock && !sdb_lock (sdb_lockfile (s->dir)))
goto fail;
if (stat (s->dir, &st)!=-1)
if ((S_IFREG & st.st_mode)!=S_IFREG)
goto fail;
s->fd = open (s->dir, O_RDONLY|O_BINARY);
// if (s->fd == -1) // must fail if we cant open for write in sync
s->name = strdup (name);
@ -56,6 +57,7 @@ SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) {
s->fdump = -1;
s->ndump = NULL;
s->ns = ls_new (); // TODO: should be NULL
if (!s->ns) goto fail;
s->hooks = NULL;
s->ht = ht_new ((SdbListFree)sdb_kv_free);
s->lock = lock;
@ -68,6 +70,10 @@ SDB_API Sdb* sdb_new (const char *path, const char *name, int lock) {
cdb_init (&s->db, s->fd);
cdb_findstart (&s->db);
return s;
fail:
free (s->dir);
free (s);
return NULL;
}
// XXX: this is wrong. stuff not stored in memory is lost
@ -184,8 +190,7 @@ SDB_API char *sdb_get (Sdb* s, const char *key, ut32 *cas) {
if (!cdb_findnext (&s->db, hash, key, keylen))
return NULL;
len = cdb_datalen (&s->db);
if (len == 0)
if (!(len = cdb_datalen (&s->db)))
return NULL;
if (!(buf = malloc (len+1))) // XXX too many mallocs
return NULL;
@ -248,7 +253,7 @@ SDB_API void sdb_reset (Sdb* s) {
}
// TODO: too many allocs here. use slices
SdbKv* sdb_kv_new (const char *k, const char *v) {
SDB_API SdbKv* sdb_kv_new (const char *k, const char *v) {
int vl = strlen (v)+1;
SdbKv *kv = R_NEW (SdbKv);
strncpy (kv->key, k, sizeof (kv->key)-1);
@ -268,8 +273,9 @@ SDB_API int sdb_set (Sdb* s, const char *key, const char *val, ut32 cas) {
SdbHashEntry *e;
SdbKv *kv;
ut32 hash, klen;
if (!s || !key || !val)
if (!s || !key)
return 0;
if (!val) val = "";
klen = strlen (key)+1;
hash = sdb_hash (key, klen);
cdb_findstart (&s->db);
@ -288,6 +294,8 @@ SDB_API int sdb_set (Sdb* s, const char *key, const char *val, ut32 cas) {
sdb_hook_call (s, key, val);
return cas;
}
if (!*val)
return 0;
kv = sdb_kv_new (key, val);
kv->cas = nextcas ();
ht_insert (s->ht, hash, kv, NULL);
@ -310,17 +318,16 @@ SDB_API void sdb_foreach (Sdb* s, SdbForeachCallback cb, void *user) {
cb (user, o, p);
free (o);
free (p);
} else {
cb (user, kv->key, kv->value);
}
} else cb (user, kv->key, kv->value);
}
}
// TODO: reuse sdb_foreach
SDB_API void sdb_list (Sdb* s) {
SdbKv *kv;
SdbListIter *iter;
if (s && s->ht)
SdbKv *kv;
if (!s || !s->ht)
return;
ls_foreach (s->ht->list, iter, kv) {
if (!kv->value || !*kv->value)
continue;
@ -329,9 +336,7 @@ SDB_API void sdb_list (Sdb* s) {
for (o=p; *o; o++) if (*o==SDB_RS) *o = ',';
printf ("()%s=%s\n", kv->key, p);
free (p);
} else {
printf ("%s=%s\n", kv->key, kv->value);
}
} else printf ("%s=%s\n", kv->key, kv->value);
}
}
@ -374,6 +379,7 @@ SDB_API int sdb_sync (Sdb* s) {
return 0;
}
// TODO: optimize: do not use syscalls here
static int getbytes(int fd, char *b, int len) {
if (read (fd, b, len) != len)
return -1;
@ -382,10 +388,9 @@ static int getbytes(int fd, char *b, int len) {
}
SDB_API void sdb_dump_begin (Sdb* s) {
if (s->fd != -1) {
seek_set (s->fd, 0);
if (s->fd != -1)
seek_set (s->fd, (pos=2048));
} else pos = 0;
else pos = 0;
}
SDB_API SdbKv *sdb_dump_next (Sdb* s) {
@ -402,7 +407,9 @@ SDB_API SdbKv *sdb_dump_next (Sdb* s) {
SDB_API int sdb_dump_dupnext (Sdb* s, char **key, char **value) {
ut32 vlen, klen;
if (s->fd==-1 || !getkvlen (s->fd, &klen, &vlen))
if (s->fd==-1)
return 0;
if (!cdb_getkvlen (s->fd, &klen, &vlen))
return 0;
if (klen<1 || vlen<1)
return 0;
@ -438,22 +445,6 @@ SDB_API int sdb_dump_dupnext (Sdb* s, char **key, char **value) {
return 1;
}
SDB_API ut64 sdb_now () {
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_sec;
}
SDB_API ut64 sdb_unow () {
ut64 x;
struct timeval now;
gettimeofday (&now, NULL);
x = now.tv_sec;
x <<= 32;
x += now.tv_usec;
return x;
}
static ut64 parse_expire (ut64 e) {
const ut64 month = 30 * 24 * 60 * 60;
if (e>0 && e<month) e += sdb_now ();
@ -590,9 +581,7 @@ SDB_API int sdb_hook(Sdb* s, SdbHook cb, void* user) {
return 0;
i++;
}
} else {
s->hooks = ls_new ();
}
} else s->hooks = ls_new ();
ls_append (s->hooks, cb);
ls_append (s->hooks, user);
return 1;

View File

@ -117,7 +117,7 @@ ut32 sdb_hash (const char *key, int klen);
/* json api */
char *sdb_json_get (Sdb* s, const char *key, const char *p, ut32 *cas);
int sdb_json_geti (Sdb* s, const char *k, const char *p);
int sdb_json_geti (Sdb* s, const char *k, const char *p, ut32 *cas);
int sdb_json_seti (Sdb* s, const char *k, const char *p, int v, ut32 cas);
int sdb_json_set (Sdb* s, const char *k, const char *p, const char *v, ut32 cas);

View File

@ -136,11 +136,6 @@ SDB_API int sdb_aaddn(Sdb *s, const char *key, int idx, ut64 val, ut32 cas) {
}
SDB_API int sdb_aadd(Sdb *s, const char *key, int idx, const char *val, ut32 cas) {
/*
if (sdb_exists (s, key))
return 0;
*/
// TODO: use agetv here ?
if (sdb_aexists (s, key, val))
return 0;
return sdb_aset (s, key, idx, val, cas);
@ -298,20 +293,6 @@ SDB_API int sdb_aexists(Sdb *s, const char *key, const char *val) {
return found;
}
// TODO: make static inline?
SDB_API int sdb_alen(const char *str) {
int len = 1;
const char *n, *p = str;
if (!p|| !*p) return 0;
for (len=0; ; len++) {
n = strchr (p, SDB_RS);
if (!n) break;
p = n+1;
}
if (*p) len++;
return len;
}
SDB_API int sdb_alength(Sdb *s, const char *key) {
const char *str = sdb_getc (s, key, 0);
return sdb_alen (str);

View File

@ -1,8 +1,7 @@
#ifndef UINT32_H
#define UINT32_H
#ifndef _INCLUDE_TYPES_H_
#define _INCLUDE_TYPES_H_
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@ -22,7 +21,6 @@
#define DIRSEP '/'
#endif
#ifndef UNUSED
#ifdef __GNUC__
#define UNUSED __attribute__((__unused__))
@ -50,18 +48,10 @@
#include "config.h"
#define SET 0 /* sigh */
#define CUR 1 /* sigh */
#define seek_cur(fd) (lseek((fd), 0, CUR))
#define seek_begin(fd) (seek_set ((fd), (off_t) 0))
static inline int seek_set(int fd, off_t pos) {
return (fd==-1 || lseek (fd, (off_t) pos, SET) == -1)? 0:1;
return (fd==-1 || lseek (fd, (off_t) pos, SEEK_SET) == -1)? 0:1;
}
#define byte_equal(s,n,t) (!byte_diff((s),(n),(t)))
#define byte_copy(d,l,s) memcpy(d,s,l)
#define byte_diff(d,l,s) memcmp(d,s,l)
static inline void ut32_pack(char s[4], ut32 u) {
s[0] = u & 255;
u >>= 8;

View File

@ -1,6 +1,7 @@
/* sdb - LGPLv3 - Copyright 2011-2014 - pancake */
#include "sdb.h"
#include <sys/time.h>
// assert sdb_hash("hi", 2) == sdb_hash("hi", 0)
SDB_API ut32 sdb_hash(const char *s, int len) {
@ -46,3 +47,33 @@ SDB_API ut64 sdb_atoi(const char *s) {
return strtoull (s+2, &p, 16);
return strtoull (s, &p, 10);
}
// TODO: find better name for it
SDB_API int sdb_alen(const char *str) {
int len = 1;
const char *n, *p = str;
if (!p|| !*p) return 0;
for (len=0; ; len++) {
n = strchr (p, SDB_RS);
if (!n) break;
p = n+1;
}
if (*p) len++;
return len;
}
SDB_API ut64 sdb_now () {
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_sec;
}
SDB_API ut64 sdb_unow () {
ut64 x;
struct timeval now;
gettimeofday (&now, NULL);
x = now.tv_sec;
x <<= 32;
x += now.tv_usec;
return x;
}

View File

@ -17,9 +17,11 @@ struct Foo {
struct Cow c;
int d;
};
/*
int main(int argc, char **argv);
struct Foo foot = {0};
int boo = 3;
int main(int argc, char **argv) {
puts ("Hello World\n");
}
*/