ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/BDB/BDB.xs
(Generate patch)

Comparing BDB/BDB.xs (file contents):
Revision 1.29 by root, Tue Dec 25 14:23:21 2007 UTC vs.
Revision 1.33 by root, Sun Mar 30 04:57:55 2008 UTC

40typedef DB_TXN DB_TXN_ornull; 40typedef DB_TXN DB_TXN_ornull;
41typedef DBC DBC_ornull; 41typedef DBC DBC_ornull;
42typedef DB DB_ornull; 42typedef DB DB_ornull;
43typedef DB_SEQUENCE DB_SEQUENCE_ornull; 43typedef DB_SEQUENCE DB_SEQUENCE_ornull;
44 44
45typedef DB_ENV DB_ENV_ornuked;
46typedef DB_TXN DB_TXN_ornuked;
47typedef DBC DBC_ornuked;
48typedef DB DB_ornuked;
49typedef DB_SEQUENCE DB_SEQUENCE_ornuked;
50
45typedef SV SV8; /* byte-sv, used for argument-checking */ 51typedef SV SV8; /* byte-sv, used for argument-checking */
46typedef char *octetstring; 52typedef char *bdb_filename;
47 53
48static SV *prepare_cb; 54static SV *prepare_cb;
49 55
50#if DB_VERSION_MINOR >= 6 56#if DB_VERSION_MINOR >= 6
51# define c_close close 57# define c_close close
922 req->pri = req_pri 928 req->pri = req_pri
923 929
924#define REQ_SEND \ 930#define REQ_SEND \
925 req_send (req) 931 req_send (req)
926 932
927#define SvPTR(var, arg, type, class, nullok) \ 933#define SvPTR(var, arg, type, class, nullok) \
928 if (!SvOK (arg)) \ 934 if (!SvOK (arg)) \
929 { \ 935 { \
930 if (!nullok) \ 936 if (nullok != 1) \
931 croak (# var " must be a " # class " object, not undef"); \ 937 croak (# var " must be a " # class " object, not undef"); \
932 \ 938 \
933 (var) = 0; \ 939 (var) = 0; \
934 } \ 940 } \
935 else if (sv_derived_from ((arg), # class)) \ 941 else if (sv_derived_from ((arg), # class)) \
936 { \ 942 { \
937 IV tmp = SvIV ((SV*) SvRV (arg)); \ 943 IV tmp = SvIV ((SV*) SvRV (arg)); \
938 (var) = INT2PTR (type, tmp); \ 944 (var) = INT2PTR (type, tmp); \
939 if (!var) \ 945 if (!var && nullok != 2) \
940 croak (# var " is not a valid " # class " object anymore"); \ 946 croak (# var " is not a valid " # class " object anymore"); \
941 } \ 947 } \
942 else \ 948 else \
943 croak (# var " is not of type " # class); \ 949 croak (# var " is not of type " # class); \
944 \ 950 \
946static void 952static void
947ptr_nuke (SV *sv) 953ptr_nuke (SV *sv)
948{ 954{
949 assert (SvROK (sv)); 955 assert (SvROK (sv));
950 sv_setiv (SvRV (sv), 0); 956 sv_setiv (SvRV (sv), 0);
957}
958
959static int
960errno_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
975static MGVTBL vtbl_errno;
976
977// this wonderful hack :( patches perl's $! variable to support our errno values
978static void
979patch_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;
951} 996}
952 997
953MODULE = BDB PACKAGE = BDB 998MODULE = BDB PACKAGE = BDB
954 999
955PROTOTYPES: ENABLE 1000PROTOTYPES: ENABLE
1153 X_MUTEX_CHECK (reslock); 1198 X_MUTEX_CHECK (reslock);
1154 X_MUTEX_CHECK (reqlock); 1199 X_MUTEX_CHECK (reqlock);
1155 1200
1156 X_COND_CHECK (reqwait); 1201 X_COND_CHECK (reqwait);
1157#endif 1202#endif
1203 patch_errno ();
1158} 1204}
1159 1205
1160void 1206void
1161max_poll_reqs (int nreqs) 1207max_poll_reqs (int nreqs)
1162 PROTOTYPE: $ 1208 PROTOTYPE: $
1320} 1366}
1321 OUTPUT: 1367 OUTPUT:
1322 RETVAL 1368 RETVAL
1323 1369
1324void 1370void
1325db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) 1371db_env_open (DB_ENV *env, bdb_filename db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
1326 CODE: 1372 CODE:
1327{ 1373{
1328 dREQ (REQ_ENV_OPEN); 1374 dREQ (REQ_ENV_OPEN);
1329 1375
1330 req->env = env; 1376 req->env = env;
1401} 1447}
1402 OUTPUT: 1448 OUTPUT:
1403 RETVAL 1449 RETVAL
1404 1450
1405void 1451void
1406db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) 1452db_open (DB *db, DB_TXN_ornull *txnid, bdb_filename file, bdb_filename database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
1407 CODE: 1453 CODE:
1408{ 1454{
1409 dREQ (REQ_DB_OPEN); 1455 dREQ (REQ_DB_OPEN);
1410 req->db = db; 1456 req->db = db;
1411 req->txn = txnid; 1457 req->txn = txnid;
1451 req->uint1 = flags; 1497 req->uint1 = flags;
1452 REQ_SEND; 1498 REQ_SEND;
1453} 1499}
1454 1500
1455void 1501void
1456db_upgrade (DB *db, octetstring file, U32 flags = 0, SV *callback = &PL_sv_undef) 1502db_upgrade (DB *db, bdb_filename file, U32 flags = 0, SV *callback = &PL_sv_undef)
1457 CODE: 1503 CODE:
1458{ 1504{
1459 dREQ (REQ_DB_SYNC); 1505 dREQ (REQ_DB_SYNC);
1460 req->db = db; 1506 req->db = db;
1461 req->buf1 = strdup (file); 1507 req->buf1 = strdup (file);
1711 1757
1712 1758
1713MODULE = BDB PACKAGE = BDB::Env 1759MODULE = BDB PACKAGE = BDB::Env
1714 1760
1715void 1761void
1716DESTROY (DB_ENV_ornull *env) 1762DESTROY (DB_ENV_ornuked *env)
1717 CODE: 1763 CODE:
1718 if (env) 1764 if (env)
1719 env->close (env, 0); 1765 env->close (env, 0);
1720 1766
1721int set_data_dir (DB_ENV *env, const char *dir) 1767int set_data_dir (DB_ENV *env, const char *dir)
1868 RETVAL 1914 RETVAL
1869 1915
1870MODULE = BDB PACKAGE = BDB::Db 1916MODULE = BDB PACKAGE = BDB::Db
1871 1917
1872void 1918void
1873DESTROY (DB_ornull *db) 1919DESTROY (DB_ornuked *db)
1874 CODE: 1920 CODE:
1875 if (db) 1921 if (db)
1876 { 1922 {
1877 SV *env = (SV *)db->app_private; 1923 SV *env = (SV *)db->app_private;
1878 db->close (db, 0); 1924 db->close (db, 0);
1973 2019
1974 2020
1975MODULE = BDB PACKAGE = BDB::Txn 2021MODULE = BDB PACKAGE = BDB::Txn
1976 2022
1977void 2023void
1978DESTROY (DB_TXN_ornull *txn) 2024DESTROY (DB_TXN_ornuked *txn)
1979 CODE: 2025 CODE:
1980 if (txn) 2026 if (txn)
1981 txn->abort (txn); 2027 txn->abort (txn);
1982 2028
1983int set_timeout (DB_TXN *txn, NV timeout, U32 flags = DB_SET_TXN_TIMEOUT) 2029int set_timeout (DB_TXN *txn, NV timeout, U32 flags = DB_SET_TXN_TIMEOUT)
1994 2040
1995 2041
1996MODULE = BDB PACKAGE = BDB::Cursor 2042MODULE = BDB PACKAGE = BDB::Cursor
1997 2043
1998void 2044void
1999DESTROY (DBC_ornull *dbc) 2045DESTROY (DBC_ornuked *dbc)
2000 CODE: 2046 CODE:
2001 if (dbc) 2047 if (dbc)
2002 dbc->c_close (dbc); 2048 dbc->c_close (dbc);
2003 2049
2004#if DB_VERSION_MINOR >= 6 2050#if DB_VERSION_MINOR >= 6
2010#endif 2056#endif
2011 2057
2012MODULE = BDB PACKAGE = BDB::Sequence 2058MODULE = BDB PACKAGE = BDB::Sequence
2013 2059
2014void 2060void
2015DESTROY (DB_SEQUENCE_ornull *seq) 2061DESTROY (DB_SEQUENCE_ornuked *seq)
2016 CODE: 2062 CODE:
2017 if (seq) 2063 if (seq)
2018 seq->close (seq, 0); 2064 seq->close (seq, 0);
2019 2065
2020int initial_value (DB_SEQUENCE *seq, db_seq_t value) 2066int initial_value (DB_SEQUENCE *seq, db_seq_t value)
2039 CODE: 2085 CODE:
2040 RETVAL = seq->set_range (seq, min, max); 2086 RETVAL = seq->set_range (seq, min, max);
2041 OUTPUT: 2087 OUTPUT:
2042 RETVAL 2088 RETVAL
2043 2089
2090

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines