mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-20 22:34:39 +00:00
Update sdb from git and fix 'test.cparse'
This commit is contained in:
parent
3ff4490222
commit
8b40a53080
@ -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 {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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;) {
|
||||
|
@ -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) {\
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user