… | |
… | |
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)) |
… | |
… | |
803 | req->result = req->db->upgrade (req->db, req->buf1, req->uint1); |
806 | req->result = req->db->upgrade (req->db, req->buf1, req->uint1); |
804 | break; |
807 | break; |
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); |
|
|
811 | break; |
|
|
812 | |
|
|
813 | case REQ_DB_EXISTS: |
|
|
814 | req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1); |
808 | break; |
815 | break; |
809 | |
816 | |
810 | case REQ_DB_GET: |
817 | case REQ_DB_GET: |
811 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
818 | req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); |
812 | break; |
819 | break; |
… | |
… | |
997 | (var) = INT2PTR (type, tmp); \ |
1004 | (var) = INT2PTR (type, tmp); \ |
998 | if (!var && nullok != 2) \ |
1005 | if (!var && nullok != 2) \ |
999 | croak (# var " is not a valid " # class " object anymore"); \ |
1006 | croak (# var " is not a valid " # class " object anymore"); \ |
1000 | } \ |
1007 | } \ |
1001 | else \ |
1008 | else \ |
1002 | croak (# var " is not of type " # class); \ |
1009 | croak (# var " is not of type " # class); |
1003 | \ |
|
|
1004 | |
1010 | |
1005 | static void |
1011 | static void |
1006 | ptr_nuke (SV *sv) |
1012 | ptr_nuke (SV *sv) |
1007 | { |
1013 | { |
1008 | assert (SvROK (sv)); |
1014 | assert (SvROK (sv)); |
… | |
… | |
1046 | vtbl_errno = PL_vtbl_sv; |
1052 | vtbl_errno = PL_vtbl_sv; |
1047 | vtbl_errno.svt_get = errno_get; |
1053 | vtbl_errno.svt_get = errno_get; |
1048 | mg->mg_virtual = &vtbl_errno; |
1054 | mg->mg_virtual = &vtbl_errno; |
1049 | } |
1055 | } |
1050 | |
1056 | |
1051 | static SV * |
1057 | #if __GNUC__ >= 4 |
|
|
1058 | # define noinline __attribute__ ((noinline)) |
|
|
1059 | #else |
|
|
1060 | # define noinline |
|
|
1061 | #endif |
|
|
1062 | |
|
|
1063 | static noinline SV * |
1052 | pop_callback (I32 *ritems, SV *sv) |
1064 | pop_callback (I32 *ritems, SV *sv) |
1053 | { |
1065 | { |
1054 | if (SvROK (sv)) |
1066 | if (SvROK (sv)) |
1055 | { |
1067 | { |
1056 | HV *st; |
1068 | HV *st; |
1057 | GV *gvp; |
1069 | GV *gvp; |
|
|
1070 | CV *cv; |
|
|
1071 | const char *name; |
|
|
1072 | |
|
|
1073 | /* forgive me */ |
|
|
1074 | if (SvTYPE (SvRV (sv)) == SVt_PVMG |
|
|
1075 | && (st = SvSTASH (SvRV (sv))) |
|
|
1076 | && (name = HvNAME_get (st)) |
|
|
1077 | && (name [0] == 'B' && name [1] == 'D' && name [2] == 'B' && name [3] == ':')) |
|
|
1078 | return 0; |
|
|
1079 | |
1058 | CV *cv = sv_2cv (sv, &st, &gvp, 0); |
1080 | if ((cv = sv_2cv (sv, &st, &gvp, 0))) |
1059 | |
|
|
1060 | if (cv) |
|
|
1061 | { |
1081 | { |
1062 | --*ritems; |
1082 | --*ritems; |
1063 | return (SV *)cv; |
1083 | return (SV *)cv; |
1064 | } |
1084 | } |
1065 | } |
1085 | } |
… | |
… | |
1674 | req->uint1 = flags; |
1694 | req->uint1 = flags; |
1675 | REQ_SEND; |
1695 | REQ_SEND; |
1676 | } |
1696 | } |
1677 | |
1697 | |
1678 | void |
1698 | void |
|
|
1699 | db_exists (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0) |
|
|
1700 | PREINIT: |
|
|
1701 | CALLBACK |
|
|
1702 | CODE: |
|
|
1703 | { |
|
|
1704 | dREQ (REQ_DB_EXISTS); |
|
|
1705 | req->db = db; |
|
|
1706 | req->txn = txn; |
|
|
1707 | req->uint1 = flags; |
|
|
1708 | sv_to_dbt (&req->dbt1, key); |
|
|
1709 | REQ_SEND; |
|
|
1710 | } |
|
|
1711 | |
|
|
1712 | void |
1679 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
1713 | db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) |
1680 | PREINIT: |
1714 | PREINIT: |
1681 | CALLBACK |
1715 | CALLBACK |
1682 | CODE: |
1716 | CODE: |
1683 | if (SvREADONLY (data)) |
1717 | if (SvREADONLY (data)) |
… | |
… | |
2100 | if (errno) |
2134 | if (errno) |
2101 | croak ("DB_ENV->txn_begin: %s", db_strerror (errno)); |
2135 | croak ("DB_ENV->txn_begin: %s", db_strerror (errno)); |
2102 | OUTPUT: |
2136 | OUTPUT: |
2103 | RETVAL |
2137 | RETVAL |
2104 | |
2138 | |
|
|
2139 | DB_TXN * |
|
|
2140 | cdsgroup_begin (DB_ENV *env) |
|
|
2141 | CODE: |
|
|
2142 | errno = env->cdsgroup_begin (env, &RETVAL); |
|
|
2143 | if (errno) |
|
|
2144 | croak ("DB_ENV->cdsgroup_begin: %s", db_strerror (errno)); |
|
|
2145 | OUTPUT: |
|
|
2146 | RETVAL |
|
|
2147 | |
2105 | MODULE = BDB PACKAGE = BDB::Db |
2148 | MODULE = BDB PACKAGE = BDB::Db |
2106 | |
2149 | |
2107 | void |
2150 | void |
2108 | DESTROY (DB_ornuked *db) |
2151 | DESTROY (DB_ornuked *db) |
2109 | CODE: |
2152 | CODE: |