Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Modules/_bsddb.c

    r132 r391  
    6565 * http://www.python.org/peps/pep-0291.html
    6666 *
    67  * This module contains 6 types:
     67 * This module contains 7 types:
    6868 *
    6969 * DB           (Database)
     
    7373 * DBLock       (A lock handle)
    7474 * DBSequence   (Sequence)
     75 * DBSite       (Site)
    7576 *
    7677 * More datatypes added:
     
    100101#undef COMPILING_BSDDB_C
    101102
    102 static char *rcs_id = "$Id: _bsddb.c 81029 2010-05-09 14:46:46Z antoine.pitrou $";
     103static char *rcs_id = "$Id$";
    103104
    104105/* --------------------------------------------------------------------- */
     
    136137#define MYDB_END_ALLOW_THREADS Py_END_ALLOW_THREADS;
    137138
    138 /* For 2.3, use the PyGILState_ calls */
    139 #if (PY_VERSION_HEX >= 0x02030000)
    140 #define MYDB_USE_GILSTATE
    141 #endif
    142 
    143139/* and these are for calling C --> Python */
    144 #if defined(MYDB_USE_GILSTATE)
    145140#define MYDB_BEGIN_BLOCK_THREADS \
    146141                PyGILState_STATE __savestate = PyGILState_Ensure();
    147142#define MYDB_END_BLOCK_THREADS \
    148143                PyGILState_Release(__savestate);
    149 #else /* MYDB_USE_GILSTATE */
    150 /* Pre GILState API - do it the long old way */
    151 static PyInterpreterState* _db_interpreterState = NULL;
    152 #define MYDB_BEGIN_BLOCK_THREADS {                              \
    153         PyThreadState* prevState;                               \
    154         PyThreadState* newState;                                \
    155         PyEval_AcquireLock();                                   \
    156         newState  = PyThreadState_New(_db_interpreterState);    \
    157         prevState = PyThreadState_Swap(newState);
    158 
    159 #define MYDB_END_BLOCK_THREADS                                  \
    160         newState = PyThreadState_Swap(prevState);               \
    161         PyThreadState_Clear(newState);                          \
    162         PyEval_ReleaseLock();                                   \
    163         PyThreadState_Delete(newState);                         \
    164         }
    165 #endif /* MYDB_USE_GILSTATE */
    166144
    167145#else
     
    188166static PyObject* DBVerifyBadError;      /* DB_VERIFY_BAD */
    189167static PyObject* DBNoServerError;       /* DB_NOSERVER */
     168#if (DBVER < 52)
    190169static PyObject* DBNoServerHomeError;   /* DB_NOSERVER_HOME */
    191170static PyObject* DBNoServerIDError;     /* DB_NOSERVER_ID */
     171#endif
    192172static PyObject* DBPageNotFoundError;   /* DB_PAGE_NOTFOUND */
    193173static PyObject* DBSecondaryBadError;   /* DB_SECONDARY_BAD */
     
    196176static PyObject* DBAccessError;         /* EACCES */
    197177static PyObject* DBNoSpaceError;        /* ENOSPC */
    198 static PyObject* DBNoMemoryError;       /* DB_BUFFER_SMALL (ENOMEM when < 4.3) */
     178static PyObject* DBNoMemoryError;       /* DB_BUFFER_SMALL */
    199179static PyObject* DBAgainError;          /* EAGAIN */
    200180static PyObject* DBBusyError;           /* EBUSY  */
     
    203183static PyObject* DBPermissionsError;    /* EPERM  */
    204184
    205 #if (DBVER >= 42)
    206185static PyObject* DBRepHandleDeadError;  /* DB_REP_HANDLE_DEAD */
    207 #endif
    208186#if (DBVER >= 44)
    209187static PyObject* DBRepLockoutError;     /* DB_REP_LOCKOUT */
     
    220198
    221199static PyObject* DBRepUnavailError;     /* DB_REP_UNAVAIL */
    222 
    223 #if (DBVER < 43)
    224 #define DB_BUFFER_SMALL         ENOMEM
    225 #endif
    226200
    227201#if (DBVER < 48)
     
    253227staticforward PyTypeObject DB_Type, DBCursor_Type, DBEnv_Type, DBTxn_Type,
    254228              DBLock_Type, DBLogCursor_Type;
    255 #if (DBVER >= 43)
    256229staticforward PyTypeObject DBSequence_Type;
     230#if (DBVER >= 52)
     231staticforward PyTypeObject DBSite_Type;
    257232#endif
    258233
     
    268243#define DBTxnObject_Check(v)        (Py_TYPE(v) == &DBTxn_Type)
    269244#define DBLockObject_Check(v)       (Py_TYPE(v) == &DBLock_Type)
    270 #if (DBVER >= 43)
    271245#define DBSequenceObject_Check(v)   (Py_TYPE(v) == &DBSequence_Type)
     246#if (DBVER >= 52)
     247#define DBSiteObject_Check(v)       (Py_TYPE(v) == &DBSite_Type)
    272248#endif
    273249
     
    373349        _CHECK_OBJECT_NOT_CLOSED(logcurs->logc, DBCursorClosedError, DBLogCursor)
    374350
    375 #if (DBVER >= 43)
    376351#define CHECK_SEQUENCE_NOT_CLOSED(curs) \
    377352        _CHECK_OBJECT_NOT_CLOSED(curs->sequence, DBError, DBSequence)
     353
     354#if (DBVER >= 52)
     355#define CHECK_SITE_NOT_CLOSED(db_site) \
     356         _CHECK_OBJECT_NOT_CLOSED(db_site->site, DBError, DBSite)
    378357#endif
    379358
     
    568547 * library. */
    569548static char _db_errmsg[1024];
    570 #if (DBVER <= 42)
    571 static void _db_errorCallback(const char* prefix, char* msg)
    572 #else
    573549static void _db_errorCallback(const DB_ENV *db_env,
    574550        const char* prefix, const char* msg)
    575 #endif
    576551{
    577552    our_strlcpy(_db_errmsg, msg, sizeof(_db_errmsg));
     
    627602  }
    628603
    629 #if (PY_VERSION_HEX >= 0x02040000)
    630604  r = PyTuple_Pack(2, a, b) ;
    631 #else
    632   r = Py_BuildValue("OO", a, b);
    633 #endif
    634605  Py_DECREF(a);
    635606  Py_DECREF(b);
     
    697668        case DB_VERIFY_BAD:         errObj = DBVerifyBadError;      break;
    698669        case DB_NOSERVER:           errObj = DBNoServerError;       break;
     670#if (DBVER < 52)
    699671        case DB_NOSERVER_HOME:      errObj = DBNoServerHomeError;   break;
    700672        case DB_NOSERVER_ID:        errObj = DBNoServerIDError;     break;
     673#endif
    701674        case DB_PAGE_NOTFOUND:      errObj = DBPageNotFoundError;   break;
    702675        case DB_SECONDARY_BAD:      errObj = DBSecondaryBadError;   break;
    703676        case DB_BUFFER_SMALL:       errObj = DBNoMemoryError;       break;
    704677
    705 #if (DBVER >= 43)
    706         /* ENOMEM and DB_BUFFER_SMALL were one and the same until 4.3 */
    707678        case ENOMEM:  errObj = PyExc_MemoryError;   break;
    708 #endif
    709679        case EINVAL:  errObj = DBInvalidArgError;   break;
    710680        case EACCES:  errObj = DBAccessError;       break;
     
    716686        case EPERM :  errObj = DBPermissionsError;  break;
    717687
    718 #if (DBVER >= 42)
    719688        case DB_REP_HANDLE_DEAD : errObj = DBRepHandleDeadError; break;
    720 #endif
    721689#if (DBVER >= 44)
    722690        case DB_REP_LOCKOUT : errObj = DBRepLockoutError; break;
     
    903871}
    904872
    905 #if (DBVER >= 43)
    906873/* add an db_seq_t to a dictionary using the given name as a key */
    907874static void _addDb_seq_tToDict(PyObject* dict, char *name, db_seq_t value)
     
    913880    Py_XDECREF(v);
    914881}
    915 #endif
    916882
    917883static void _addDB_lsnToDict(PyObject* dict, char *name, DB_LSN value)
     
    943909    self->db = NULL;
    944910    self->children_cursors = NULL;
    945 #if (DBVER >=43)
    946911    self->children_sequences = NULL;
    947 #endif
    948912    self->associateCallback = NULL;
    949913    self->btCompareCallback = NULL;
     914    self->dupCompareCallback = NULL;
    950915    self->primaryDBType = 0;
    951916    Py_INCREF(Py_None);
     
    1029994        self->btCompareCallback = NULL;
    1030995    }
     996    if (self->dupCompareCallback != NULL) {
     997        Py_DECREF(self->dupCompareCallback);
     998        self->dupCompareCallback = NULL;
     999    }
    10311000    Py_DECREF(self->private_obj);
    10321001    PyObject_Del(self);
     
    11481117    self->children_txns = NULL;
    11491118    self->children_logcursors = NULL ;
     1119#if (DBVER >= 52)
     1120    self->children_sites = NULL;
     1121#endif
    11501122    Py_INCREF(Py_None);
    11511123    self->private_obj = Py_None;
     
    13411313
    13421314
    1343 #if (DBVER >= 43)
    13441315static DBSequenceObject*
    13451316newDBSequenceObject(DBObject* mydb,  int flags)
     
    13951366
    13961367    Py_DECREF(self->mydb);
     1368    PyObject_Del(self);
     1369}
     1370
     1371#if (DBVER >= 52)
     1372static DBSiteObject*
     1373newDBSiteObject(DB_SITE* sitep, DBEnvObject* env)
     1374{
     1375    DBSiteObject* self;
     1376
     1377    self = PyObject_New(DBSiteObject, &DBSite_Type);
     1378
     1379    if (self == NULL)
     1380        return NULL;
     1381
     1382    self->site = sitep;
     1383    self->env = env;
     1384
     1385    INSERT_IN_DOUBLE_LINKED_LIST(self->env->children_sites, self);
     1386
     1387    self->in_weakreflist = NULL;
     1388    Py_INCREF(self->env);
     1389    return self;
     1390}
     1391
     1392/* Forward declaration */
     1393static PyObject *DBSite_close_internal(DBSiteObject* self);
     1394
     1395static void
     1396DBSite_dealloc(DBSiteObject* self)
     1397{
     1398    PyObject *dummy;
     1399
     1400    if (self->site != NULL) {
     1401        dummy = DBSite_close_internal(self);
     1402        /*
     1403        ** Raising exceptions while doing
     1404        ** garbage collection is a fatal error.
     1405        */
     1406        if (dummy)
     1407            Py_DECREF(dummy);
     1408        else
     1409            PyErr_Clear();
     1410    }
     1411    if (self->in_weakreflist != NULL) {
     1412        PyObject_ClearWeakRefs((PyObject *) self);
     1413    }
     1414    Py_DECREF(self->env);
    13971415    PyObject_Del(self);
    13981416}
     
    16531671        }
    16541672
    1655 #if (DBVER >= 43)
    16561673        while(self->children_sequences) {
    16571674            dummy=DBSequence_close_internal(self->children_sequences,0,0);
    16581675            Py_XDECREF(dummy);
    16591676        }
    1660 #endif
    16611677
    16621678        /*
     
    20752091            else
    20762092                keyObj = Build_PyString(key.data, key.size);
    2077 #if (PY_VERSION_HEX >= 0x02040000)
    20782093            retval = PyTuple_Pack(3, keyObj, pkeyObj, dataObj);
    2079 #else
    2080             retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj);
    2081 #endif
    20822094            Py_DECREF(keyObj);
    20832095        }
    20842096        else /* return just the pkey and data */
    20852097        {
    2086 #if (PY_VERSION_HEX >= 0x02040000)
    20872098            retval = PyTuple_Pack(2, pkeyObj, dataObj);
    2088 #else
    2089             retval = Py_BuildValue("OO", pkeyObj, dataObj);
    2090 #endif
    20912099        }
    20922100        Py_DECREF(dataObj);
     
    21332141    err = self->db->get(self->db, txn, &key, &data, flags);
    21342142    MYDB_END_ALLOW_THREADS;
    2135     if (err == DB_BUFFER_SMALL) {
     2143    if ((err == DB_BUFFER_SMALL) || (err == 0)) {
    21362144        retval = NUMBER_FromLong((long)data.size);
    21372145        err = 0;
     
    23862394    }
    23872395
    2388 #if (DBVER >= 42)
    23892396    self->db->get_flags(self->db, &self->setflags);
    2390 #endif
    23912397
    23922398    self->flags = flags;
     
    25402546
    25412547static PyObject*
     2548DB_get_dbname(DBObject* self)
     2549{
     2550    int err;
     2551    const char *filename, *dbname;
     2552
     2553    CHECK_DB_NOT_CLOSED(self);
     2554
     2555    MYDB_BEGIN_ALLOW_THREADS;
     2556    err = self->db->get_dbname(self->db, &filename, &dbname);
     2557    MYDB_END_ALLOW_THREADS;
     2558    RETURN_IF_ERR();
     2559    /* If "dbname==NULL", it is correctly converted to "None" */
     2560    return Py_BuildValue("(ss)", filename, dbname);
     2561}
     2562
     2563static PyObject*
     2564DB_get_open_flags(DBObject* self)
     2565{
     2566    int err;
     2567    unsigned int flags;
     2568
     2569    CHECK_DB_NOT_CLOSED(self);
     2570
     2571    MYDB_BEGIN_ALLOW_THREADS;
     2572    err = self->db->get_open_flags(self->db, &flags);
     2573    MYDB_END_ALLOW_THREADS;
     2574    RETURN_IF_ERR();
     2575    return NUMBER_FromLong(flags);
     2576}
     2577
     2578static PyObject*
    25422579DB_set_q_extentsize(DBObject* self, PyObject* args)
    25432580{
     
    25562593}
    25572594
    2558 #if (DBVER >= 42)
    25592595static PyObject*
    25602596DB_get_q_extentsize(DBObject* self)
     
    25712607    return NUMBER_FromLong(extentsize);
    25722608}
    2573 #endif
    25742609
    25752610static PyObject*
     
    25892624}
    25902625
    2591 #if (DBVER >= 42)
    25922626static PyObject*
    25932627DB_get_bt_minkey(DBObject* self)
     
    26042638    return NUMBER_FromLong(bt_minkey);
    26052639}
    2606 #endif
    26072640
    26082641static int
     
    27412774}
    27422775
     2776static int
     2777_db_dupCompareCallback(DB* db,
     2778                    const DBT *leftKey,
     2779                    const DBT *rightKey)
     2780{
     2781    int res = 0;
     2782    PyObject *args;
     2783    PyObject *result = NULL;
     2784    DBObject *self = (DBObject *)db->app_private;
     2785
     2786    if (self == NULL || self->dupCompareCallback == NULL) {
     2787        MYDB_BEGIN_BLOCK_THREADS;
     2788        PyErr_SetString(PyExc_TypeError,
     2789                        (self == 0
     2790                         ? "DB_dup_compare db is NULL."
     2791                         : "DB_dup_compare callback is NULL."));
     2792        /* we're in a callback within the DB code, we can't raise */
     2793        PyErr_Print();
     2794        res = _default_cmp(leftKey, rightKey);
     2795        MYDB_END_BLOCK_THREADS;
     2796    } else {
     2797        MYDB_BEGIN_BLOCK_THREADS;
     2798
     2799        args = BuildValue_SS(leftKey->data, leftKey->size, rightKey->data, rightKey->size);
     2800        if (args != NULL) {
     2801                result = PyEval_CallObject(self->dupCompareCallback, args);
     2802        }
     2803        if (args == NULL || result == NULL) {
     2804            /* we're in a callback within the DB code, we can't raise */
     2805            PyErr_Print();
     2806            res = _default_cmp(leftKey, rightKey);
     2807        } else if (NUMBER_Check(result)) {
     2808            res = NUMBER_AsLong(result);
     2809        } else {
     2810            PyErr_SetString(PyExc_TypeError,
     2811                            "DB_dup_compare callback MUST return an int.");
     2812            /* we're in a callback within the DB code, we can't raise */
     2813            PyErr_Print();
     2814            res = _default_cmp(leftKey, rightKey);
     2815        }
     2816
     2817        Py_XDECREF(args);
     2818        Py_XDECREF(result);
     2819
     2820        MYDB_END_BLOCK_THREADS;
     2821    }
     2822    return res;
     2823}
     2824
     2825static PyObject*
     2826DB_set_dup_compare(DBObject* self, PyObject* comparator)
     2827{
     2828    int err;
     2829    PyObject *tuple, *result;
     2830
     2831    CHECK_DB_NOT_CLOSED(self);
     2832
     2833    if (!PyCallable_Check(comparator)) {
     2834        makeTypeError("Callable", comparator);
     2835        return NULL;
     2836    }
     2837
     2838    /*
     2839     * Perform a test call of the comparator function with two empty
     2840     * string objects here.  verify that it returns an int (0).
     2841     * err if not.
     2842     */
     2843    tuple = Py_BuildValue("(ss)", "", "");
     2844    result = PyEval_CallObject(comparator, tuple);
     2845    Py_DECREF(tuple);
     2846    if (result == NULL)
     2847        return NULL;
     2848    if (!NUMBER_Check(result)) {
     2849        Py_DECREF(result);
     2850        PyErr_SetString(PyExc_TypeError,
     2851                        "callback MUST return an int");
     2852        return NULL;
     2853    } else if (NUMBER_AsLong(result) != 0) {
     2854        Py_DECREF(result);
     2855        PyErr_SetString(PyExc_TypeError,
     2856                        "callback failed to return 0 on two empty strings");
     2857        return NULL;
     2858    }
     2859    Py_DECREF(result);
     2860
     2861    /* We don't accept multiple set_dup_compare operations, in order to
     2862     * simplify the code. This would have no real use, as one cannot
     2863     * change the function once the db is opened anyway */
     2864    if (self->dupCompareCallback != NULL) {
     2865        PyErr_SetString(PyExc_RuntimeError, "set_dup_compare() cannot be called more than once");
     2866        return NULL;
     2867    }
     2868
     2869    Py_INCREF(comparator);
     2870    self->dupCompareCallback = comparator;
     2871
     2872    /* This is to workaround a problem with un-initialized threads (see
     2873       comment in DB_associate) */
     2874#ifdef WITH_THREAD
     2875    PyEval_InitThreads();
     2876#endif
     2877
     2878    err = self->db->set_dup_compare(self->db, _db_dupCompareCallback);
     2879
     2880    if (err) {
     2881        /* restore the old state in case of error */
     2882        Py_DECREF(comparator);
     2883        self->dupCompareCallback = NULL;
     2884    }
     2885
     2886    RETURN_IF_ERR();
     2887    RETURN_NONE();
     2888}
     2889
    27432890
    27442891static PyObject*
     
    27602907}
    27612908
    2762 #if (DBVER >= 42)
    27632909static PyObject*
    27642910DB_get_cachesize(DBObject* self)
     
    27782924    return Py_BuildValue("(iii)", gbytes, bytes, ncache);
    27792925}
    2780 #endif
    27812926
    27822927static PyObject*
     
    27982943}
    27992944
    2800 #if (DBVER >= 42)
    28012945static PyObject*
    28022946DB_get_flags(DBObject* self)
     
    28132957    return NUMBER_FromLong(flags);
    28142958}
    2815 #endif
     2959
     2960static PyObject*
     2961DB_get_transactional(DBObject* self)
     2962{
     2963    int err;
     2964
     2965    CHECK_DB_NOT_CLOSED(self);
     2966
     2967    MYDB_BEGIN_ALLOW_THREADS;
     2968    err = self->db->get_transactional(self->db);
     2969    MYDB_END_ALLOW_THREADS;
     2970
     2971    if(err == 0) {
     2972        Py_INCREF(Py_False);
     2973        return Py_False;
     2974    } else if(err == 1) {
     2975        Py_INCREF(Py_True);
     2976        return Py_True;
     2977    }
     2978
     2979    /*
     2980    ** If we reach there, there was an error. The
     2981    ** "return" should be unreachable.
     2982    */
     2983    RETURN_IF_ERR();
     2984    assert(0);  /* This code SHOULD be unreachable */
     2985    return NULL;
     2986}
    28162987
    28172988static PyObject*
     
    28313002}
    28323003
    2833 #if (DBVER >= 42)
    28343004static PyObject*
    28353005DB_get_h_ffactor(DBObject* self)
     
    28463016    return NUMBER_FromLong(ffactor);
    28473017}
    2848 #endif
    28493018
    28503019static PyObject*
     
    28643033}
    28653034
    2866 #if (DBVER >= 42)
    28673035static PyObject*
    28683036DB_get_h_nelem(DBObject* self)
     
    28793047    return NUMBER_FromLong(nelem);
    28803048}
    2881 #endif
    28823049
    28833050static PyObject*
     
    28973064}
    28983065
    2899 #if (DBVER >= 42)
    29003066static PyObject*
    29013067DB_get_lorder(DBObject* self)
     
    29123078    return NUMBER_FromLong(lorder);
    29133079}
    2914 #endif
    29153080
    29163081static PyObject*
     
    29303095}
    29313096
    2932 #if (DBVER >= 42)
    29333097static PyObject*
    29343098DB_get_pagesize(DBObject* self)
     
    29453109    return NUMBER_FromLong(pagesize);
    29463110}
    2947 #endif
    29483111
    29493112static PyObject*
     
    29683131}
    29693132
    2970 #if (DBVER >= 42)
    29713133static PyObject*
    29723134DB_get_re_delim(DBObject* self)
     
    29823144    return NUMBER_FromLong(re_delim);
    29833145}
    2984 #endif
    29853146
    29863147static PyObject*
     
    30003161}
    30013162
    3002 #if (DBVER >= 42)
    30033163static PyObject*
    30043164DB_get_re_len(DBObject* self)
     
    30153175    return NUMBER_FromLong(re_len);
    30163176}
    3017 #endif
    30183177
    30193178static PyObject*
     
    30373196}
    30383197
    3039 #if (DBVER >= 42)
    30403198static PyObject*
    30413199DB_get_re_pad(DBObject* self)
     
    30513209    return NUMBER_FromLong(re_pad);
    30523210}
    3053 #endif
    30543211
    30553212static PyObject*
     
    30703227}
    30713228
    3072 #if (DBVER >= 42)
    30733229static PyObject*
    30743230DB_get_re_source(DBObject* self)
     
    30853241    return PyBytes_FromString(source);
    30863242}
    3087 #endif
    30883243
    30893244static PyObject*
     
    30933248    void* sp;
    30943249    PyObject* d;
    3095 #if (DBVER >= 43)
    30963250    PyObject* txnobj = NULL;
    30973251    DB_TXN *txn = NULL;
    30983252    static char* kwnames[] = { "flags", "txn", NULL };
    3099 #else
    3100     static char* kwnames[] = { "flags", NULL };
    3101 #endif
    3102 
    3103 #if (DBVER >= 43)
     3253
    31043254    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:stat", kwnames,
    31053255                                     &flags, &txnobj))
     
    31073257    if (!checkTxnObj(txnobj, &txn))
    31083258        return NULL;
    3109 #else
    3110     if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:stat", kwnames, &flags))
    3111         return NULL;
    3112 #endif
    31133259    CHECK_DB_NOT_CLOSED(self);
    31143260
    31153261    MYDB_BEGIN_ALLOW_THREADS;
    3116 #if (DBVER >= 43)
    31173262    err = self->db->stat(self->db, txn, &sp, flags);
    3118 #else
    3119     err = self->db->stat(self->db, &sp, flags);
    3120 #endif
    31213263    MYDB_END_ALLOW_THREADS;
    31223264    RETURN_IF_ERR();
     
    31733315        MAKE_BT_ENTRY(dup_pg);
    31743316        MAKE_BT_ENTRY(over_pg);
    3175 #if (DBVER >= 43)
    31763317        MAKE_BT_ENTRY(empty_pg);
    3177 #endif
    31783318        MAKE_BT_ENTRY(free);
    31793319        MAKE_BT_ENTRY(int_pgfree);
     
    32153355}
    32163356
    3217 #if (DBVER >= 43)
    32183357static PyObject*
    32193358DB_stat_print(DBObject* self, PyObject* args, PyObject *kwargs)
     
    32353374    RETURN_NONE();
    32363375}
    3237 #endif
    32383376
    32393377
     
    33823520}
    33833521
    3384 #if (DBVER >= 42)
    33853522static PyObject*
    33863523DB_get_encrypt_flags(DBObject* self)
     
    33973534    return NUMBER_FromLong(flags);
    33983535}
    3399 #endif
    34003536
    34013537
     
    34213557
    34223558    MYDB_BEGIN_ALLOW_THREADS;
    3423 #if (DBVER >= 43)
    34243559    err = self->db->stat(self->db, /*txnid*/ NULL, &sp, 0);
    3425 #else
    3426     err = self->db->stat(self->db, &sp, 0);
    3427 #endif
    34283560    MYDB_END_ALLOW_THREADS;
    34293561
     
    38694001
    38704002
     4003/* --------------------------------------------------------------------- */
     4004/* DBSite methods */
     4005
     4006
     4007#if (DBVER >= 52)
     4008static PyObject*
     4009DBSite_close_internal(DBSiteObject* self)
     4010{
     4011    int err = 0;
     4012
     4013    if (self->site != NULL) {
     4014        EXTRACT_FROM_DOUBLE_LINKED_LIST(self);
     4015
     4016        MYDB_BEGIN_ALLOW_THREADS;
     4017        err = self->site->close(self->site);
     4018        MYDB_END_ALLOW_THREADS;
     4019        self->site = NULL;
     4020    }
     4021    RETURN_IF_ERR();
     4022    RETURN_NONE();
     4023}
     4024
     4025static PyObject*
     4026DBSite_close(DBSiteObject* self)
     4027{
     4028    return DBSite_close_internal(self);
     4029}
     4030
     4031static PyObject*
     4032DBSite_remove(DBSiteObject* self)
     4033{
     4034    int err = 0;
     4035
     4036    CHECK_SITE_NOT_CLOSED(self);
     4037
     4038    MYDB_BEGIN_ALLOW_THREADS;
     4039    err = self->site->remove(self->site);
     4040    MYDB_END_ALLOW_THREADS;
     4041
     4042    RETURN_IF_ERR();
     4043    RETURN_NONE();
     4044}
     4045
     4046static PyObject*
     4047DBSite_get_eid(DBSiteObject* self)
     4048{
     4049    int err = 0;
     4050    int eid;
     4051
     4052    CHECK_SITE_NOT_CLOSED(self);
     4053
     4054    MYDB_BEGIN_ALLOW_THREADS;
     4055    err = self->site->get_eid(self->site, &eid);
     4056    MYDB_END_ALLOW_THREADS;
     4057
     4058    RETURN_IF_ERR();
     4059    return NUMBER_FromLong(eid);
     4060}
     4061
     4062static PyObject*
     4063DBSite_get_address(DBSiteObject* self)
     4064{
     4065    int err = 0;
     4066    const char *host;
     4067    u_int port;
     4068
     4069    CHECK_SITE_NOT_CLOSED(self);
     4070
     4071    MYDB_BEGIN_ALLOW_THREADS;
     4072    err = self->site->get_address(self->site, &host, &port);
     4073    MYDB_END_ALLOW_THREADS;
     4074
     4075    RETURN_IF_ERR();
     4076
     4077    return Py_BuildValue("(sI)", host, port);
     4078}
     4079
     4080static PyObject*
     4081DBSite_get_config(DBSiteObject* self, PyObject* args, PyObject* kwargs)
     4082{
     4083    int err = 0;
     4084    u_int32_t which, value;
     4085    static char* kwnames[] = { "which", NULL };
     4086
     4087    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:get_config", kwnames,
     4088                                     &which))
     4089        return NULL;
     4090
     4091    CHECK_SITE_NOT_CLOSED(self);
     4092
     4093    MYDB_BEGIN_ALLOW_THREADS;
     4094    err = self->site->get_config(self->site, which, &value);
     4095    MYDB_END_ALLOW_THREADS;
     4096
     4097    RETURN_IF_ERR();
     4098
     4099    if (value) {
     4100        Py_INCREF(Py_True);
     4101        return Py_True;
     4102    } else {
     4103        Py_INCREF(Py_False);
     4104        return Py_False;
     4105    }
     4106}
     4107
     4108static PyObject*
     4109DBSite_set_config(DBSiteObject* self, PyObject* args, PyObject* kwargs)
     4110{
     4111    int err = 0;
     4112    u_int32_t which, value;
     4113    PyObject *valueO;
     4114    static char* kwnames[] = { "which", "value", NULL };
     4115
     4116    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO:set_config", kwnames,
     4117                                     &which, &valueO))
     4118        return NULL;
     4119
     4120    CHECK_SITE_NOT_CLOSED(self);
     4121
     4122    value = PyObject_IsTrue(valueO);
     4123
     4124    MYDB_BEGIN_ALLOW_THREADS;
     4125    err = self->site->set_config(self->site, which, value);
     4126    MYDB_END_ALLOW_THREADS;
     4127
     4128    RETURN_IF_ERR();
     4129    RETURN_NONE();
     4130}
     4131#endif
     4132
    38714133
    38724134/* --------------------------------------------------------------------- */
     
    41284390            else
    41294391                keyObj = Build_PyString(key.data, key.size);
    4130 #if (PY_VERSION_HEX >= 0x02040000)
    41314392            retval = PyTuple_Pack(3, keyObj, pkeyObj, dataObj);
    4132 #else
    4133             retval = Py_BuildValue("OOO", keyObj, pkeyObj, dataObj);
    4134 #endif
    41354393            Py_DECREF(keyObj);
    41364394            FREE_DBT(key);  /* 'make_key_dbt' could do a 'malloc' */
     
    41384396        else /* return just the pkey and data */
    41394397        {
    4140 #if (PY_VERSION_HEX >= 0x02040000)
    41414398            retval = PyTuple_Pack(2, pkeyObj, dataObj);
    4142 #else
    4143             retval = Py_BuildValue("OO", pkeyObj, dataObj);
    4144 #endif
    41454399        }
    41464400        Py_DECREF(dataObj);
     
    46574911            Py_XDECREF(dummy);
    46584912        }
     4913#if (DBVER >= 52)
     4914        while(self->children_sites) {
     4915            dummy = DBSite_close_internal(self->children_sites);
     4916            Py_XDECREF(dummy);
     4917        }
     4918#endif
    46594919    }
    46604920
     
    47364996
    47374997    MAKE_ENTRY(gbytes);
     4998    MAKE_ENTRY(bytes);
    47384999    MAKE_ENTRY(ncache);
    47395000#if (DBVER >= 46)
     
    47415002#endif
    47425003    MAKE_ENTRY(regsize);
    4743 #if (DBVER >= 43)
    47445004    MAKE_ENTRY(mmapsize);
    47455005    MAKE_ENTRY(maxopenfd);
    47465006    MAKE_ENTRY(maxwrite);
    47475007    MAKE_ENTRY(maxwrite_sleep);
    4748 #endif
    47495008    MAKE_ENTRY(map);
    47505009    MAKE_ENTRY(cache_hit);
     
    48295088    free(fsp);
    48305089
    4831     r = Py_BuildValue("(OO)", d, d2);
     5090    r = PyTuple_Pack(2, d, d2);
    48325091    Py_DECREF(d);
    48335092    Py_DECREF(d2);
     
    48355094}
    48365095
    4837 #if (DBVER >= 43)
    48385096static PyObject*
    48395097DBEnv_memp_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    48555113    RETURN_NONE();
    48565114}
    4857 #endif
    48585115
    48595116
     
    49885245}
    49895246
    4990 #if (DBVER >= 42)
    49915247static PyObject*
    49925248DBEnv_get_encrypt_flags(DBEnvObject* self)
     
    50265282    return NUMBER_FromLong(timeout);
    50275283}
    5028 #endif
    50295284
    50305285
     
    50655320}
    50665321
    5067 #if (DBVER >= 42)
    50685322static PyObject*
    50695323DBEnv_get_shm_key(DBEnvObject* self)
     
    50825336    return NUMBER_FromLong(shm_key);
    50835337}
    5084 #endif
    50855338
    50865339#if (DBVER >= 46)
     
    51715424}
    51725425
    5173 #if (DBVER >= 42)
    51745426static PyObject*
    51755427DBEnv_get_cachesize(DBEnvObject* self)
     
    51895441    return Py_BuildValue("(iii)", gbytes, bytes, ncache);
    51905442}
    5191 #endif
    51925443
    51935444
     
    52095460}
    52105461
    5211 #if (DBVER >= 42)
    52125462static PyObject*
    52135463DBEnv_get_flags(DBEnvObject* self)
     
    52245474    return NUMBER_FromLong(flags);
    52255475}
    5226 #endif
    52275476
    52285477#if (DBVER >= 47)
     
    54245673}
    54255674
    5426 #if (DBVER >= 42)
    54275675static PyObject*
    54285676DBEnv_get_data_dirs(DBEnvObject* self)
     
    54645712    return tuple;
    54655713}
    5466 #endif
    54675714
    54685715#if (DBVER >= 44)
     
    55145761}
    55155762
    5516 #if (DBVER >= 42)
    55175763static PyObject*
    55185764DBEnv_get_lg_bsize(DBEnvObject* self)
     
    55295775    return NUMBER_FromLong(lg_bsize);
    55305776}
    5531 #endif
    55325777
    55335778static PyObject*
     
    55485793}
    55495794
    5550 #if (DBVER >= 42)
    55515795static PyObject*
    55525796DBEnv_get_lg_dir(DBEnvObject* self)
     
    55635807    return PyBytes_FromString(dirp);
    55645808}
    5565 #endif
    55665809
    55675810static PyObject*
     
    55815824}
    55825825
    5583 #if (DBVER >= 42)
    55845826static PyObject*
    55855827DBEnv_get_lg_max(DBEnvObject* self)
     
    55965838    return NUMBER_FromLong(lg_max);
    55975839}
    5598 #endif
    5599 
    56005840
    56015841static PyObject*
     
    56155855}
    56165856
    5617 #if (DBVER >= 42)
    56185857static PyObject*
    56195858DBEnv_get_lg_regionmax(DBEnvObject* self)
     
    56305869    return NUMBER_FromLong(lg_regionmax);
    56315870}
    5632 #endif
    56335871
    56345872#if (DBVER >= 47)
     
    56815919}
    56825920
    5683 #if (DBVER >= 42)
    56845921static PyObject*
    56855922DBEnv_get_lk_detect(DBEnvObject* self)
     
    56965933    return NUMBER_FromLong(lk_detect);
    56975934}
    5698 #endif
    5699 
    57005935
    57015936#if (DBVER < 45)
     
    57355970}
    57365971
    5737 #if (DBVER >= 42)
    57385972static PyObject*
    57395973DBEnv_get_lk_max_locks(DBEnvObject* self)
     
    57505984    return NUMBER_FromLong(lk_max);
    57515985}
    5752 #endif
    57535986
    57545987static PyObject*
     
    57686001}
    57696002
    5770 #if (DBVER >= 42)
    57716003static PyObject*
    57726004DBEnv_get_lk_max_lockers(DBEnvObject* self)
     
    57836015    return NUMBER_FromLong(lk_max);
    57846016}
    5785 #endif
    57866017
    57876018static PyObject*
     
    58016032}
    58026033
    5803 #if (DBVER >= 42)
    58046034static PyObject*
    58056035DBEnv_get_lk_max_objects(DBEnvObject* self)
     
    58166046    return NUMBER_FromLong(lk_max);
    58176047}
    5818 #endif
    5819 
    5820 #if (DBVER >= 42)
     6048
    58216049static PyObject*
    58226050DBEnv_get_mp_mmapsize(DBEnvObject* self)
     
    58336061    return NUMBER_FromLong(mmapsize);
    58346062}
    5835 #endif
    5836 
    58376063
    58386064static PyObject*
     
    58706096}
    58716097
    5872 
    5873 #if (DBVER >= 42)
    58746098static PyObject*
    58756099DBEnv_get_tmp_dir(DBEnvObject* self)
     
    58886112    return PyBytes_FromString(dirpp);
    58896113}
    5890 #endif
    5891 
    58926114
    58936115static PyObject*
     
    59006122#define PREPLIST_LEN 16
    59016123    DB_PREPLIST preplist[PREPLIST_LEN];
    5902 #if (DBVER < 48)
     6124#if (DBVER < 48) || (DBVER >= 52)
    59036125    long retp;
    59046126#else
     
    60046226}
    60056227
    6006 
    6007 #if (DBVER >= 42)
    60086228static PyObject*
    60096229DBEnv_get_tx_max(DBEnvObject* self)
     
    60206240    return PyLong_FromUnsignedLong(max);
    60216241}
    6022 #endif
    6023 
    60246242
    60256243static PyObject*
     
    60396257}
    60406258
    6041 
    6042 #if (DBVER >= 42)
    60436259static PyObject*
    60446260DBEnv_get_tx_timestamp(DBEnvObject* self)
     
    60556271    return NUMBER_FromLong(timestamp);
    60566272}
    6057 #endif
    60586273
    60596274static PyObject*
     
    62056420
    62066421
    6207 #if (DBVER >= 43)
    62086422static PyObject*
    62096423DBEnv_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    62256439    RETURN_NONE();
    62266440}
    6227 #endif
    62286441
    62296442
     
    62896502
    62906503
    6291 #if (DBVER >= 43)
    62926504static PyObject*
    62936505DBEnv_log_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    63096521    RETURN_NONE();
    63106522}
    6311 #endif
    63126523
    63136524
     
    63916602}
    63926603
    6393 #if (DBVER >= 43)
    63946604static PyObject*
    63956605DBEnv_lock_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    64116621    RETURN_NONE();
    64126622}
    6413 #endif
    64146623
    64156624
     
    65736782
    65746783
     6784#if (DBVER >= 52)
     6785static PyObject*
     6786DBEnv_repmgr_site(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     6787{
     6788    int err;
     6789    DB_SITE* site;
     6790    char *host;
     6791    u_int port;
     6792    static char* kwnames[] = {"host", "port", NULL};
     6793
     6794    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "si:repmgr_site", kwnames,
     6795                                     &host, &port))
     6796        return NULL;
     6797
     6798    CHECK_ENV_NOT_CLOSED(self);
     6799
     6800    MYDB_BEGIN_ALLOW_THREADS;
     6801    err = self->db_env->repmgr_site(self->db_env, host, port, &site, 0);
     6802    MYDB_END_ALLOW_THREADS;
     6803    RETURN_IF_ERR();
     6804    return (PyObject*) newDBSiteObject(site, self);
     6805}
     6806
     6807static PyObject*
     6808DBEnv_repmgr_site_by_eid(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     6809{
     6810    int err;
     6811    DB_SITE* site;
     6812    int eid;
     6813    static char* kwnames[] = {"eid", NULL};
     6814
     6815    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:repmgr_site_by_eid",
     6816                kwnames, &eid))
     6817        return NULL;
     6818
     6819    CHECK_ENV_NOT_CLOSED(self);
     6820
     6821    MYDB_BEGIN_ALLOW_THREADS;
     6822    err = self->db_env->repmgr_site_by_eid(self->db_env, eid, &site);
     6823    MYDB_END_ALLOW_THREADS;
     6824    RETURN_IF_ERR();
     6825    return (PyObject*) newDBSiteObject(site, self);
     6826}
     6827#endif
     6828
     6829
    65756830#if (DBVER >= 44)
    65766831static PyObject*
     
    66416896
    66426897
    6643 #if (DBVER >= 43)
    66446898static PyObject*
    66456899DBEnv_txn_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    66636917    RETURN_NONE();
    66646918}
    6665 #endif
    66666919
    66676920
     
    67577010}
    67587011
     7012#if (DBVER >= 47)
     7013static PyObject*
     7014DBEnv_set_intermediate_dir_mode(DBEnvObject* self, PyObject* args)
     7015{
     7016    int err;
     7017    const char *mode;
     7018
     7019    if (!PyArg_ParseTuple(args,"s:set_intermediate_dir_mode", &mode))
     7020        return NULL;
     7021
     7022    CHECK_ENV_NOT_CLOSED(self);
     7023
     7024    MYDB_BEGIN_ALLOW_THREADS;
     7025    err = self->db_env->set_intermediate_dir_mode(self->db_env, mode);
     7026    MYDB_END_ALLOW_THREADS;
     7027    RETURN_IF_ERR();
     7028    RETURN_NONE();
     7029}
     7030
     7031static PyObject*
     7032DBEnv_get_intermediate_dir_mode(DBEnvObject* self)
     7033{
     7034    int err;
     7035    const char *mode;
     7036
     7037    CHECK_ENV_NOT_CLOSED(self);
     7038
     7039    MYDB_BEGIN_ALLOW_THREADS;
     7040    err = self->db_env->get_intermediate_dir_mode(self->db_env, &mode);
     7041    MYDB_END_ALLOW_THREADS;
     7042    RETURN_IF_ERR();
     7043    return Py_BuildValue("s", mode);
     7044}
     7045#endif
     7046
     7047#if (DBVER < 47)
     7048static PyObject*
     7049DBEnv_set_intermediate_dir(DBEnvObject* self, PyObject* args)
     7050{
     7051    int err;
     7052    int mode;
     7053    u_int32_t flags;
     7054
     7055    if (!PyArg_ParseTuple(args, "iI:set_intermediate_dir", &mode, &flags))
     7056        return NULL;
     7057
     7058    CHECK_ENV_NOT_CLOSED(self);
     7059
     7060    MYDB_BEGIN_ALLOW_THREADS;
     7061    err = self->db_env->set_intermediate_dir(self->db_env, mode, flags);
     7062    MYDB_END_ALLOW_THREADS;
     7063    RETURN_IF_ERR();
     7064    RETURN_NONE();
     7065}
     7066#endif
     7067
     7068static PyObject*
     7069DBEnv_get_open_flags(DBEnvObject* self)
     7070{
     7071    int err;
     7072    unsigned int flags;
     7073
     7074    CHECK_ENV_NOT_CLOSED(self);
     7075
     7076    MYDB_BEGIN_ALLOW_THREADS;
     7077    err = self->db_env->get_open_flags(self->db_env, &flags);
     7078    MYDB_END_ALLOW_THREADS;
     7079    RETURN_IF_ERR();
     7080    return NUMBER_FromLong(flags);
     7081}
    67597082
    67607083#if (DBVER < 48)
     
    67827105#endif
    67837106
    6784 #if (DBVER >= 43)
    67857107static PyObject*
    67867108DBEnv_set_mp_max_openfd(DBEnvObject* self, PyObject* args)
     
    68567178    return Py_BuildValue("(ii)", maxwrite, (int)maxwrite_sleep);
    68577179}
    6858 #endif
    68597180
    68607181
     
    68767197}
    68777198
    6878 #if (DBVER >= 42)
    68797199static PyObject*
    68807200DBEnv_get_verbose(DBEnvObject* self, PyObject* args)
     
    68947214    return PyBool_FromLong(verbose);
    68957215}
    6896 #endif
    68977216
    68987217#if (DBVER >= 45)
     
    69767295    DBT control, rec;
    69777296    int envid;
    6978 #if (DBVER >= 42)
    69797297    DB_LSN lsn;
    6980 #endif
    69817298
    69827299    if (!PyArg_ParseTuple(args, "OOi:rep_process_message", &control_py,
     
    69957312            envid, &lsn);
    69967313#else
    6997 #if (DBVER >= 42)
    69987314    err = self->db_env->rep_process_message(self->db_env, &control, &rec,
    69997315            &envid, &lsn);
    7000 #else
    7001     err = self->db_env->rep_process_message(self->db_env, &control, &rec,
    7002             &envid);
    7003 #endif
    70047316#endif
    70057317    MYDB_END_ALLOW_THREADS;
     
    70307342                break;
    70317343            }
    7032 #if (DBVER >= 42)
    70337344        case DB_REP_NOTPERM :
    70347345        case DB_REP_ISPERM :
    70357346            return Py_BuildValue("(i(ll))", err, lsn.file, lsn.offset);
    70367347            break;
    7037 #endif
    7038     }
    7039     RETURN_IF_ERR();
    7040     return Py_BuildValue("(OO)", Py_None, Py_None);
     7348    }
     7349    RETURN_IF_ERR();
     7350    return PyTuple_Pack(2, Py_None, Py_None);
    70417351}
    70427352
     
    70637373
    70647374    args = Py_BuildValue(
    7065 #if (PY_VERSION_HEX >= 0x02040000)
    70667375            "(OOO(ll)iI)",
    7067 #else
    7068             "(OOO(ll)ii)",
    7069 #endif
    70707376            dbenv,
    70717377            a, b,
     
    70877393}
    70887394
    7089 #if (DBVER <= 41)
    7090 static int
    7091 _DBEnv_rep_transportCallbackOLD(DB_ENV* db_env, const DBT* control, const DBT* rec,
    7092         int envid, u_int32_t flags)
    7093 {
    7094     DB_LSN lsn;
    7095 
    7096     lsn.file = -1;  /* Dummy values */
    7097     lsn.offset = -1;
    7098     return _DBEnv_rep_transportCallback(db_env, control, rec, &lsn, envid,
    7099             flags);
    7100 }
    7101 #endif
    7102 
    71037395static PyObject*
    71047396DBEnv_rep_set_transport(DBEnvObject* self, PyObject* args)
     
    71217413            &_DBEnv_rep_transportCallback);
    71227414#else
    7123 #if (DBVER >= 42)
    71247415    err = self->db_env->set_rep_transport(self->db_env, envid,
    71257416            &_DBEnv_rep_transportCallback);
    7126 #else
    7127     err = self->db_env->set_rep_transport(self->db_env, envid,
    7128             &_DBEnv_rep_transportCallbackOLD);
    7129 #endif
    71307417#endif
    71317418    MYDB_END_ALLOW_THREADS;
     
    71677454    MYDB_END_ALLOW_THREADS;
    71687455    RETURN_IF_ERR();
    7169 #if (PY_VERSION_HEX >= 0x02040000)
    71707456    return Py_BuildValue("II", minimum, maximum);
    7171 #else
    7172     return Py_BuildValue("ii", minimum, maximum);
    7173 #endif
    71747457}
    71757458#endif
     
    72587541    CHECK_ENV_NOT_CLOSED(self);
    72597542    MYDB_BEGIN_ALLOW_THREADS;
    7260     err = self->db_env->rep_elect(self->db_env, nvotes, nvotes, 0);
     7543    err = self->db_env->rep_elect(self->db_env, nsites, nvotes, 0);
    72617544    MYDB_END_ALLOW_THREADS;
    72627545    RETURN_IF_ERR();
     
    74237706    unsigned int fast, slow;
    74247707
    7425 #if (PY_VERSION_HEX >= 0x02040000)
    74267708    if (!PyArg_ParseTuple(args,"II:rep_set_clockskew", &fast, &slow))
    74277709        return NULL;
    7428 #else
    7429     if (!PyArg_ParseTuple(args,"ii:rep_set_clockskew", &fast, &slow))
    7430         return NULL;
    7431 #endif
    74327710
    74337711    CHECK_ENV_NOT_CLOSED(self);
     
    74517729    MYDB_END_ALLOW_THREADS;
    74527730    RETURN_IF_ERR();
    7453 #if (PY_VERSION_HEX >= 0x02040000)
    74547731    return Py_BuildValue("(II)", fast, slow);
    7455 #else
    7456     return Py_BuildValue("(ii)", fast, slow);
    7457 #endif
    7458 }
    7459 #endif
    7460 
    7461 #if (DBVER >= 43)
     7732}
     7733#endif
     7734
    74627735static PyObject*
    74637736DBEnv_rep_stat_print(DBEnvObject* self, PyObject* args, PyObject *kwargs)
     
    74797752    RETURN_NONE();
    74807753}
    7481 #endif
    74827754
    74837755static PyObject*
     
    75207792#endif
    75217793    MAKE_ENTRY(dupmasters);
    7522 #if (DBVER >= 43)
    75237794    MAKE_ENTRY(egen);
    75247795    MAKE_ENTRY(election_nvotes);
     
    75297800    MAKE_ENTRY(next_pg);
    75307801    MAKE_ENTRY(waiting_pg);
    7531 #endif
    75327802    MAKE_ENTRY(election_cur_winner);
    75337803    MAKE_ENTRY(election_gen);
     
    76097879}
    76107880
     7881#if (DBVER < 52)
    76117882static PyObject*
    76127883DBEnv_repmgr_set_local_site(DBEnvObject* self, PyObject* args, PyObject*
     
    76557926    return NUMBER_FromLong(eidp);
    76567927}
     7928#endif
    76577929
    76587930static PyObject*
     
    77157987            return NULL;
    77167988        }
    7717 #if (PY_VERSION_HEX >= 0x02040000)
    77187989        tuple=Py_BuildValue("(sII)", listp[countp].host,
    77197990                listp[countp].port, listp[countp].status);
    7720 #else
    7721         tuple=Py_BuildValue("(sii)", listp[countp].host,
    7722                 listp[countp].port, listp[countp].status);
    7723 #endif
    77247991        if(!tuple) {
    77257992            Py_DECREF(key);
     
    78258092{
    78268093    DBObject *db;
    7827 #if (DBVER >= 43)
    78288094    DBSequenceObject *dbs;
    7829 #endif
    78308095
    78318096    while (txn->children_dbs) {
     
    78438108    }
    78448109
    7845 #if (DBVER >= 43)
    78468110    while (txn->children_sequences) {
    78478111        dbs=txn->children_sequences;
     
    78578121        }
    78588122    }
    7859 #endif
    78608123}
    78618124
     
    79548217
    79558218    _close_transaction_cursors(self);
    7956 #if (DBVER >= 43)
    79578219    while (self->children_sequences) {
    79588220        dummy=DBSequence_close_internal(self->children_sequences,0,0);
    79598221        Py_XDECREF(dummy);
    79608222    }
    7961 #endif
    79628223    while (self->children_dbs) {
    79638224        dummy=DB_close_internal(self->children_dbs, 0, 0);
     
    80958356
    80968357
    8097 #if (DBVER >= 43)
    80988358/* --------------------------------------------------------------------- */
    80998359/* DBSequence methods */
     
    84458705    return dict_stat;
    84468706}
    8447 #endif
    84488707
    84498708
     
    84838742    {"rename",          (PyCFunction)DB_rename,         METH_VARARGS},
    84848743    {"set_bt_minkey",   (PyCFunction)DB_set_bt_minkey,  METH_VARARGS},
    8485 #if (DBVER >= 42)
    84868744    {"get_bt_minkey",   (PyCFunction)DB_get_bt_minkey,  METH_NOARGS},
    8487 #endif
    84888745    {"set_bt_compare",  (PyCFunction)DB_set_bt_compare, METH_O},
    84898746    {"set_cachesize",   (PyCFunction)DB_set_cachesize,  METH_VARARGS},
    8490 #if (DBVER >= 42)
    84918747    {"get_cachesize",   (PyCFunction)DB_get_cachesize,  METH_NOARGS},
    8492 #endif
     8748    {"set_dup_compare", (PyCFunction)DB_set_dup_compare, METH_O},
    84938749    {"set_encrypt",     (PyCFunction)DB_set_encrypt,    METH_VARARGS|METH_KEYWORDS},
    8494 #if (DBVER >= 42)
    84958750    {"get_encrypt_flags", (PyCFunction)DB_get_encrypt_flags, METH_NOARGS},
    8496 #endif
    8497 
    84988751    {"set_flags",       (PyCFunction)DB_set_flags,      METH_VARARGS},
    8499 #if (DBVER >= 42)
    85008752    {"get_flags",       (PyCFunction)DB_get_flags,      METH_NOARGS},
    8501 #endif
     8753    {"get_transactional", (PyCFunction)DB_get_transactional, METH_NOARGS},
    85028754    {"set_h_ffactor",   (PyCFunction)DB_set_h_ffactor,  METH_VARARGS},
    8503 #if (DBVER >= 42)
    85048755    {"get_h_ffactor",   (PyCFunction)DB_get_h_ffactor,  METH_NOARGS},
    8505 #endif
    85068756    {"set_h_nelem",     (PyCFunction)DB_set_h_nelem,    METH_VARARGS},
    8507 #if (DBVER >= 42)
    85088757    {"get_h_nelem",     (PyCFunction)DB_get_h_nelem,    METH_NOARGS},
    8509 #endif
    85108758    {"set_lorder",      (PyCFunction)DB_set_lorder,     METH_VARARGS},
    8511 #if (DBVER >= 42)
    85128759    {"get_lorder",      (PyCFunction)DB_get_lorder,     METH_NOARGS},
    8513 #endif
    85148760    {"set_pagesize",    (PyCFunction)DB_set_pagesize,   METH_VARARGS},
    8515 #if (DBVER >= 42)
    85168761    {"get_pagesize",    (PyCFunction)DB_get_pagesize,   METH_NOARGS},
    8517 #endif
    85188762    {"set_re_delim",    (PyCFunction)DB_set_re_delim,   METH_VARARGS},
    8519 #if (DBVER >= 42)
    85208763    {"get_re_delim",    (PyCFunction)DB_get_re_delim,   METH_NOARGS},
    8521 #endif
    85228764    {"set_re_len",      (PyCFunction)DB_set_re_len,     METH_VARARGS},
    8523 #if (DBVER >= 42)
    85248765    {"get_re_len",      (PyCFunction)DB_get_re_len,     METH_NOARGS},
    8525 #endif
    85268766    {"set_re_pad",      (PyCFunction)DB_set_re_pad,     METH_VARARGS},
    8527 #if (DBVER >= 42)
    85288767    {"get_re_pad",      (PyCFunction)DB_get_re_pad,     METH_NOARGS},
    8529 #endif
    85308768    {"set_re_source",   (PyCFunction)DB_set_re_source,  METH_VARARGS},
    8531 #if (DBVER >= 42)
    85328769    {"get_re_source",   (PyCFunction)DB_get_re_source,  METH_NOARGS},
    8533 #endif
    85348770    {"set_q_extentsize",(PyCFunction)DB_set_q_extentsize, METH_VARARGS},
    8535 #if (DBVER >= 42)
    85368771    {"get_q_extentsize",(PyCFunction)DB_get_q_extentsize, METH_NOARGS},
    8537 #endif
    85388772    {"set_private",     (PyCFunction)DB_set_private,    METH_O},
    85398773    {"get_private",     (PyCFunction)DB_get_private,    METH_NOARGS},
     
    85428776    {"get_priority",    (PyCFunction)DB_get_priority,   METH_NOARGS},
    85438777#endif
     8778    {"get_dbname",      (PyCFunction)DB_get_dbname,     METH_NOARGS},
     8779    {"get_open_flags",  (PyCFunction)DB_get_open_flags, METH_NOARGS},
    85448780    {"stat",            (PyCFunction)DB_stat,           METH_VARARGS|METH_KEYWORDS},
    8545 #if (DBVER >= 43)
    85468781    {"stat_print",      (PyCFunction)DB_stat_print,
    85478782        METH_VARARGS|METH_KEYWORDS},
    8548 #endif
    85498783    {"sync",            (PyCFunction)DB_sync,           METH_VARARGS},
    85508784    {"truncate",        (PyCFunction)DB_truncate,       METH_VARARGS|METH_KEYWORDS},
     
    86288862};
    86298863
     8864#if (DBVER >= 52)
     8865static PyMethodDef DBSite_methods[] = {
     8866    {"get_config",  (PyCFunction)DBSite_get_config,
     8867        METH_VARARGS | METH_KEYWORDS},
     8868    {"set_config",  (PyCFunction)DBSite_set_config,
     8869        METH_VARARGS | METH_KEYWORDS},
     8870    {"remove",      (PyCFunction)DBSite_remove,     METH_NOARGS},
     8871    {"get_eid",     (PyCFunction)DBSite_get_eid,    METH_NOARGS},
     8872    {"get_address", (PyCFunction)DBSite_get_address,    METH_NOARGS},
     8873    {"close",       (PyCFunction)DBSite_close,      METH_NOARGS},
     8874    {NULL,      NULL}       /* sentinel */
     8875};
     8876#endif
    86308877
    86318878static PyMethodDef DBEnv_methods[] = {
     
    86408887#endif
    86418888    {"set_encrypt",     (PyCFunction)DBEnv_set_encrypt,      METH_VARARGS|METH_KEYWORDS},
    8642 #if (DBVER >= 42)
    86438889    {"get_encrypt_flags", (PyCFunction)DBEnv_get_encrypt_flags, METH_NOARGS},
    86448890    {"get_timeout",     (PyCFunction)DBEnv_get_timeout,
    86458891        METH_VARARGS|METH_KEYWORDS},
    8646 #endif
    86478892    {"set_timeout",     (PyCFunction)DBEnv_set_timeout,     METH_VARARGS|METH_KEYWORDS},
    86488893    {"set_shm_key",     (PyCFunction)DBEnv_set_shm_key,     METH_VARARGS},
    8649 #if (DBVER >= 42)
    86508894    {"get_shm_key",     (PyCFunction)DBEnv_get_shm_key,     METH_NOARGS},
    8651 #endif
    86528895#if (DBVER >= 46)
    86538896    {"set_cache_max",   (PyCFunction)DBEnv_set_cache_max,   METH_VARARGS},
     
    86558898#endif
    86568899    {"set_cachesize",   (PyCFunction)DBEnv_set_cachesize,   METH_VARARGS},
    8657 #if (DBVER >= 42)
    86588900    {"get_cachesize",   (PyCFunction)DBEnv_get_cachesize,   METH_NOARGS},
    8659 #endif
    86608901    {"memp_trickle",    (PyCFunction)DBEnv_memp_trickle,    METH_VARARGS},
    86618902    {"memp_sync",       (PyCFunction)DBEnv_memp_sync,       METH_VARARGS},
    86628903    {"memp_stat",       (PyCFunction)DBEnv_memp_stat,
    86638904        METH_VARARGS|METH_KEYWORDS},
    8664 #if (DBVER >= 43)
    86658905    {"memp_stat_print", (PyCFunction)DBEnv_memp_stat_print,
    86668906        METH_VARARGS|METH_KEYWORDS},
    8667 #endif
    86688907#if (DBVER >= 44)
    86698908    {"mutex_set_max",   (PyCFunction)DBEnv_mutex_set_max,   METH_VARARGS},
     
    86868925#endif
    86878926    {"set_data_dir",    (PyCFunction)DBEnv_set_data_dir,    METH_VARARGS},
    8688 #if (DBVER >= 42)
    86898927    {"get_data_dirs",   (PyCFunction)DBEnv_get_data_dirs,   METH_NOARGS},
    8690 #endif
    8691 #if (DBVER >= 42)
    86928928    {"get_flags",       (PyCFunction)DBEnv_get_flags,       METH_NOARGS},
    8693 #endif
    86948929    {"set_flags",       (PyCFunction)DBEnv_set_flags,       METH_VARARGS},
    86958930#if (DBVER >= 47)
     
    86988933#endif
    86998934    {"set_lg_bsize",    (PyCFunction)DBEnv_set_lg_bsize,    METH_VARARGS},
    8700 #if (DBVER >= 42)
    87018935    {"get_lg_bsize",    (PyCFunction)DBEnv_get_lg_bsize,    METH_NOARGS},
    8702 #endif
    87038936    {"set_lg_dir",      (PyCFunction)DBEnv_set_lg_dir,      METH_VARARGS},
    8704 #if (DBVER >= 42)
    87058937    {"get_lg_dir",      (PyCFunction)DBEnv_get_lg_dir,      METH_NOARGS},
    8706 #endif
    87078938    {"set_lg_max",      (PyCFunction)DBEnv_set_lg_max,      METH_VARARGS},
    8708 #if (DBVER >= 42)
    87098939    {"get_lg_max",      (PyCFunction)DBEnv_get_lg_max,      METH_NOARGS},
    8710 #endif
    87118940    {"set_lg_regionmax",(PyCFunction)DBEnv_set_lg_regionmax, METH_VARARGS},
    8712 #if (DBVER >= 42)
    87138941    {"get_lg_regionmax",(PyCFunction)DBEnv_get_lg_regionmax, METH_NOARGS},
    8714 #endif
    87158942#if (DBVER >= 44)
    87168943    {"set_lg_filemode", (PyCFunction)DBEnv_set_lg_filemode, METH_VARARGS},
     
    87228949#endif
    87238950    {"set_lk_detect",   (PyCFunction)DBEnv_set_lk_detect,   METH_VARARGS},
    8724 #if (DBVER >= 42)
    87258951    {"get_lk_detect",   (PyCFunction)DBEnv_get_lk_detect,   METH_NOARGS},
    8726 #endif
    87278952#if (DBVER < 45)
    87288953    {"set_lk_max",      (PyCFunction)DBEnv_set_lk_max,      METH_VARARGS},
    87298954#endif
    87308955    {"set_lk_max_locks", (PyCFunction)DBEnv_set_lk_max_locks, METH_VARARGS},
    8731 #if (DBVER >= 42)
    87328956    {"get_lk_max_locks", (PyCFunction)DBEnv_get_lk_max_locks, METH_NOARGS},
    8733 #endif
    87348957    {"set_lk_max_lockers", (PyCFunction)DBEnv_set_lk_max_lockers, METH_VARARGS},
    8735 #if (DBVER >= 42)
    87368958    {"get_lk_max_lockers", (PyCFunction)DBEnv_get_lk_max_lockers, METH_NOARGS},
    8737 #endif
    87388959    {"set_lk_max_objects", (PyCFunction)DBEnv_set_lk_max_objects, METH_VARARGS},
    8739 #if (DBVER >= 42)
    87408960    {"get_lk_max_objects", (PyCFunction)DBEnv_get_lk_max_objects, METH_NOARGS},
    8741 #endif
    8742 #if (DBVER >= 43)
    87438961    {"stat_print",          (PyCFunction)DBEnv_stat_print,
    87448962        METH_VARARGS|METH_KEYWORDS},
    8745 #endif
    87468963    {"set_mp_mmapsize", (PyCFunction)DBEnv_set_mp_mmapsize, METH_VARARGS},
    8747 #if (DBVER >= 42)
    87488964    {"get_mp_mmapsize", (PyCFunction)DBEnv_get_mp_mmapsize, METH_NOARGS},
    8749 #endif
    87508965    {"set_tmp_dir",     (PyCFunction)DBEnv_set_tmp_dir,     METH_VARARGS},
    8751 #if (DBVER >= 42)
    87528966    {"get_tmp_dir",     (PyCFunction)DBEnv_get_tmp_dir,     METH_NOARGS},
    8753 #endif
    87548967    {"txn_begin",       (PyCFunction)DBEnv_txn_begin,       METH_VARARGS|METH_KEYWORDS},
    87558968    {"txn_checkpoint",  (PyCFunction)DBEnv_txn_checkpoint,  METH_VARARGS},
    87568969    {"txn_stat",        (PyCFunction)DBEnv_txn_stat,        METH_VARARGS},
    8757 #if (DBVER >= 43)
    87588970    {"txn_stat_print",  (PyCFunction)DBEnv_txn_stat_print,
    87598971        METH_VARARGS|METH_KEYWORDS},
    8760 #endif
    8761 #if (DBVER >= 42)
    87628972    {"get_tx_max",      (PyCFunction)DBEnv_get_tx_max,      METH_NOARGS},
    87638973    {"get_tx_timestamp", (PyCFunction)DBEnv_get_tx_timestamp, METH_NOARGS},
    8764 #endif
    87658974    {"set_tx_max",      (PyCFunction)DBEnv_set_tx_max,      METH_VARARGS},
    87668975    {"set_tx_timestamp", (PyCFunction)DBEnv_set_tx_timestamp, METH_VARARGS},
     
    87718980    {"lock_put",        (PyCFunction)DBEnv_lock_put,        METH_VARARGS},
    87728981    {"lock_stat",       (PyCFunction)DBEnv_lock_stat,       METH_VARARGS},
    8773 #if (DBVER >= 43)
    87748982    {"lock_stat_print", (PyCFunction)DBEnv_lock_stat_print,
    87758983        METH_VARARGS|METH_KEYWORDS},
    8776 #endif
    87778984    {"log_cursor",      (PyCFunction)DBEnv_log_cursor,      METH_NOARGS},
    87788985    {"log_file",        (PyCFunction)DBEnv_log_file,        METH_VARARGS},
     
    87848991    {"log_flush",       (PyCFunction)DBEnv_log_flush,       METH_NOARGS},
    87858992    {"log_stat",        (PyCFunction)DBEnv_log_stat,        METH_VARARGS},
    8786 #if (DBVER >= 43)
    87878993    {"log_stat_print",  (PyCFunction)DBEnv_log_stat_print,
    87888994        METH_VARARGS|METH_KEYWORDS},
    8789 #endif
    87908995#if (DBVER >= 44)
    87918996    {"fileid_reset",    (PyCFunction)DBEnv_fileid_reset,    METH_VARARGS|METH_KEYWORDS},
     
    87969001#if (DBVER < 48)
    87979002    {"set_rpc_server",  (PyCFunction)DBEnv_set_rpc_server,
    8798         METH_VARARGS||METH_KEYWORDS},
    8799 #endif
    8800 #if (DBVER >= 43)
     9003        METH_VARARGS|METH_KEYWORDS},
     9004#endif
    88019005    {"set_mp_max_openfd", (PyCFunction)DBEnv_set_mp_max_openfd, METH_VARARGS},
    88029006    {"get_mp_max_openfd", (PyCFunction)DBEnv_get_mp_max_openfd, METH_NOARGS},
    88039007    {"set_mp_max_write", (PyCFunction)DBEnv_set_mp_max_write, METH_VARARGS},
    88049008    {"get_mp_max_write", (PyCFunction)DBEnv_get_mp_max_write, METH_NOARGS},
    8805 #endif
    88069009    {"set_verbose",     (PyCFunction)DBEnv_set_verbose,     METH_VARARGS},
    8807 #if (DBVER >= 42)
    8808     {"get_verbose",     (PyCFunction)DBEnv_get_verbose,       METH_VARARGS},
    8809 #endif
    8810     {"set_private",     (PyCFunction)DBEnv_set_private,       METH_O},
    8811     {"get_private",     (PyCFunction)DBEnv_get_private,       METH_NOARGS},
     9010    {"get_verbose",     (PyCFunction)DBEnv_get_verbose,     METH_VARARGS},
     9011    {"set_private",     (PyCFunction)DBEnv_set_private,     METH_O},
     9012    {"get_private",     (PyCFunction)DBEnv_get_private,     METH_NOARGS},
     9013    {"get_open_flags",  (PyCFunction)DBEnv_get_open_flags,  METH_NOARGS},
     9014#if (DBVER >= 47)
     9015    {"set_intermediate_dir_mode", (PyCFunction)DBEnv_set_intermediate_dir_mode,
     9016        METH_VARARGS},
     9017    {"get_intermediate_dir_mode", (PyCFunction)DBEnv_get_intermediate_dir_mode,
     9018        METH_NOARGS},
     9019#endif
     9020#if (DBVER < 47)
     9021    {"set_intermediate_dir", (PyCFunction)DBEnv_set_intermediate_dir,
     9022        METH_VARARGS},
     9023#endif
    88129024    {"rep_start",       (PyCFunction)DBEnv_rep_start,
    88139025        METH_VARARGS|METH_KEYWORDS},
     
    88489060    {"rep_stat", (PyCFunction)DBEnv_rep_stat,
    88499061        METH_VARARGS|METH_KEYWORDS},
    8850 #if (DBVER >= 43)
    88519062    {"rep_stat_print", (PyCFunction)DBEnv_rep_stat_print,
    88529063        METH_VARARGS|METH_KEYWORDS},
    8853 #endif
    88549064
    88559065#if (DBVER >= 45)
    88569066    {"repmgr_start", (PyCFunction)DBEnv_repmgr_start,
    88579067        METH_VARARGS|METH_KEYWORDS},
     9068#if (DBVER < 52)
    88589069    {"repmgr_set_local_site", (PyCFunction)DBEnv_repmgr_set_local_site,
    88599070        METH_VARARGS|METH_KEYWORDS},
    88609071    {"repmgr_add_remote_site", (PyCFunction)DBEnv_repmgr_add_remote_site,
    88619072        METH_VARARGS|METH_KEYWORDS},
     9073#endif
    88629074    {"repmgr_set_ack_policy", (PyCFunction)DBEnv_repmgr_set_ack_policy,
    88639075        METH_VARARGS},
     
    88729084    {"repmgr_stat_print", (PyCFunction)DBEnv_repmgr_stat_print,
    88739085        METH_VARARGS|METH_KEYWORDS},
     9086#endif
     9087#if (DBVER >= 52)
     9088    {"repmgr_site", (PyCFunction)DBEnv_repmgr_site,
     9089        METH_VARARGS | METH_KEYWORDS},
     9090    {"repmgr_site_by_eid",  (PyCFunction)DBEnv_repmgr_site_by_eid,
     9091        METH_VARARGS | METH_KEYWORDS},
    88749092#endif
    88759093    {NULL,      NULL}       /* sentinel */
     
    88939111
    88949112
    8895 #if (DBVER >= 43)
    88969113static PyMethodDef DBSequence_methods[] = {
    88979114    {"close",           (PyCFunction)DBSequence_close,          METH_VARARGS},
     
    89139130    {NULL,      NULL}       /* sentinel */
    89149131};
    8915 #endif
    89169132
    89179133
     
    89239139    CHECK_ENV_NOT_CLOSED(self);
    89249140
    8925 #if (DBVER >= 42)
    89269141    MYDB_BEGIN_ALLOW_THREADS;
    89279142    self->db_env->get_home(self->db_env, &home);
    89289143    MYDB_END_ALLOW_THREADS;
    8929 #else
    8930     home=self->db_env->db_home;
    8931 #endif
    89329144
    89339145    if (home == NULL) {
     
    90719283};
    90729284
     9285#if (DBVER >= 52)
     9286statichere PyTypeObject DBSite_Type = {
     9287#if (PY_VERSION_HEX < 0x03000000)
     9288    PyObject_HEAD_INIT(NULL)
     9289    0,                  /*ob_size*/
     9290#else
     9291    PyVarObject_HEAD_INIT(NULL, 0)
     9292#endif
     9293    "DBSite",         /*tp_name*/
     9294    sizeof(DBSiteObject),  /*tp_basicsize*/
     9295    0,          /*tp_itemsize*/
     9296    /* methods */
     9297    (destructor)DBSite_dealloc,/*tp_dealloc*/
     9298    0,          /*tp_print*/
     9299    0,          /*tp_getattr*/
     9300    0,          /*tp_setattr*/
     9301    0,          /*tp_compare*/
     9302    0,          /*tp_repr*/
     9303    0,          /*tp_as_number*/
     9304    0,          /*tp_as_sequence*/
     9305    0,          /*tp_as_mapping*/
     9306    0,          /*tp_hash*/
     9307    0,          /*tp_call*/
     9308    0,          /*tp_str*/
     9309    0,          /*tp_getattro*/
     9310    0,          /*tp_setattro*/
     9311    0,          /*tp_as_buffer*/
     9312#if (PY_VERSION_HEX < 0x03000000)
     9313    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_WEAKREFS,      /* tp_flags */
     9314#else
     9315    Py_TPFLAGS_DEFAULT,      /* tp_flags */
     9316#endif
     9317    0,          /* tp_doc */
     9318    0,          /* tp_traverse */
     9319    0,          /* tp_clear */
     9320    0,          /* tp_richcompare */
     9321    offsetof(DBSiteObject, in_weakreflist),   /* tp_weaklistoffset */
     9322    0,          /*tp_iter*/
     9323    0,          /*tp_iternext*/
     9324    DBSite_methods, /*tp_methods*/
     9325    0,          /*tp_members*/
     9326};
     9327#endif
    90739328
    90749329statichere PyTypeObject DBEnv_Type = {
     
    91969451};
    91979452
    9198 #if (DBVER >= 43)
    91999453statichere PyTypeObject DBSequence_Type = {
    92009454#if (PY_VERSION_HEX < 0x03000000)
     
    92389492    0,          /*tp_members*/
    92399493};
    9240 #endif
    92419494
    92429495/* --------------------------------------------------------------------- */
     
    92729525}
    92739526
    9274 #if (DBVER >= 43)
    92759527static PyObject*
    92769528DBSequence_construct(PyObject* self, PyObject* args, PyObject* kwargs)
     
    92889540    return (PyObject* )newDBSequenceObject((DBObject*)dbobj, flags);
    92899541}
    9290 #endif
    92919542
    92929543static char bsddb_version_doc[] =
     
    92999550    int major, minor, patch;
    93009551
     9552    /* This should be instantaneous, no need to release the GIL */
    93019553    db_version(&major, &minor, &patch);
    93029554    return Py_BuildValue("(iii)", major, minor, patch);
    93039555}
     9556
     9557#if (DBVER >= 50)
     9558static PyObject*
     9559bsddb_version_full(PyObject* self)
     9560{
     9561    char *version_string;
     9562    int family, release, major, minor, patch;
     9563
     9564    /* This should be instantaneous, no need to release the GIL */
     9565    version_string = db_full_version(&family, &release, &major, &minor, &patch);
     9566    return Py_BuildValue("(siiiii)",
     9567            version_string, family, release, major, minor, patch);
     9568}
     9569#endif
    93049570
    93059571
     
    93089574    {"DB",          (PyCFunction)DB_construct,          METH_VARARGS | METH_KEYWORDS },
    93099575    {"DBEnv",       (PyCFunction)DBEnv_construct,       METH_VARARGS},
    9310 #if (DBVER >= 43)
    93119576    {"DBSequence",  (PyCFunction)DBSequence_construct,  METH_VARARGS | METH_KEYWORDS },
    9312 #endif
    93139577    {"version",     (PyCFunction)bsddb_version,         METH_NOARGS, bsddb_version_doc},
     9578#if (DBVER >= 50)
     9579    {"full_version", (PyCFunction)bsddb_version_full, METH_NOARGS},
     9580#endif
    93149581    {NULL,      NULL}       /* sentinel */
    93159582};
     
    93299596#define ADD_INT(dict, NAME)         _addIntToDict(dict, #NAME, NAME)
    93309597
     9598/*
     9599** We can rename the module at import time, so the string allocated
     9600** must be big enough, and any use of the name must use this particular
     9601** string.
     9602*/
    93319603#define MODULE_NAME_MAX_LEN     11
    93329604static char _bsddbModuleName[MODULE_NAME_MAX_LEN+1] = "_bsddb";
     
    93799651        || (PyType_Ready(&DBTxn_Type) < 0)
    93809652        || (PyType_Ready(&DBLock_Type) < 0)
    9381 #if (DBVER >= 43)
    93829653        || (PyType_Ready(&DBSequence_Type) < 0)
     9654#if (DBVER >= 52)
     9655        || (PyType_Ready(&DBSite_Type) < 0)
    93839656#endif
    93849657        ) {
     
    93899662#endif
    93909663    }
    9391 
    9392 #if defined(WITH_THREAD) && !defined(MYDB_USE_GILSTATE)
    9393     /* Save the current interpreter, so callbacks can do the right thing. */
    9394     _db_interpreterState = PyThreadState_GET()->interp;
    9395 #endif
    93969664
    93979665    /* Create the module and add the functions */
     
    94299697
    94309698#if (DBVER < 48)
    9431 #if (DBVER >= 42)
    94329699    ADD_INT(d, DB_RPCCLIENT);
    9433 #else
    9434     ADD_INT(d, DB_CLIENT);
    9435     /* allow apps to be written using DB_RPCCLIENT on older Berkeley DB */
    9436     _addIntToDict(d, "DB_RPCCLIENT", DB_CLIENT);
    9437 #endif
    94389700#endif
    94399701
     
    94779739    ADD_INT(d, DB_TXN_SYNC);
    94789740    ADD_INT(d, DB_TXN_NOWAIT);
     9741
     9742#if (DBVER >= 51)
     9743    ADD_INT(d, DB_TXN_BULK);
     9744#endif
     9745
     9746#if (DBVER >= 48)
     9747    ADD_INT(d, DB_CURSOR_BULK);
     9748#endif
    94799749
    94809750#if (DBVER >= 46)
     
    95129782
    95139783    ADD_INT(d, DB_LOCK_EXPIRE);
    9514 #if (DBVER >= 43)
    95159784    ADD_INT(d, DB_LOCK_MAXWRITE);
    9516 #endif
    95179785
    95189786    _addIntToDict(d, "DB_LOCK_CONFLICT", 0);
     
    95509818
    95519819    ADD_INT(d, DB_LSTAT_ABORTED);
    9552 #if (DBVER < 43)
    9553     ADD_INT(d, DB_LSTAT_ERR);
    9554 #endif
    95559820    ADD_INT(d, DB_LSTAT_FREE);
    95569821    ADD_INT(d, DB_LSTAT_HELD);
     
    95629827    ADD_INT(d, DB_ARCH_DATA);
    95639828    ADD_INT(d, DB_ARCH_LOG);
    9564 #if (DBVER >= 42)
    95659829    ADD_INT(d, DB_ARCH_REMOVE);
    9566 #endif
    95679830
    95689831    ADD_INT(d, DB_BTREE);
     
    95799842    ADD_INT(d, DB_SNAPSHOT);
    95809843
    9581 #if (DBVER >= 43)
    95829844    ADD_INT(d, DB_INORDER);
    9583 #endif
    95849845
    95859846    ADD_INT(d, DB_JOIN_NOSORT);
     
    95929853#endif
    95939854
    9594 #if (DBVER <= 41)
    9595     ADD_INT(d, DB_COMMIT);
    9596 #endif
    95979855    ADD_INT(d, DB_CONSUME);
    95989856    ADD_INT(d, DB_CONSUME_WAIT);
     
    96529910    ADD_INT(d, DB_LOCK_NOTGRANTED);
    96539911    ADD_INT(d, DB_NOSERVER);
     9912#if (DBVER < 52)
    96549913    ADD_INT(d, DB_NOSERVER_HOME);
    96559914    ADD_INT(d, DB_NOSERVER_ID);
     9915#endif
    96569916    ADD_INT(d, DB_NOTFOUND);
    96579917    ADD_INT(d, DB_OLD_VERSION);
     
    96669926    ADD_INT(d, DB_PANIC_ENVIRONMENT);
    96679927    ADD_INT(d, DB_NOPANIC);
    9668 
    96699928    ADD_INT(d, DB_OVERWRITE);
    96709929
    9671 #if (DBVER >= 43)
    96729930    ADD_INT(d, DB_STAT_SUBSYSTEM);
    96739931    ADD_INT(d, DB_STAT_MEMP_HASH);
    9674 #endif
     9932    ADD_INT(d, DB_STAT_LOCK_CONF);
     9933    ADD_INT(d, DB_STAT_LOCK_LOCKERS);
     9934    ADD_INT(d, DB_STAT_LOCK_OBJECTS);
     9935    ADD_INT(d, DB_STAT_LOCK_PARAMS);
    96759936
    96769937#if (DBVER >= 48)
     
    96919952    ADD_INT(d, DB_EID_BROADCAST);
    96929953
    9693 #if (DBVER >= 42)
    96949954    ADD_INT(d, DB_TIME_NOTGRANTED);
    96959955    ADD_INT(d, DB_TXN_NOT_DURABLE);
     
    96999959    ADD_INT(d, DB_ENCRYPT);
    97009960    ADD_INT(d, DB_CHKSUM);
    9701 #endif
    9702 
    9703 #if (DBVER >= 42) && (DBVER < 47)
     9961
     9962#if (DBVER < 47)
    97049963    ADD_INT(d, DB_LOG_AUTOREMOVE);
    97059964    ADD_INT(d, DB_DIRECT_LOG);
     
    97349993    ADD_INT(d, DB_VERB_WAITSFOR);
    97359994
     9995#if (DBVER >= 50)
     9996    ADD_INT(d, DB_VERB_REP_SYSTEM);
     9997#endif
     9998
     9999#if (DBVER >= 47)
     10000    ADD_INT(d, DB_VERB_REP_ELECT);
     10001    ADD_INT(d, DB_VERB_REP_LEASE);
     10002    ADD_INT(d, DB_VERB_REP_MISC);
     10003    ADD_INT(d, DB_VERB_REP_MSGS);
     10004    ADD_INT(d, DB_VERB_REP_SYNC);
     10005    ADD_INT(d, DB_VERB_REPMGR_CONNFAIL);
     10006    ADD_INT(d, DB_VERB_REPMGR_MISC);
     10007#endif
     10008
    973610009#if (DBVER >= 45)
    973710010    ADD_INT(d, DB_EVENT_PANIC);
     
    974910022#endif
    975010023
     10024#if (DBVER >= 50)
     10025    ADD_INT(d, DB_REPMGR_CONF_ELECTIONS);
     10026    ADD_INT(d, DB_EVENT_REP_MASTER_FAILURE);
     10027    ADD_INT(d, DB_EVENT_REP_DUPMASTER);
     10028    ADD_INT(d, DB_EVENT_REP_ELECTION_FAILED);
     10029#endif
     10030#if (DBVER >= 48)
     10031    ADD_INT(d, DB_EVENT_REG_ALIVE);
     10032    ADD_INT(d, DB_EVENT_REG_PANIC);
     10033#endif
     10034
     10035#if (DBVER >=52)
     10036    ADD_INT(d, DB_EVENT_REP_SITE_ADDED);
     10037    ADD_INT(d, DB_EVENT_REP_SITE_REMOVED);
     10038    ADD_INT(d, DB_EVENT_REP_LOCAL_SITE_REMOVED);
     10039    ADD_INT(d, DB_EVENT_REP_CONNECT_BROKEN);
     10040    ADD_INT(d, DB_EVENT_REP_CONNECT_ESTD);
     10041    ADD_INT(d, DB_EVENT_REP_CONNECT_TRY_FAILED);
     10042    ADD_INT(d, DB_EVENT_REP_INIT_DONE);
     10043
     10044    ADD_INT(d, DB_MEM_LOCK);
     10045    ADD_INT(d, DB_MEM_LOCKOBJECT);
     10046    ADD_INT(d, DB_MEM_LOCKER);
     10047    ADD_INT(d, DB_MEM_LOGID);
     10048    ADD_INT(d, DB_MEM_TRANSACTION);
     10049    ADD_INT(d, DB_MEM_THREAD);
     10050
     10051    ADD_INT(d, DB_BOOTSTRAP_HELPER);
     10052    ADD_INT(d, DB_GROUP_CREATOR);
     10053    ADD_INT(d, DB_LEGACY);
     10054    ADD_INT(d, DB_LOCAL_SITE);
     10055    ADD_INT(d, DB_REPMGR_PEER);
     10056#endif
     10057
    975110058    ADD_INT(d, DB_REP_DUPMASTER);
    975210059    ADD_INT(d, DB_REP_HOLDELECTION);
     
    975510062    ADD_INT(d, DB_REP_JOIN_FAILURE);
    975610063#endif
    9757 #if (DBVER >= 42)
    975810064    ADD_INT(d, DB_REP_ISPERM);
    975910065    ADD_INT(d, DB_REP_NOTPERM);
    9760 #endif
    976110066    ADD_INT(d, DB_REP_NEWSITE);
    976210067
     
    976710072
    976810073#if (DBVER >= 44)
     10074#if (DBVER >= 50)
     10075    ADD_INT(d, DB_REP_CONF_AUTOINIT);
     10076#else
    976910077    ADD_INT(d, DB_REP_CONF_NOAUTOINIT);
     10078#endif /* 5.0 */
     10079#endif /* 4.4 */
     10080#if (DBVER >= 44)
    977010081    ADD_INT(d, DB_REP_CONF_DELAYCLIENT);
    977110082    ADD_INT(d, DB_REP_CONF_BULK);
     
    977510086#endif
    977610087
    9777 #if (DBVER >= 42)
    977810088    ADD_INT(d, DB_REP_NOBUFFER);
    9779 #endif
    978010089
    978110090#if (DBVER >= 46)
     
    982010129#endif
    982110130
    9822 #if (DBVER >= 43)
     10131#if (DBVER >= 51)
     10132    ADD_INT(d, DB_REPMGR_ACKS_ALL_AVAILABLE);
     10133#endif
     10134
     10135#if (DBVER >= 48)
     10136    ADD_INT(d, DB_REP_CONF_INMEM);
     10137#endif
     10138
     10139    ADD_INT(d, DB_TIMEOUT);
     10140
     10141#if (DBVER >= 50)
     10142    ADD_INT(d, DB_FORCESYNC);
     10143#endif
     10144
     10145#if (DBVER >= 48)
     10146    ADD_INT(d, DB_FAILCHK);
     10147#endif
     10148
     10149#if (DBVER >= 51)
     10150    ADD_INT(d, DB_HOTBACKUP_IN_PROGRESS);
     10151#endif
     10152
    982310153    ADD_INT(d, DB_BUFFER_SMALL);
    982410154    ADD_INT(d, DB_SEQ_DEC);
    982510155    ADD_INT(d, DB_SEQ_INC);
    982610156    ADD_INT(d, DB_SEQ_WRAP);
    9827 #endif
    9828 
    9829 #if (DBVER >= 43) && (DBVER < 47)
     10157
     10158#if (DBVER < 47)
    983010159    ADD_INT(d, DB_LOG_INMEMORY);
    983110160    ADD_INT(d, DB_DSYNC_LOG);
     
    985610185    ADD_INT(d, DB_SET_LOCK_TIMEOUT);
    985710186    ADD_INT(d, DB_SET_TXN_TIMEOUT);
     10187
     10188#if (DBVER >= 48)
     10189    ADD_INT(d, DB_SET_REG_TIMEOUT);
     10190#endif
    985810191
    985910192    /* The exception name must be correct for pickled exception *
     
    991310246    MAKE_EX(DBVerifyBadError);
    991410247    MAKE_EX(DBNoServerError);
     10248#if (DBVER < 52)
    991510249    MAKE_EX(DBNoServerHomeError);
    991610250    MAKE_EX(DBNoServerIDError);
     10251#endif
    991710252    MAKE_EX(DBPageNotFoundError);
    991810253    MAKE_EX(DBSecondaryBadError);
     
    992810263    MAKE_EX(DBPermissionsError);
    992910264
    9930 #if (DBVER >= 42)
    993110265    MAKE_EX(DBRepHandleDeadError);
    9932 #endif
    993310266#if (DBVER >= 44)
    993410267    MAKE_EX(DBRepLockoutError);
     
    994810281
    994910282    /* Initialise the C API structure and add it to the module */
     10283    bsddb_api.api_version      = PYBSDDB_API_VERSION;
    995010284    bsddb_api.db_type          = &DB_Type;
    995110285    bsddb_api.dbcursor_type    = &DBCursor_Type;
     
    995410288    bsddb_api.dbtxn_type       = &DBTxn_Type;
    995510289    bsddb_api.dblock_type      = &DBLock_Type;
    9956 #if (DBVER >= 43)
    995710290    bsddb_api.dbsequence_type  = &DBSequence_Type;
    9958 #endif
    995910291    bsddb_api.makeDBError      = makeDBError;
    996010292
    996110293    /*
    9962     ** Capsules exist from Python 3.1, but I
    9963     ** don't want to break the API compatibility
    9964     ** for already published Python versions.
     10294    ** Capsules exist from Python 2.7 and 3.1.
     10295    ** We don't support Python 3.0 anymore, so...
     10296    ** #if (PY_VERSION_HEX < ((PY_MAJOR_VERSION < 3) ? 0x02070000 : 0x03020000))
    996510297    */
    9966 #if (PY_VERSION_HEX < 0x03020000)
     10298#if (PY_VERSION_HEX < 0x02070000)
    996710299    py_api = PyCObject_FromVoidPtr((void*)&bsddb_api, NULL);
    996810300#else
    996910301    {
    9970         char py_api_name[250];
     10302        /*
     10303        ** The data must outlive the call!!. So, the static definition.
     10304        ** The buffer must be big enough...
     10305        */
     10306        static char py_api_name[MODULE_NAME_MAX_LEN+10];
    997110307
    997210308        strcpy(py_api_name, _bsddbModuleName);
     
    997710313#endif
    997810314
    9979     PyDict_SetItemString(d, "api", py_api);
    9980     Py_DECREF(py_api);
     10315    /* Check error control */
     10316    /*
     10317    ** PyErr_NoMemory();
     10318    ** py_api = NULL;
     10319    */
     10320
     10321    if (py_api) {
     10322        PyDict_SetItemString(d, "api", py_api);
     10323        Py_DECREF(py_api);
     10324    } else { /* Something bad happened */
     10325        PyErr_WriteUnraisable(m);
     10326        if(PyErr_Warn(PyExc_RuntimeWarning,
     10327                "_bsddb/_pybsddb C API will be not available")) {
     10328            PyErr_WriteUnraisable(m);
     10329        }
     10330        PyErr_Clear();
     10331    }
    998110332
    998210333    /* Check for errors */
Note: See TracChangeset for help on using the changeset viewer.