static void terminate(int sig UNUSED) { if (!s) return; if (save && !sdb_sync (s)) exit (1); sdb_free (s); exit (0); }
static void syncronize(int sig) { // TODO: must be in sdb_sync() or wat? Sdb *n; sdb_sync (s); n = sdb_new (s->dir, s->lock); sdb_free (s); s = n; }
static void syncronize(int sig UNUSED) { // TODO: must be in sdb_sync() or wat? Sdb *n; sdb_sync (s); n = sdb_new (s->path, s->name, s->lock); sdb_free (s); s = n; }
static void synchronize(int sig UNUSED) { // TODO: must be in sdb_sync() or wat? Sdb *n; sdb_sync (s); n = sdb_new (s->path, s->name, s->lock); if (n) { sdb_config (n, options); sdb_free (s); s = n; } }
static void syncronize(int sig UNUSED) { // TODO: must be in sdb_sync() or wat? Sdb *n; sdb_sync (s); n = sdb_new (s->path, s->name, s->lock); if (n) { sdb_config (n, SDB_OPTION_FS | SDB_OPTION_NOSTAMP); sdb_free (s); s = n; } }
static void terminate(int sig UNUSED) { if (!s) { return; } if (save && !sdb_sync (s)) { sdb_free (s); s = NULL; exit (1); } sdb_free (s); exit (0); }
int sdb_insert(sdb* db,slice* key,slice* value){ if(db->init==0) { if(init(db)==-1) return -1; } int rec_pos; int ret=sdb_idx_find(db,key,&rec_pos); if(ret==0) return -1; ret=sdb_dat_insert(db,key,value); if(ret==-1) return -1; ret=sdb_idx_insert(db,key,ret); if(ret==-1) return -1; if(db->auto_commit==1) if(-1==sdb_sync(db)) return -1; return 0; }
int main() { #define DBFILE "___syncget.db" const char *v; Sdb *s = sdb_new0(); unlink (DBFILE); sdb_set (s, "foo", "bar", 0); eprintf ("-> %s\n", sdb_get (s, "foo", NULL)); sdb_file (s, DBFILE); sdb_sync (s); v = sdb_const_get (s, "foo", NULL); if (v && !strcmp ("bar", v)) { eprintf ("OK syncget\n"); return 0; } eprintf ("ERROR syncget: Keys not accessible after sync\n"); return 1; }
int sdb_delete(sdb* db,slice* key){ if(db->init==0) { return -1; } int ret,rec_pos; ret=sdb_idx_find(db,key,&rec_pos); //fprintf(stderr,"rec_pos:%d\n",rec_pos); if(ret==-1) return -1; char c=DELETED; if(sdb_cache_setdat(db->dat_cache,rec_pos,&c,1)==-1) return -1; ret=sdb_idx_delete(db,key); if(ret==-1) return -1; if(db->auto_commit==1) if(-1==sdb_sync(db)) return -1; return 0; }
int sdb_replace(sdb* db,slice* key,slice* value){ if(db->init==0) { if(init(db)==-1) return -1; } int ret,rec_pos; ret=sdb_idx_find(db,key,&rec_pos); if(ret==-1) return -1; char c=DELETED; if(sdb_cache_setdat(db->dat_cache,rec_pos,&c,1)==-1) return -1; ret=sdb_dat_insert(db,key,value); if(ret==-1) return -1; ret=sdb_cache_setdat(db->idx_cache,db->cur_ptr+8+key->len,(char*)&ret,sizeof(int)); if(ret==-1) return -1; if(db->auto_commit==1) if(-1==sdb_sync(db)) return -1; return 0; }
static int init(sdb* db){ int idx_len=HEADER_LEN+DEF_IDX_HASHES*BUCKET_LEN; char buf[idx_len]; int tmp=-1; int len=strlen(db->path); strcpy(db->path+len-4,".dat"); int dat_fd,idx_fd; dat_fd=open(db->path,O_RDWR | O_CREAT |O_EXCL,MODE); if(dat_fd<0) return -1; strcpy(db->path+len-4,".idx"); idx_fd=open(db->path,O_RDWR | O_CREAT |O_EXCL,MODE); if(idx_fd<0) { close(dat_fd); return -1; } strcpy(db->path+len-4,".log"); db->dat_cache=sdb_cache_new(dat_fd,3,5,db->path,WAL_DAT); if(NULL==db->dat_cache) goto err; db->idx_cache=sdb_cache_new(idx_fd,3,5,db->path,WAL_IDX); if(NULL==db->idx_cache) { sdb_cache_free(db->dat_cache); goto err; } memset(buf,0,idx_len); if(-1==sdb_cache_append(db->idx_cache,buf,idx_len)) goto err2; if(-1==sdb_cache_append(db->dat_cache,(char*)&tmp,4)) goto err2; if(-1==sdb_sync(db)) goto err2; db->init=1; return 0; err2: sdb_cache_free(db->dat_cache); sdb_cache_free(db->idx_cache); err: close(dat_fd); close(idx_fd); return -1; }
R_API void r_anal_xrefs_save(RAnal *anal, const char *prjfile) { sdb_sync (anal->sdb_xrefs); }
static void terminate(int sig) { if (!s) return; if (save) sdb_sync (s); sdb_free (s); exit (0); }
R_API int r_core_project_save(RCore *core, const char *file) { int fd, fdold, tmp, ret = R_TRUE; char *prj; if (file == NULL || *file == '\0') return R_FALSE; prj = r_core_project_file (core, file); if (r_file_is_directory (prj)) { eprintf ("Error: Target is a directory\n"); free (prj); return R_FALSE; } r_core_project_init (core); r_anal_project_save (core->anal, prj); fd = r_sandbox_open (prj, O_BINARY|O_RDWR|O_CREAT, 0644); if (fd != -1) { fdold = r_cons_singleton ()->fdout; r_cons_singleton ()->fdout = fd; r_cons_singleton ()->is_interactive = R_FALSE; r_str_write (fd, "# r2 rdb project file\n"); r_str_write (fd, "# flags\n"); tmp = core->flags->space_idx; core->flags->space_idx = -1; r_flag_list (core->flags, R_TRUE); core->flags->space_idx = tmp; r_cons_flush (); r_str_write (fd, "# eval\n"); // TODO: r_str_writef (fd, "e asm.arch=%s", r_config_get ("asm.arch")); r_config_list (core->config, NULL, R_TRUE); r_cons_flush (); r_str_write (fd, "# sections\n"); r_io_section_list (core->io, core->offset, 1); r_cons_flush (); r_str_write (fd, "# meta\n"); r_meta_list (core->anal, R_META_TYPE_ANY, 1); r_cons_flush (); { char buf[1024]; snprintf (buf, sizeof (buf), "%s.d/xrefs", prj); sdb_file (core->anal->sdb_xrefs, buf); sdb_sync (core->anal->sdb_xrefs); } r_core_cmd (core, "ax*", 0); r_cons_flush (); r_core_cmd (core, "af*", 0); r_cons_flush (); r_core_cmd (core, "ah*", 0); r_cons_flush (); r_str_write (fd, "# seek\n"); r_str_writef (fd, "s 0x%08"PFMT64x, core->offset); r_cons_flush (); close (fd); r_cons_singleton ()->fdout = fdold; r_cons_singleton ()->is_interactive = R_TRUE; } else { eprintf ("Cannot open '%s' for writing\n", prj); ret = R_FALSE; } free (prj); return ret; }
R_API bool r_anal_xrefs_save(RAnal *anal, const char *prjDir) { char *xrefs_path = r_str_newf ("%s" R_SYS_DIR "xrefs.sdb", prjDir); sdb_file (anal->sdb_xrefs, xrefs_path); free (xrefs_path); return sdb_sync (anal->sdb_xrefs); }