Update sdb from git

This commit is contained in:
pancake 2013-03-20 03:52:59 +01:00
parent ce4382abb7
commit 52990edf37
10 changed files with 210 additions and 20 deletions

View file

@ -1,7 +1,7 @@
DESTDIR?=
PREFIX?=/usr
VERSION=0.5
VERSION=0.5.1
CFLAGS+=-DVERSION=\"${VERSION}\"

View file

@ -2,8 +2,8 @@ include ../config.mk
CFLAGS+= -g -ggdb
LDFLAGS+= -g -ggdb
#CFLAGS+=-DOLDFMT=1
OBJ=alloc.o cdb.o buffer.o cdb_make.o ls.o ht.o sdb.o sdbn.o lock.o
OBJ+=json.o json/js0n.o json/json.o json/rangstr.o ns.o
OBJ=alloc.o cdb.o buffer.o cdb_make.o ls.o ht.o sdb.o sdbn.o sdba.o
OBJ+=json.o json/js0n.o json/json.o json/rangstr.o ns.o lock.o
BIN=sdb${EXEXT}

View file

@ -1,9 +1,10 @@
/* Copyleft 2011-2012 - sdb (aka SimpleDB) - pancake<nopcode.org> */
/* Copyleft 2011-2013 - sdb (aka SimpleDB) - pancake<nopcode.org> */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
//#include <sys/file.h>
static char buf[128];
@ -31,12 +32,18 @@ int sdb_lock(const char *s) {
void sdb_lock_wait(const char *s) {
// TODO use flock() here
while (!sdb_lock (s)) {
#if __WIN32__ || __CYGWIN__ || MINGW32
while (!sdb_lock (s)) {
// usleep (100); // hack
}
Sleep (500); // hack
}
#else
// TODO flock (fd, LOCK_EX);
#endif
}
void sdb_unlock(const char *s) {
//flock (fd, LOCK_UN);
unlink (s);
}

View file

@ -1 +1 @@
#define SDB_VERSION "0.5"
#define SDB_VERSION "0.5.1"

View file

@ -1,4 +1,4 @@
/* Copyleft 2011-2012 - sdb (aka SimpleDB) - pancake<nopcode.org> */
/* Copyleft 2011-2013 - sdb - pancake */
#include <stdio.h>
#include <string.h>
@ -435,10 +435,52 @@ int sdb_finish (Sdb *s) {
int sdb_query (Sdb *s, const char *cmd) {
char *p, *eq, *ask = strchr (cmd, '?');
const char *p2;
int save = 0;
int i, save = 0;
ut64 n;
switch (*cmd) {
case '[': // inc
p = strchr (cmd, ']');
if (p) {
*p = 0;
eq = strchr (p+1, '=');
if (cmd[1]) {
i = atoi (cmd+1);
if (eq) {
*eq = 0;
if (eq[1]) {
sdb_aset (s, p+1, i, eq+1);
} else {
sdb_adel (s, p+1, i);
}
} else {
char *val = sdb_aget (s, p+1, i);
printf ("%s\n", val);
free (val);
}
} else {
if (eq) {
char *q, *out = strdup (eq+1);
*eq = 0;
// TODO: define new printable separator character
for (q=out;*q;q++) if (*q==',') *q = SDB_RS;
sdb_set (s, p+1, out, 0);
free (out);
} else {
int hasnext = 1;
char *ptr, *list = sdb_get (s, p+1, 0);
ptr = list;
hasnext = list && *list;
while (hasnext) {
char *str = sdb_astring (ptr, &hasnext);
printf ("%s\n", str);
ptr = (char *)sdb_anext (str);
}
free (list);
}
}
} else fprintf (stderr, "Missing ']'.\n");
break;
case '+': // inc
n = ask?
sdb_json_inc (s, cmd+1, ask, 1, 0):

View file

@ -12,6 +12,8 @@ extern "C" {
#include "sdb-version.h"
#define SDB_RS '\x1e'
typedef struct sdb_ns_t {
// todo. store last used
// todo. sync?
@ -34,7 +36,6 @@ typedef struct sdb_t {
SdbList *ns;
} Sdb;
// XXX: use buckets here, drop these limits
#define SDB_BLOCK 4096
#define SDB_KSZ 64
@ -121,6 +122,17 @@ void sdb_ns_init(Sdb *s);
void sdb_ns_free(Sdb *s);
void sdb_ns_sync (Sdb *s);
// array
int sdb_aset(Sdb *s, const char *key, int idx, const char *val);
char *sdb_aget(Sdb *s, const char *key, int idx);
int sdb_adel(Sdb *s, const char *key, int n);
// helpers
const char *sdb_anext(const char *str);
char *sdb_astring(char *str, int *hasnext);
int sdb_alen(const char *str);
// iter
const char *sdb_anext(const char *str);
#ifdef __cplusplus
}
#endif

119
libr/db/sdb/src/sdba.c Normal file
View file

@ -0,0 +1,119 @@
/* Copyleft 2011-2013 - sdb - pancake */
#include "sdb.h"
#if 0
list=foo,bar,cow
list[0]
int hasnext;
char *ptr, *list = sdb_get (db, "list");
ptr = list;
do {
char *str = sdb_astring (ptr, &hasnext);
printf ("--> %s\n", str);
ptr = str_anext (ptr);
} while (hasnext);
free (list);
#endif
const char *sdb_anext(const char *str) {
return str+strlen(str)+1;
}
char *sdb_astring(char *str, int *hasnext) {
char *p = strchr (str, SDB_RS);
if (!p) {
if (hasnext) *hasnext = 0;
return str;
}
*p = 0;
if (hasnext) *hasnext = 1;
return str;
}
char *sdb_aget(Sdb *s, const char *key, int idx) {
int i, len;
const char *str = sdb_getc (s, key, 0);
char *o, *n, *p = (char*)str;
if (!str || !*str) return NULL;
if (idx==0) {
n = strchr (str, SDB_RS);
if (!n) return strdup (str);
len = n-str+1;
o = malloc (len);
memcpy (o, str, len);
o[len] = 0;
return o;
}
for (i=0; i<idx; i++) {
n = strchr (p, SDB_RS);
if (!n) return NULL;
p = n+1;
}
if (!p) return NULL;
n = strchr (p, SDB_RS);
if (!n) return strdup (p);
len = n-p+1;
o = malloc (len);
memcpy (o, p, len);
o[len] = 0;
return o;
}
int sdb_aset(Sdb *s, const char *key, int idx, const char *val) {
const char *str = sdb_getc (s, key, 0);
int lstr, lval, ret = 0;
if (!str || !*str)
return sdb_set (s, key, val, 0);
lval = strlen (val);
lstr = strlen (str);
if (idx==-1) {
char *x = malloc (lval + lstr + 2);
memcpy (x, str, lstr);
x[lstr] = SDB_RS;
memcpy (x+lstr+1, val, lval+1);
ret = sdb_set (s, key, x, 0);
free (x);
} else if (idx == 0) {
char *x = malloc (lval + lstr + 2);
memcpy (x, val, lval);
x[lval] = SDB_RS;
memcpy (x+lval+1, str, lstr+1);
ret = sdb_set (s, key, x, 0);
free (x);
} else {
fprintf (stderr, "TODO: sdb_aset (idx>0)\n");
}
return ret;
}
int sdb_adel(Sdb *s, const char *key, int idx) {
int i;
char *p, *n, *str = sdb_get (s, key, 0);
p = str;
if (!str || !*str) return 0;
if (idx<0) idx = sdb_alen (str);
for (i = 0; i<idx; i++) {
n = strchr (p, SDB_RS);
if (n) p = n+1;
else return 0;;
}
n = strchr (p, SDB_RS);
if (n) strcpy (p, n+1);
else *p = 0;
sdb_set (s, key, str, 0);
free (str);
return 1;
}
int sdb_alen(const char *str) {
int len = 0;
const char *n, *p = str;
for (len=0; ; len++) {
n = strchr (p, SDB_RS);
if (n) p = n+1;
else break;
}
return len;
}

View file

@ -2,10 +2,10 @@
#include "types.h"
int sdb_nexists (Sdb *s, const char *key) {
char c, *o = sdb_get (s, key, NULL);
char c;
const char *o = sdb_getc (s, key, NULL);
if (!o) return 0;
c = *o;
free (o);
return c>='0' && c<='9';
}
@ -28,12 +28,12 @@ static void __ulltoa(ut64 n, char *s) {
ut64 sdb_getn(Sdb *s, const char *key, ut32 *cas) {
ut64 n;
char *p, *v = sdb_get (s, key, cas);
char *p;
const char *v = sdb_getc (s, key, cas);
if (!v) return 0LL;
n = strtoull (v, &p, 10);
if (!p) return 0LL;
//XXX sdb_setn (s, key, n);
free (v);
return n;
}
@ -46,10 +46,8 @@ int sdb_setn(Sdb *s, const char *key, ut64 v, ut32 cas) {
ut64 sdb_inc(Sdb *s, const char *key, ut64 n2, ut32 cas) {
ut32 c;
ut64 n = sdb_getn (s, key, &c);
if (cas && c != cas)
return 0LL;
if (-n2<n)
return 0LL;
if (cas && c != cas) return 0LL;
if (-n2<n) return 0LL;
n += n2;
sdb_setn (s, key, n, cas);
return n;

View file

@ -1 +1 @@
#define SDB_VERSION "0.5"
#define SDB_VERSION "0.5.1"

View file

@ -12,6 +12,8 @@ extern "C" {
#include "sdb-version.h"
#define SDB_RS '\x1e'
typedef struct sdb_ns_t {
// todo. store last used
// todo. sync?
@ -34,7 +36,6 @@ typedef struct sdb_t {
SdbList *ns;
} Sdb;
// XXX: use buckets here, drop these limits
#define SDB_BLOCK 4096
#define SDB_KSZ 64
@ -121,6 +122,17 @@ void sdb_ns_init(Sdb *s);
void sdb_ns_free(Sdb *s);
void sdb_ns_sync (Sdb *s);
// array
int sdb_aset(Sdb *s, const char *key, int idx, const char *val);
char *sdb_aget(Sdb *s, const char *key, int idx);
int sdb_adel(Sdb *s, const char *key, int n);
// helpers
const char *sdb_anext(const char *str);
char *sdb_astring(char *str, int *hasnext);
int sdb_alen(const char *str);
// iter
const char *sdb_anext(const char *str);
#ifdef __cplusplus
}
#endif