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]

Reply via email to