Update sdb from git
This commit is contained in:
parent
ce4382abb7
commit
52990edf37
10 changed files with 210 additions and 20 deletions
|
|
@ -1,7 +1,7 @@
|
|||
DESTDIR?=
|
||||
PREFIX?=/usr
|
||||
|
||||
VERSION=0.5
|
||||
VERSION=0.5.1
|
||||
|
||||
CFLAGS+=-DVERSION=\"${VERSION}\"
|
||||
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
#define SDB_VERSION "0.5"
|
||||
#define SDB_VERSION "0.5.1"
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
119
libr/db/sdb/src/sdba.c
Normal 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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
#define SDB_VERSION "0.5"
|
||||
#define SDB_VERSION "0.5.1"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue