… | |
… | |
47 | typedef DBC DBC_ornuked; |
47 | typedef DBC DBC_ornuked; |
48 | typedef DB DB_ornuked; |
48 | typedef DB DB_ornuked; |
49 | typedef DB_SEQUENCE DB_SEQUENCE_ornuked; |
49 | typedef DB_SEQUENCE DB_SEQUENCE_ornuked; |
50 | |
50 | |
51 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
51 | typedef SV SV8; /* byte-sv, used for argument-checking */ |
52 | typedef char *octetstring; |
52 | typedef char *bdb_filename; |
53 | |
53 | |
54 | static SV *prepare_cb; |
54 | static SV *prepare_cb; |
55 | |
55 | |
56 | #if DB_VERSION_MINOR >= 6 |
56 | #if DB_VERSION_MINOR >= 6 |
57 | # define c_close close |
57 | # define c_close close |
… | |
… | |
952 | static void |
952 | static void |
953 | ptr_nuke (SV *sv) |
953 | ptr_nuke (SV *sv) |
954 | { |
954 | { |
955 | assert (SvROK (sv)); |
955 | assert (SvROK (sv)); |
956 | sv_setiv (SvRV (sv), 0); |
956 | sv_setiv (SvRV (sv), 0); |
|
|
957 | } |
|
|
958 | |
|
|
959 | static int |
|
|
960 | errno_get (pTHX_ SV *sv, MAGIC *mg) |
|
|
961 | { |
|
|
962 | if (*mg->mg_ptr == '!') // should always be the case |
|
|
963 | if (-30999 <= errno && errno <= -30800) |
|
|
964 | { |
|
|
965 | sv_setnv (sv, (NV)errno); |
|
|
966 | sv_setpv (sv, db_strerror (errno)); |
|
|
967 | SvNOK_on (sv); /* what a wonderful hack! */ |
|
|
968 | // ^^^ copied from perl sources |
|
|
969 | return 0; |
|
|
970 | } |
|
|
971 | |
|
|
972 | return PL_vtbl_sv.svt_get (aTHX_ sv, mg); |
|
|
973 | } |
|
|
974 | |
|
|
975 | static MGVTBL vtbl_errno; |
|
|
976 | |
|
|
977 | // this wonderful hack :( patches perl's $! variable to support our errno values |
|
|
978 | static void |
|
|
979 | patch_errno (void) |
|
|
980 | { |
|
|
981 | SV *sv; |
|
|
982 | MAGIC *mg; |
|
|
983 | |
|
|
984 | if (!(sv = get_sv ("!", 1))) |
|
|
985 | return; |
|
|
986 | |
|
|
987 | if (!(mg = mg_find (sv, PERL_MAGIC_sv))) |
|
|
988 | return; |
|
|
989 | |
|
|
990 | if (mg->mg_virtual != &PL_vtbl_sv) |
|
|
991 | return; |
|
|
992 | |
|
|
993 | vtbl_errno = PL_vtbl_sv; |
|
|
994 | vtbl_errno.svt_get = errno_get; |
|
|
995 | mg->mg_virtual = &vtbl_errno; |
957 | } |
996 | } |
958 | |
997 | |
959 | MODULE = BDB PACKAGE = BDB |
998 | MODULE = BDB PACKAGE = BDB |
960 | |
999 | |
961 | PROTOTYPES: ENABLE |
1000 | PROTOTYPES: ENABLE |
… | |
… | |
1159 | X_MUTEX_CHECK (reslock); |
1198 | X_MUTEX_CHECK (reslock); |
1160 | X_MUTEX_CHECK (reqlock); |
1199 | X_MUTEX_CHECK (reqlock); |
1161 | |
1200 | |
1162 | X_COND_CHECK (reqwait); |
1201 | X_COND_CHECK (reqwait); |
1163 | #endif |
1202 | #endif |
|
|
1203 | patch_errno (); |
1164 | } |
1204 | } |
1165 | |
1205 | |
1166 | void |
1206 | void |
1167 | max_poll_reqs (int nreqs) |
1207 | max_poll_reqs (int nreqs) |
1168 | PROTOTYPE: $ |
1208 | PROTOTYPE: $ |
… | |
… | |
1326 | } |
1366 | } |
1327 | OUTPUT: |
1367 | OUTPUT: |
1328 | RETVAL |
1368 | RETVAL |
1329 | |
1369 | |
1330 | void |
1370 | void |
1331 | db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) |
1371 | db_env_open (DB_ENV *env, bdb_filename db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) |
1332 | CODE: |
1372 | CODE: |
1333 | { |
1373 | { |
1334 | dREQ (REQ_ENV_OPEN); |
1374 | dREQ (REQ_ENV_OPEN); |
1335 | |
1375 | |
1336 | req->env = env; |
1376 | req->env = env; |
… | |
… | |
1407 | } |
1447 | } |
1408 | OUTPUT: |
1448 | OUTPUT: |
1409 | RETVAL |
1449 | RETVAL |
1410 | |
1450 | |
1411 | void |
1451 | void |
1412 | db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) |
1452 | db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) |
1413 | CODE: |
1453 | CODE: |
1414 | { |
1454 | { |
1415 | dREQ (REQ_DB_OPEN); |
1455 | dREQ (REQ_DB_OPEN); |
1416 | req->db = db; |
1456 | req->db = db; |
1417 | req->txn = txnid; |
1457 | req->txn = txnid; |
… | |
… | |
1457 | req->uint1 = flags; |
1497 | req->uint1 = flags; |
1458 | REQ_SEND; |
1498 | REQ_SEND; |
1459 | } |
1499 | } |
1460 | |
1500 | |
1461 | void |
1501 | void |
1462 | db_upgrade (DB *db, octetstring file, U32 flags = 0, SV *callback = &PL_sv_undef) |
1502 | db_upgrade (DB *db, bdb_filename file, U32 flags = 0, SV *callback = &PL_sv_undef) |
1463 | CODE: |
1503 | CODE: |
1464 | { |
1504 | { |
1465 | dREQ (REQ_DB_SYNC); |
1505 | dREQ (REQ_DB_SYNC); |
1466 | req->db = db; |
1506 | req->db = db; |
1467 | req->buf1 = strdup (file); |
1507 | req->buf1 = strdup (file); |
… | |
… | |
2045 | CODE: |
2085 | CODE: |
2046 | RETVAL = seq->set_range (seq, min, max); |
2086 | RETVAL = seq->set_range (seq, min, max); |
2047 | OUTPUT: |
2087 | OUTPUT: |
2048 | RETVAL |
2088 | RETVAL |
2049 | |
2089 | |
|
|
2090 | |