… | |
… | |
139 | enum { |
139 | enum { |
140 | REQ_QUIT, |
140 | REQ_QUIT, |
141 | REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT, |
141 | REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT, |
142 | REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME, |
142 | REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME, |
143 | REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_UPGRADE, |
143 | REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_UPGRADE, |
144 | REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE, |
144 | REQ_DB_PUT, REQ_DB_EXISTS, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE, |
145 | REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH, |
145 | REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH, |
146 | REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL, |
146 | REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL, |
147 | REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE, |
147 | REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE, |
148 | }; |
148 | }; |
149 | |
149 | |
… | |
… | |
411 | return !SvTRUE (ERRSV); |
411 | return !SvTRUE (ERRSV); |
412 | } |
412 | } |
413 | |
413 | |
414 | static void req_free (bdb_req req) |
414 | static void req_free (bdb_req req) |
415 | { |
415 | { |
|
|
416 | SvREFCNT_dec (req->callback); |
|
|
417 | |
416 | free (req->buf1); |
418 | free (req->buf1); |
417 | free (req->buf2); |
419 | free (req->buf2); |
418 | free (req->buf3); |
420 | free (req->buf3); |
|
|
421 | |
419 | Safefree (req); |
422 | Safefree (req); |
420 | } |
423 | } |
421 | |
424 | |
422 | #ifdef USE_SOCKETS_AS_HANDLES |
425 | #ifdef USE_SOCKETS_AS_HANDLES |
423 | # define TO_SOCKET(x) (win32_get_osfhandle (x)) |
426 | # define TO_SOCKET(x) (win32_get_osfhandle (x)) |
… | |
… | |
805 | |
808 | |
806 | case REQ_DB_PUT: |
809 | case REQ_DB_PUT: |
807 | req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); |
810 | req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); |
808 | break; |
811 | break; |
809 | |
812 | |
|
|
813 | #if DB_VERSION_MINOR >= 6 |
|
|
814 | case REQ_DB_EXISTS: |
|
|
815 | req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); |
|
|
816 | break; |
|
|
817 | #endif |
810 | case REQ_DB_GET: |
818 | case REQ_DB_GET: |
811 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
819 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
812 | break; |
820 | break; |
813 | |
821 | |
814 | case REQ_DB_PGET: |
822 | case REQ_DB_PGET: |
… | |
… | |
997 | (var) = INT2PTR (type, tmp); \ |
1005 | (var) = INT2PTR (type, tmp); \ |
998 | if (!var && nullok != 2) \ |
1006 | if (!var && nullok != 2) \ |
999 | croak (# var " is not a valid " # class " object anymore"); \ |
1007 | croak (# var " is not a valid " # class " object anymore"); \ |
1000 | } \ |
1008 | } \ |
1001 | else \ |
1009 | else \ |
1002 | croak (# var " is not of type " # class); \ |
1010 | croak (# var " is not of type " # class); |
1003 | \ |
|
|
1004 | |
1011 | |
1005 | static void |
1012 | static void |
1006 | ptr_nuke (SV *sv) |
1013 | ptr_nuke (SV *sv) |
1007 | { |
1014 | { |
1008 | assert (SvROK (sv)); |
1015 | assert (SvROK (sv)); |
… | |
… | |
1046 | vtbl_errno = PL_vtbl_sv; |
1053 | vtbl_errno = PL_vtbl_sv; |
1047 | vtbl_errno.svt_get = errno_get; |
1054 | vtbl_errno.svt_get = errno_get; |
1048 | mg->mg_virtual = &vtbl_errno; |
1055 | mg->mg_virtual = &vtbl_errno; |
1049 | } |
1056 | } |
1050 | |
1057 | |
1051 | static SV * |
1058 | #if __GNUC__ >= 4 |
|
|
1059 | # define noinline __attribute__ ((noinline)) |
|
|
1060 | #else |
|
|
1061 | # define noinline |
|
|
1062 | #endif |
|
|
1063 | |
|
|
1064 | static noinline SV * |
1052 | pop_callback (I32 *ritems, SV *sv) |
1065 | pop_callback (I32 *ritems, SV *sv) |
1053 | { |
1066 | { |
1054 | if (SvROK (sv)) |
1067 | if (SvROK (sv)) |
1055 | { |
1068 | { |
1056 | HV *st; |
1069 | HV *st; |
1057 | GV *gvp; |
1070 | GV *gvp; |
|
|
1071 | CV *cv; |
|
|
1072 | const char *name; |
|
|
1073 | |
|
|
1074 | /* forgive me */ |
|
|
1075 | if (SvTYPE (SvRV (sv)) == SVt_PVMG |
|
|
1076 | && (st = SvSTASH (SvRV (sv))) |
|
|
1077 | && (name = HvNAME_get (st)) |
|
|
1078 | && (name [0] == 'B' && name [1] == 'D' && name [2] == 'B' && name [3] == ':')) |
|
|
1079 | return 0; |
|
|
1080 | |
1058 | CV *cv = sv_2cv (sv, &st, &gvp, 0); |
1081 | if ((cv = sv_2cv (sv, &st, &gvp, 0))) |
1059 | |
|
|
1060 | if (cv) |
|
|
1061 | { |
1082 | { |
1062 | --*ritems; |
1083 | --*ritems; |
1063 | return (SV *)cv; |
1084 | return (SV *)cv; |
1064 | } |
1085 | } |
1065 | } |
1086 | } |
… | |
… | |
1673 | sv_to_dbt (&req->dbt2, data); |
1694 | sv_to_dbt (&req->dbt2, data); |
1674 | req->uint1 = flags; |
1695 | req->uint1 = flags; |
1675 | REQ_SEND; |
1696 | REQ_SEND; |
1676 | } |
1697 | } |
1677 | |
1698 | |
|
|
1699 | #if DB_VERSION_MINOR >= 6 |
|
|
1700 | |
|
|
1701 | void |
|
|
1702 | db_exists (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0) |
|
|
1703 | PREINIT: |
|
|
1704 | CALLBACK |
|
|
1705 | CODE: |
|
|
1706 | { |
|
|
1707 | dREQ (REQ_DB_EXISTS); |
|
|
1708 | req->db = db; |
|
|
1709 | req->txn = txn; |
|
|
1710 | req->uint1 = flags; |
|
|
1711 | sv_to_dbt (&req->dbt1, key); |
|
|
1712 | REQ_SEND; |
|
|
1713 | } |
|
|
1714 | |
|
|
1715 | #endif |
|
|
1716 | |
1678 | void |
1717 | void |
1679 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
1718 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
1680 | PREINIT: |
1719 | PREINIT: |
1681 | CALLBACK |
1720 | CALLBACK |
1682 | CODE: |
1721 | CODE: |
… | |
… | |
2100 | if (errno) |
2139 | if (errno) |
2101 | croak ("DB_ENV->txn_begin: %s", db_strerror (errno)); |
2140 | croak ("DB_ENV->txn_begin: %s", db_strerror (errno)); |
2102 | OUTPUT: |
2141 | OUTPUT: |
2103 | RETVAL |
2142 | RETVAL |
2104 | |
2143 | |
|
|
2144 | #if DB_VERSION_MINOR >= 5 |
|
|
2145 | |
|
|
2146 | DB_TXN * |
|
|
2147 | cdsgroup_begin (DB_ENV *env) |
|
|
2148 | CODE: |
|
|
2149 | errno = env->cdsgroup_begin (env, &RETVAL); |
|
|
2150 | if (errno) |
|
|
2151 | croak ("DB_ENV->cdsgroup_begin: %s", db_strerror (errno)); |
|
|
2152 | OUTPUT: |
|
|
2153 | RETVAL |
|
|
2154 | |
|
|
2155 | #endif |
|
|
2156 | |
2105 | MODULE = BDB PACKAGE = BDB::Db |
2157 | MODULE = BDB PACKAGE = BDB::Db |
2106 | |
2158 | |
2107 | void |
2159 | void |
2108 | DESTROY (DB_ornuked *db) |
2160 | DESTROY (DB_ornuked *db) |
2109 | CODE: |
2161 | CODE: |