//+ external get : t -> get_type -> get_flag list -> string * string //+ = "caml_cursor_get" value caml_cursor_get(value cursor, value vtype, value vflags) { CAMLparam3(cursor,vtype,vflags); CAMLlocal3(rpair,rkey,rdata); DBT key,data; int flags = Flag_val(vtype,cursor_get_type) | convert_flag_list(vflags,cursor_get_flags); int err; zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); test_cursor_closed(cursor); err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data,flags); if (err != 0) { if (err == DB_NOTFOUND) { raise_not_found(); } raise_db(db_strerror(err)); } rkey = alloc_string(key.size); memcpy (String_val(rkey), key.data, key.size); rdata = alloc_string(data.size); memcpy (String_val(rdata), data.data, data.size); rpair = alloc(2,0); Store_field(rpair,0,rkey); Store_field(rpair,1,rdata); CAMLreturn (rpair); }
//+ external get : t -> ?txn:txn -> string -> get_flag list -> string //+ = "caml_db_get" value caml_db_get(value db, value txn_opt, value vkey, value vflags) { CAMLparam4(db, txn_opt, vkey, vflags); DBT key,data; int flags, err; DB_TXN *txn; CAMLlocal1(rval); if (Is_None(txn_opt)) { txn = NULL; } else { test_txn_closed(Some_val(txn_opt)); txn = UW_txn(Some_val(txn_opt)); } test_db_closed(db); zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); key.data = String_val(vkey); key.size = string_length(vkey); flags = convert_flag_list(vflags, db_get_flags); err = UW_db(db)->get(UW_db(db), txn, &key, &data, flags); if (err != 0) { ////fprintf(stderr,"Error found: %d\n",err); fflush(stderr); if (err == DB_NOTFOUND) { raise_not_found(); } UW_db(db)->err(UW_db(db),err,"caml_db_get"); } // FIX: this currently uses an extra, unnecessary copy in order to simplify // memory management. rval = alloc_string(data.size); memcpy (String_val(rval), data.data, data.size); CAMLreturn (rval); }
//+ external init_both : t -> key:string -> data:string //+ -> get_flag list -> unit = "caml_cursor_init_both" value caml_cursor_init_both(value cursor, value vkey, value vdata , value vflags ) { CAMLparam4(cursor,vkey,vdata,vflags); DBT key,data; int flags; int err; /* int ctr = 0; */ flags = convert_flag_list(vflags,cursor_get_flags) | DB_GET_BOTH; test_cursor_closed(cursor); zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); key.data = String_val(vkey); key.size = string_length(vkey); data.data = String_val(vdata); data.size = string_length(vdata); err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data, flags); if (err != 0) { if (err == DB_NOTFOUND) { raise_not_found (); } raise_db(db_strerror(err)); } CAMLreturn (Val_unit); }
//+ external put : t -> ?txn:txn -> key:string -> data:string //+ -> put_flag list -> unit = "caml_db_put" value caml_db_put(value db, value txn_opt, value vkey, value vdata, value vflags) { CAMLparam5(db, txn_opt, vkey, vdata, vflags); DBT key, data; int flags, err; DB_TXN *txn; if (Is_None(txn_opt)) { txn = NULL; } else { test_txn_closed(Some_val(txn_opt)); txn = UW_txn(Some_val(txn_opt)); } test_db_closed(db); zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); key.data = String_val(vkey); key.size = string_length(vkey); data.data = String_val(vdata); data.size = string_length(vdata); flags = convert_flag_list(vflags, db_put_flags); err = UW_db(db)->put(UW_db(db), txn, &key, &data, flags); if (err != 0) { if (err == DB_KEYEXIST) {raise_key_exists();} UW_db(db)->err(UW_db(db),err,"caml_db_put"); } CAMLreturn (Val_unit); }
//+ external del : t -> ?txn:txn -> string -> unit = "caml_db_del" value caml_db_del(value db, value txn_opt, value key) { CAMLparam3(db,txn_opt,key); DBT dbt; // static keyword initializes record to zero. int err; DB_TXN *txn; if (Is_None(txn_opt)) { txn = NULL; } else { test_txn_closed(Some_val(txn_opt)); txn = UW_txn(Some_val(txn_opt)); } test_db_closed(db); zerob(&dbt,sizeof(DBT)); dbt.data = String_val(key); dbt.size = string_length(key); err = UW_db(db)->del(UW_db(db), txn, &dbt, 0); if (err != 0) { UW_db(db)->err(UW_db(db),err, "caml_db_del"); } CAMLreturn (Val_unit); }
//+ external put : t -> string -> put_flag -> unit //+ = "caml_cursor_put" value caml_cursor_put(value cursor, value vdata, value vflag) { CAMLparam3(cursor,vdata,vflag); DBT key, data; int flags, err; test_cursor_closed(cursor); zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); data.data = String_val(vdata); data.size = string_length(vdata); flags = Flag_val(vflag, cursor_put_flags); err = UW_cursor(cursor)->c_put(UW_cursor(cursor), &key, &data, flags); if (err != 0) { if (err == DB_KEYEXIST) { raise_key_exists(); } raise_db(db_strerror(err)); } CAMLreturn (Val_unit); }
//+ external init : t -> string -> get_flag list -> string //+ = "caml_cursor_init" value caml_cursor_init(value cursor, value vkey, value vflags) { CAMLparam3(cursor,vkey,vflags); CAMLlocal1(rval); DBT key,data; int flags = convert_flag_list(vflags,cursor_get_flags) | DB_SET; int err; test_cursor_closed(cursor); zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT)); key.data = String_val(vkey); key.size = string_length(vkey); err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data, flags); if (err != 0) { if (err == DB_NOTFOUND) { raise_not_found(); } raise_db(db_strerror(err)); } rval = alloc_string(data.size); memcpy (String_val(rval), data.data, data.size); CAMLreturn (rval); }
int main(int argc, char **argv) { int c, opt = 0; char *optf; int fd; ssize_t l; optf = NULL; opterr = 0; while ((c = getopt(argc, argv, "qrwd")) != -1) { switch (c) { case 'r': ifopt; opt = OPT_READ; break; case 'w': ifopt; opt = OPT_WRITE; break; case 'd': ifopt; opt = OPT_REMOVE; break; case 'q': quiet = 1; break; default: usage(); break; } } optf = *(argv+optind); if (!optf) usage(); /* sanity checks */ if (!seccheck(optf)) { errno = EACCES; xerror(optf); } snprintf(B, sizeof(B)-1, "%s/%s", CONFTOOL_BASE, optf); if (opt == OPT_REMOVE) { if (unlink(B) == -1) xerror(B); return 0; } fd = open(B, opt == OPT_WRITE ? O_WRONLY | O_TRUNC | O_CREAT : O_RDONLY, 0666); if (fd == -1) xerror(B); zerob(); if (!opt || opt == OPT_READ) { l = read(fd, B, sizeof(B)); if (l) write(1, B, l); } else if (opt == OPT_WRITE) { int x = 1; l = 0; if (*(argv+optind+x)) { while (*(argv+optind+x)) { l += strlen(*(argv+optind+x)); strncat(B, *(argv+optind+x), sizeof(B)-1-l); l++; strncat(B, " ", sizeof(B)-1-l); x++; } *(B+l-1) = '\n'; write(fd, B, l); } } close(fd); return 0; }