RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 24-Sep-2009 21:09:50 Branch: HEAD Handle: 2009092419093709 Modified files: rpm/js rpmdbe-js.c rpmtxn-js.c rpm/js/tscripts Dbe.js Log: - js: add dbenv.failchk() and drill the spewage callbacks. Summary: Revision Changes Path 1.10 +171 -7 rpm/js/rpmdbe-js.c 1.4 +1 -1 rpm/js/rpmtxn-js.c 1.6 +3 -1 rpm/js/tscripts/Dbe.js ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/js/rpmdbe-js.c ============================================================================ $ cvs diff -u -r1.9 -r1.10 rpmdbe-js.c --- rpm/js/rpmdbe-js.c 24 Sep 2009 15:52:26 -0000 1.9 +++ rpm/js/rpmdbe-js.c 24 Sep 2009 19:09:37 -0000 1.10 @@ -3,6 +3,9 @@ */ #include "system.h" +#if defined(HAVE_FTOK) +#include <sys/ipc.h> /* XXX ftok(3) */ +#endif #include "rpmdbe-js.h" #include "rpmtxn-js.h" @@ -40,6 +43,99 @@ #define rpmdbe_wrappedobject NULL /* --- helpers */ +#define _TABLE(_v) { #_v, DB_EVENT_##_v } +static struct _events_s { + const char * n; + uint32_t v; +} _events[] = { + _TABLE(NO_SUCH_EVENT), /* 0 */ + _TABLE(PANIC), /* 1 */ + _TABLE(REG_ALIVE), /* 2 */ + _TABLE(REG_PANIC), /* 3 */ + _TABLE(REP_CLIENT), /* 4 */ + _TABLE(REP_ELECTED), /* 5 */ + _TABLE(REP_MASTER), /* 6 */ + _TABLE(REP_NEWMASTER), /* 7 */ + _TABLE(REP_PERM_FAILED), /* 8 */ + _TABLE(REP_STARTUPDONE), /* 9 */ + _TABLE(WRITE_FAILED), /* 10 */ + _TABLE(NO_SUCH_EVENT), /* 11 */ + _TABLE(NO_SUCH_EVENT), /* 12 */ + _TABLE(NO_SUCH_EVENT), /* 13 */ + _TABLE(NO_SUCH_EVENT), /* 14 */ + _TABLE(NO_SUCH_EVENT), /* 15 */ +}; +#undef _TABLE + +static void +rpmdbe_event_notify(DB_ENV * dbenv, u_int32_t event, void * event_info) +{ + JSObject * o = (dbenv ? dbenv->app_private : NULL); +fprintf(stderr, "==> %s(%p, %s(%u), %p) o %p\n", __FUNCTION__, dbenv, _events[event & 0xf].n, event, event_info, o); +} + +static void +rpmdbe_feedback(DB_ENV * dbenv, int opcode, int percent) +{ + JSObject * o = (dbenv ? dbenv->app_private : NULL); +fprintf(stderr, "==> %s(%p, %d, %d) o %p\n", __FUNCTION__, dbenv, opcode, percent, o); +} + +#define _TABLE(_v) { #_v, DB_TXN_##_v } +static struct _appops_s { + const char * n; + uint32_t v; +} _appops[] = { + _TABLE(ABORT), /* 0 */ + _TABLE(APPLY), /* 1 */ + { "UNKNOWN", 2 }, + _TABLE(BACKWARD_ROLL), /* 3 */ + _TABLE(FORWARD_ROLL), /* 4 */ + _TABLE(OPENFILES), /* 5 */ + _TABLE(POPENFILES), /* 6 */ + _TABLE(PRINT), /* 7 */ +}; +#undef _TABLE + +static int +rpmdbe_app_dispatch(DB_ENV * dbenv, DBT * log_rec, DB_LSN * lsn, db_recops op) +{ + JSObject * o = (dbenv ? dbenv->app_private : NULL); +fprintf(stderr, "==> %s(%p, %p, %p, %s(%d)) o %p\n", __FUNCTION__, dbenv, log_rec, lsn, _appops[op & 0x7].n, op, o); + return 0; +} + +static void +rpmdbe_errcall(const DB_ENV * dbenv, const char * errpfx, const char * msg) +{ + JSObject * o = (dbenv ? dbenv->app_private : NULL); +fprintf(stderr, "==> %s(%p, %s, %s) o %p\n", __FUNCTION__, dbenv, errpfx, msg, o); +} + +static void +rpmdbe_msgcall(const DB_ENV * dbenv, const char * msg) +{ + JSObject * o = (dbenv ? dbenv->app_private : NULL); +fprintf(stderr, "==> %s(%p, %s) o %p\n", __FUNCTION__, dbenv, msg, o); +} + +static int +rpmdbe_isalive(DB_ENV *dbenv, pid_t pid, db_threadid_t tid, u_int32_t flags) + /*...@*/ +{ + int alive = 1; /* assume all processes are alive */ + + switch (flags) { + case 0: + default: + /* XXX FIXME: check thread ID's */ + /*...@fallthrough@*/ + case DB_MUTEX_PROCESS_ONLY: + alive = (!(kill(pid, 0) < 0 && errno == ESRCH)); + break; + } + return alive; +} /* --- Object methods */ @@ -179,6 +275,43 @@ } static JSBool +rpmdbe_Failchk(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + void * ptr = JS_GetInstancePrivate(cx, obj, &rpmdbeClass, NULL); + DB_ENV * dbenv = ptr; + uint32_t _flags = 0; + JSBool ok = JS_FALSE; + +_METHOD_DEBUG_ENTRY(_debug); + + if (dbenv == NULL) goto exit; + *rval = JSVAL_VOID; + + if (!(ok = JS_ConvertArguments(cx, argc, argv, "/u", &_flags))) + goto exit; + + if (dbenv->app_private != NULL) { + int ret = dbenv->failchk(dbenv, _flags); + switch (ret) { + default: + dbenv->err(dbenv, ret, "DB_ENV->failchk"); + break; + case DB_RUNRECOVERY: + *rval = JSVAL_FALSE; + break; + case 0: + *rval = JSVAL_TRUE; + break; + } + } + + ok = JS_TRUE; + +exit: + return ok; +} + +static JSBool rpmdbe_FileidReset(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmdbeClass, NULL); @@ -407,6 +540,11 @@ goto exit; } else { dbenv->app_private = obj; + ret = dbenv->set_event_notify(dbenv, rpmdbe_event_notify); + if (ret) dbenv->err(dbenv, ret, "DB_ENV->set_event_notify"); + /* XXX only DB_RECOVER is currently implemented */ + ret = dbenv->set_feedback(dbenv, rpmdbe_feedback); + if (ret) dbenv->err(dbenv, ret, "DB_ENV->set_feedback"); *rval = JSVAL_TRUE; } } @@ -891,6 +1029,7 @@ JS_FS("close", rpmdbe_Close, 0,0,0), JS_FS("dbremove", rpmdbe_Dbremove, 0,0,0), JS_FS("dbrename", rpmdbe_Dbrename, 0,0,0), + JS_FS("failchk", rpmdbe_Failchk, 0,0,0), JS_FS("fileid_reset", rpmdbe_FileidReset, 0,0,0), JS_FS("lsn_reset", rpmdbe_LsnReset, 0,0,0), JS_FS("mutex_alloc", rpmdbe_MutexAlloc, 0,0,0), @@ -1316,9 +1455,17 @@ break; break; /* dbenv->add_data_dir() */ - case _DATADIRS: *vp = _PUT_S(dbenv->add_data_dir(dbenv, _s)); break; - case _CREATE_DIR: *vp = _PUT_S(dbenv->set_create_dir(dbenv, _s)); break; - case _ENCRYPT: *vp = _PUT_S(dbenv->set_encrypt(dbenv, _s, DB_ENCRYPT_AES)); break; + case _DATADIRS: + /* XXX duplicates? */ + *vp = _PUT_S(dbenv->add_data_dir(dbenv, _s)); + break; + case _CREATE_DIR: + /* XXX check datadirs to prevent failure? */ + *vp = _PUT_S(dbenv->set_create_dir(dbenv, _s)); + break; + case _ENCRYPT: + *vp = _PUT_S(dbenv->set_encrypt(dbenv, _s, DB_ENCRYPT_AES)); + break; case _ERRFILE: /* XXX FIXME: cleaner typing */ _fp = NULL; @@ -1344,9 +1491,21 @@ dbenv->set_errfile(dbenv, _fp); *vp = JSVAL_TRUE; break; - /* XXX FIXME: if string, use ftok(3) */ - case _SHMKEY: *vp = _PUT_L(dbenv->set_shm_key(dbenv, _l)); break; - case _THREADCNT: *vp = _PUT_U(dbenv->set_thread_count(dbenv, _u)); break; + case _SHMKEY: +#if defined(HAVE_FTOK) + if (JSVAL_IS_STRING(*vp) && _s != NULL) + _l = ftok(_s, 0); +#endif + *vp = _PUT_L(dbenv->set_shm_key(dbenv, _l)); + break; + case _THREADCNT: + if (JSVAL_IS_INT(*vp) && _u >= 8 && !dbenv->set_thread_count(dbenv, _u)) + { + int ret = dbenv->set_isalive(dbenv, (_u ? rpmdbe_isalive : NULL)); + *vp = (!ret ? JSVAL_TRUE : JSVAL_FALSE); + } else + *vp = JSVAL_FALSE; + break; #define _JUMP(_v, _lbl) _##_v: _nc = _v; goto _lbl case _JUMP(DB_SET_LOCK_TIMEOUT, _set_timeout); @@ -1517,10 +1676,15 @@ if (ret || dbenv == NULL || !JS_SetPrivate(cx, obj, (void *)dbenv)) { if (dbenv) - (void) dbenv->close(dbenv, _flags); + ret = dbenv->close(dbenv, _flags); /* XXX error msg */ dbenv = NULL; + } else { + dbenv->set_errcall(dbenv, rpmdbe_errcall); + dbenv->set_msgcall(dbenv, rpmdbe_msgcall); + ret = dbenv->set_app_dispatch(dbenv, rpmdbe_app_dispatch); + if (ret) dbenv->err(dbenv, ret, "DB_ENV->set_app_dispatch"); } if (_debug) @@ . patch -p0 <<'@@ .' Index: rpm/js/rpmtxn-js.c ============================================================================ $ cvs diff -u -r1.3 -r1.4 rpmtxn-js.c --- rpm/js/rpmtxn-js.c 24 Sep 2009 14:08:04 -0000 1.3 +++ rpm/js/rpmtxn-js.c 24 Sep 2009 19:09:38 -0000 1.4 @@ -14,7 +14,7 @@ #include "debug.h" /*...@unchecked@*/ -static int _debug = -1; +static int _debug = 0; /* Required JSClass vectors */ #define rpmtxn_addprop JS_PropertyStub @@ . patch -p0 <<'@@ .' Index: rpm/js/tscripts/Dbe.js ============================================================================ $ cvs diff -u -r1.5 -r1.6 Dbe.js --- rpm/js/tscripts/Dbe.js 24 Sep 2009 05:13:05 -0000 1.5 +++ rpm/js/tscripts/Dbe.js 24 Sep 2009 19:09:46 -0000 1.6 @@ -100,7 +100,7 @@ // ack('dbenv.max_openfd', 100); ack('dbenv.shm_key', -1); -ack('dbenv.shm_key = 0x1234', true); +ack('dbenv.shm_key = home', true); // ack('dbenv.shm_key', 0x1234); ack('dbenv.data_dirs', undefined); @@ -153,6 +153,8 @@ ack('dbenv.home', home); ack('dbenv.open_flags', eflags); +ack('dbenv.failchk()', true); + ack('dbenv.data_dirs', './data,.'); ack('dbenv.create_dir', '.'); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
