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

Comparing BDB/BDB.xs (file contents):
Revision 1.3 by root, Mon Feb 5 22:19:07 2007 UTC vs.
Revision 1.10 by root, Mon Mar 5 19:47:01 2007 UTC

24#include <limits.h> 24#include <limits.h>
25#include <unistd.h> 25#include <unistd.h>
26#include <fcntl.h> 26#include <fcntl.h>
27 27
28#include <db.h> 28#include <db.h>
29
30#if DB_VERSION_MAJOR < 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR < 5)
31# error you need Berkeley DB 4.5 or newer installed
32#endif
29 33
30/* number of seconds after which idle threads exit */ 34/* number of seconds after which idle threads exit */
31#define IDLE_TIMEOUT 10 35#define IDLE_TIMEOUT 10
32 36
33/* wether word reads are potentially non-atomic. 37/* wether word reads are potentially non-atomic.
40# else 44# else
41# define WORDACCESS_UNSAFE 1 45# define WORDACCESS_UNSAFE 1
42# endif 46# endif
43#endif 47#endif
44 48
49typedef DB_ENV DB_ENV_ornull;
50typedef DB_TXN DB_TXN_ornull;
51typedef DBC DBC_ornull;
52typedef DB DB_ornull;
53typedef DB_SEQUENCE DB_SEQUENCE_ornull;
54
45typedef SV SV8; /* byte-sv, used for argument-checking */ 55typedef SV SV8; /* byte-sv, used for argument-checking */
46typedef char *octetstring; 56typedef char *octetstring;
47 57
48static SV *prepare_cb; 58static SV *prepare_cb;
49 59
51strdup_ornull (const char *s) 61strdup_ornull (const char *s)
52{ 62{
53 return s ? strdup (s) : 0; 63 return s ? strdup (s) : 0;
54} 64}
55 65
66static inline void
67sv_to_dbt (DBT *dbt, SV *sv)
68{
69 STRLEN len;
70 char *data = SvPVbyte (sv, len);
71
72 dbt->data = malloc (len);
73 memcpy (dbt->data, data, len);
74 dbt->size = len;
75 dbt->flags = DB_DBT_REALLOC;
76}
77
78static inline void
79dbt_to_sv (SV *sv, DBT *dbt)
80{
81 if (sv)
82 {
83 SvREADONLY_off (sv);
84 sv_setpvn_mg (sv, dbt->data, dbt->size);
85 SvREFCNT_dec (sv);
86 }
87
88 free (dbt->data);
89}
90
56enum { 91enum {
57 REQ_QUIT, 92 REQ_QUIT,
58 REQ_ENV_OPEN, REQ_ENV_CLOSE, 93 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT,
94 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE,
59 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_PUT, 95 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC,
96 REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE,
97 REQ_TXN_COMMIT, REQ_TXN_ABORT,
98 REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL,
99 REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE,
60}; 100};
61 101
62typedef struct aio_cb 102typedef struct aio_cb
63{ 103{
64 struct aio_cb *volatile next; 104 struct aio_cb *volatile next;
66 int type, pri, result; 106 int type, pri, result;
67 107
68 DB_ENV *env; 108 DB_ENV *env;
69 DB *db; 109 DB *db;
70 DB_TXN *txn; 110 DB_TXN *txn;
71 DBC *cursor; 111 DBC *dbc;
112
113 UV uv1;
72 int int1, int2; 114 int int1, int2;
73 U32 uint1, uint2; 115 U32 uint1, uint2;
74 char *buf1, *buf2; 116 char *buf1, *buf2;
117 SV *sv1, *sv2, *sv3;
75 118
76 DBT dbt1, dbt2, dbt3; 119 DBT dbt1, dbt2, dbt3;
120 DB_KEY_RANGE key_range;
121 DB_SEQUENCE *seq;
122 db_seq_t seq_t;
77} aio_cb; 123} aio_cb;
78 124
79typedef aio_cb *aio_req; 125typedef aio_cb *aio_req;
80 126
81enum { 127enum {
258 if (SvOK (req->callback)) 304 if (SvOK (req->callback))
259 { 305 {
260 ENTER; 306 ENTER;
261 SAVETMPS; 307 SAVETMPS;
262 PUSHMARK (SP); 308 PUSHMARK (SP);
263 EXTEND (SP, 1);
264 309
265 switch (req->type) 310 switch (req->type)
266 { 311 {
312 case REQ_DB_CLOSE:
313 SvREFCNT_dec (req->sv1);
314 break;
315
316 case REQ_DB_GET:
317 case REQ_DB_PGET:
318 dbt_to_sv (req->sv3, &req->dbt3);
319 break;
320
321 case REQ_C_GET:
322 case REQ_C_PGET:
323 dbt_to_sv (req->sv1, &req->dbt1);
324 dbt_to_sv (req->sv2, &req->dbt2);
325 dbt_to_sv (req->sv3, &req->dbt3);
326 break;
327
328 case REQ_DB_KEY_RANGE:
329 {
330 AV *av = newAV ();
331
332 av_push (av, newSVnv (req->key_range.less));
333 av_push (av, newSVnv (req->key_range.equal));
334 av_push (av, newSVnv (req->key_range.greater));
335
336 SvREADONLY_off (req->sv1);
337 sv_setsv_mg (req->sv1, newRV_noinc ((SV *)av));
338 SvREFCNT_dec (req->sv1);
339 }
340 break;
341
342 case REQ_SEQ_GET:
343 SvREADONLY_off (req->sv1);
344
345 if (sizeof (IV) > 4)
346 sv_setiv_mg (req->sv1, req->seq_t);
347 else
348 sv_setnv_mg (req->sv1, req->seq_t);
349
350 SvREFCNT_dec (req->sv1);
351 break;
267 } 352 }
268 353
269 errno = req->result; 354 errno = req->result;
270 355
271 PUTBACK; 356 PUTBACK;
590 675
591 case REQ_ENV_CLOSE: 676 case REQ_ENV_CLOSE:
592 req->result = req->env->close (req->env, req->uint1); 677 req->result = req->env->close (req->env, req->uint1);
593 break; 678 break;
594 679
680 case REQ_ENV_TXN_CHECKPOINT:
681 req->result = req->env->txn_checkpoint (req->env, req->uint1, req->int1, req->uint2);
682 break;
683
684 case REQ_ENV_LOCK_DETECT:
685 req->result = req->env->lock_detect (req->env, req->uint1, req->uint2, &req->int1);
686 break;
687
688 case REQ_ENV_MEMP_SYNC:
689 req->result = req->env->memp_sync (req->env, 0);
690 break;
691
692 case REQ_ENV_MEMP_TRICKLE:
693 req->result = req->env->memp_trickle (req->env, req->int1, &req->int2);
694 break;
695
595 case REQ_DB_OPEN: 696 case REQ_DB_OPEN:
596 req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2); 697 req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2);
597 break; 698 break;
598 699
599 case REQ_DB_CLOSE: 700 case REQ_DB_CLOSE:
608 req->result = req->db->sync (req->db, req->uint1); 709 req->result = req->db->sync (req->db, req->uint1);
609 break; 710 break;
610 711
611 case REQ_DB_PUT: 712 case REQ_DB_PUT:
612 req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); 713 req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1);
714 break;
715
716 case REQ_DB_GET:
717 req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1);
718 break;
719
720 case REQ_DB_PGET:
721 req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1);
722 break;
723
724 case REQ_DB_DEL:
725 req->result = req->db->del (req->db, req->txn, &req->dbt1, req->uint1);
726 break;
727
728 case REQ_DB_KEY_RANGE:
729 req->result = req->db->key_range (req->db, req->txn, &req->dbt1, &req->key_range, req->uint1);
730 break;
731
732 case REQ_TXN_COMMIT:
733 req->result = req->txn->commit (req->txn, req->uint1);
734 break;
735
736 case REQ_TXN_ABORT:
737 req->result = req->txn->abort (req->txn);
738 break;
739
740 case REQ_C_CLOSE:
741 req->result = req->dbc->c_close (req->dbc);
742 break;
743
744 case REQ_C_COUNT:
745 {
746 db_recno_t recno;
747 req->result = req->dbc->c_count (req->dbc, &recno, req->uint1);
748 req->uv1 = recno;
749 }
750 break;
751
752 case REQ_C_PUT:
753 req->result = req->dbc->c_put (req->dbc, &req->dbt1, &req->dbt2, req->uint1);
754 break;
755
756 case REQ_C_GET:
757 req->result = req->dbc->c_get (req->dbc, &req->dbt1, &req->dbt3, req->uint1);
758 break;
759
760 case REQ_C_PGET:
761 req->result = req->dbc->c_pget (req->dbc, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1);
762 break;
763
764 case REQ_C_DEL:
765 req->result = req->dbc->c_del (req->dbc, req->uint1);
766 break;
767
768 case REQ_SEQ_OPEN:
769 req->result = req->seq->open (req->seq, req->txn, &req->dbt1, req->uint1);
770 break;
771
772 case REQ_SEQ_CLOSE:
773 req->result = req->seq->close (req->seq, req->uint1);
774 break;
775
776 case REQ_SEQ_GET:
777 req->result = req->seq->get (req->seq, req->txn, req->int1, &req->seq_t, req->uint1);
778 break;
779
780 case REQ_SEQ_REMOVE:
781 req->result = req->seq->remove (req->seq, req->txn, req->uint1);
613 break; 782 break;
614 783
615 default: 784 default:
616 req->result = ENOSYS; 785 req->result = ENOSYS;
617 break; 786 break;
706 req->pri = req_pri 875 req->pri = req_pri
707 876
708#define REQ_SEND \ 877#define REQ_SEND \
709 req_send (req) 878 req_send (req)
710 879
711#define SvPTR(var, arg, type, class) \ 880#define SvPTR(var, arg, type, class, nullok) \
712 if (!SvOK (arg)) \ 881 if (!SvOK (arg)) \
882 { \
883 if (!nullok) \
884 croak (# var " must be a " # class " object, not undef"); \
885 \
713 (var) = 0; \ 886 (var) = 0; \
887 } \
714 else if (sv_derived_from ((arg), # class)) \ 888 else if (sv_derived_from ((arg), # class)) \
715 { \ 889 { \
716 IV tmp = SvIV ((SV*) SvRV (arg)); \ 890 IV tmp = SvIV ((SV*) SvRV (arg)); \
717 (var) = INT2PTR (type, tmp); \ 891 (var) = INT2PTR (type, tmp); \
892 if (!var) \
893 croak (# var " is not a valid " # class " object anymore"); \
718 } \ 894 } \
719 else \ 895 else \
720 Perl_croak (# var " is not of type " # class) 896 croak (# var " is not of type " # class); \
897 \
721 898
722inline void 899static void
723set_dbt (DBT *dbt, SV *sv) 900ptr_nuke (SV *sv)
724{ 901{
725 STRLEN len; 902 assert (SvROK (sv));
726 char *data = SvPVbyte (sv, len); 903 sv_setiv (SvRV (sv), 0);
727
728 dbt->data = malloc (len);
729 memcpy (dbt->data, data, len);
730 dbt->size = len;
731} 904}
732 905
733MODULE = BDB PACKAGE = BDB 906MODULE = BDB PACKAGE = BDB
734 907
735PROTOTYPES: ENABLE 908PROTOTYPES: ENABLE
736 909
737BOOT: 910BOOT:
777 const_iv (REGION_INIT) 950 const_iv (REGION_INIT)
778 const_iv (TIME_NOTGRANTED) 951 const_iv (TIME_NOTGRANTED)
779 const_iv (TXN_NOSYNC) 952 const_iv (TXN_NOSYNC)
780 const_iv (TXN_SNAPSHOT) 953 const_iv (TXN_SNAPSHOT)
781 const_iv (TXN_WRITE_NOSYNC) 954 const_iv (TXN_WRITE_NOSYNC)
955 const_iv (WRITECURSOR)
782 const_iv (YIELDCPU) 956 const_iv (YIELDCPU)
783 const_iv (ENCRYPT_AES) 957 const_iv (ENCRYPT_AES)
784 const_iv (XA_CREATE) 958 const_iv (XA_CREATE)
785 const_iv (BTREE) 959 const_iv (BTREE)
786 const_iv (HASH) 960 const_iv (HASH)
787 const_iv (QUEUE) 961 const_iv (QUEUE)
788 const_iv (RECNO) 962 const_iv (RECNO)
789 const_iv (UNKNOWN) 963 const_iv (UNKNOWN)
790 const_iv (EXCL) 964 const_iv (EXCL)
965 const_iv (READ_COMMITTED)
791 const_iv (READ_UNCOMMITTED) 966 const_iv (READ_UNCOMMITTED)
792 const_iv (TRUNCATE) 967 const_iv (TRUNCATE)
793 const_iv (NOSYNC) 968 const_iv (NOSYNC)
794 const_iv (CHKSUM) 969 const_iv (CHKSUM)
795 const_iv (ENCRYPT) 970 const_iv (ENCRYPT)
800 const_iv (RENUMBER) 975 const_iv (RENUMBER)
801 const_iv (REVSPLITOFF) 976 const_iv (REVSPLITOFF)
802 const_iv (INORDER) 977 const_iv (INORDER)
803 const_iv (CONSUME) 978 const_iv (CONSUME)
804 const_iv (CONSUME_WAIT) 979 const_iv (CONSUME_WAIT)
980 const_iv (GET_BOTH)
981 const_iv (GET_BOTH_RANGE)
982 //const_iv (SET_RECNO)
983 //const_iv (MULTIPLE)
805 const_iv (SNAPSHOT) 984 const_iv (SNAPSHOT)
806 const_iv (JOIN_ITEM) 985 const_iv (JOIN_ITEM)
807 const_iv (RMW) 986 const_iv (RMW)
808 987
809 const_iv (NOTFOUND) 988 const_iv (NOTFOUND)
812 const_iv (LOCK_NOTGRANTED) 991 const_iv (LOCK_NOTGRANTED)
813 const_iv (RUNRECOVERY) 992 const_iv (RUNRECOVERY)
814 const_iv (OLD_VERSION) 993 const_iv (OLD_VERSION)
815 const_iv (REP_HANDLE_DEAD) 994 const_iv (REP_HANDLE_DEAD)
816 const_iv (REP_LOCKOUT) 995 const_iv (REP_LOCKOUT)
996 const_iv (SECONDARY_BAD)
817 997
818 const_iv (FREE_SPACE) 998 const_iv (FREE_SPACE)
819 const_iv (FREELIST_ONLY) 999 const_iv (FREELIST_ONLY)
820 1000
821 const_iv (APPEND) 1001 const_iv (APPEND)
822 const_iv (NODUPDATA) 1002 const_iv (NODUPDATA)
823 const_iv (NOOVERWRITE) 1003 const_iv (NOOVERWRITE)
824 1004
1005 const_iv (TXN_NOWAIT)
1006 const_iv (TXN_SNAPSHOT)
1007 const_iv (TXN_SYNC)
1008
825 const_iv (SET_LOCK_TIMEOUT) 1009 const_iv (SET_LOCK_TIMEOUT)
826 const_iv (SET_TXN_TIMEOUT) 1010 const_iv (SET_TXN_TIMEOUT)
1011
1012 const_iv (JOIN_ITEM)
1013 const_iv (FIRST)
1014 const_iv (NEXT)
1015 const_iv (NEXT_DUP)
1016 const_iv (NEXT_NODUP)
1017 const_iv (PREV)
1018 const_iv (PREV_NODUP)
1019 const_iv (SET)
1020 const_iv (SET_RANGE)
1021 const_iv (LAST)
1022 const_iv (BEFORE)
1023 const_iv (AFTER)
1024 const_iv (CURRENT)
1025 const_iv (KEYFIRST)
1026 const_iv (KEYLAST)
1027 const_iv (NODUPDATA)
1028
1029 const_iv (FORCE)
1030
1031 const_iv (LOCK_DEFAULT)
1032 const_iv (LOCK_EXPIRE)
1033 const_iv (LOCK_MAXLOCKS)
1034 const_iv (LOCK_MAXWRITE)
1035 const_iv (LOCK_MINLOCKS)
1036 const_iv (LOCK_MINWRITE)
1037 const_iv (LOCK_OLDEST)
1038 const_iv (LOCK_RANDOM)
1039 const_iv (LOCK_YOUNGEST)
1040
1041 const_iv (SEQ_DEC)
1042 const_iv (SEQ_INC)
1043 const_iv (SEQ_WRAP)
827 }; 1044 };
828 1045
829 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 1046 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
830 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 1047 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
831 1048
970 PROTOTYPE: & 1187 PROTOTYPE: &
971 CODE: 1188 CODE:
972 SvREFCNT_dec (prepare_cb); 1189 SvREFCNT_dec (prepare_cb);
973 prepare_cb = newSVsv (cb); 1190 prepare_cb = newSVsv (cb);
974 1191
1192
975DB_ENV * 1193DB_ENV *
976db_env_create (U32 env_flags = 0) 1194db_env_create (U32 env_flags = 0)
977 CODE: 1195 CODE:
978{ 1196{
979 errno = db_env_create (&RETVAL, env_flags); 1197 errno = db_env_create (&RETVAL, env_flags);
985 1203
986void 1204void
987db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef) 1205db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
988 CODE: 1206 CODE:
989{ 1207{
1208 env->set_thread_count (env, get_nthreads ());
1209
990 dREQ (REQ_ENV_OPEN); 1210 dREQ (REQ_ENV_OPEN);
991 req->env = env; 1211 req->env = env;
992 req->uint1 = open_flags | DB_THREAD; 1212 req->uint1 = open_flags | DB_THREAD;
993 req->int1 = mode; 1213 req->int1 = mode;
994 req->buf1 = strdup_ornull (db_home); 1214 req->buf1 = strdup_ornull (db_home);
1001{ 1221{
1002 dREQ (REQ_ENV_CLOSE); 1222 dREQ (REQ_ENV_CLOSE);
1003 req->env = env; 1223 req->env = env;
1004 req->uint1 = flags; 1224 req->uint1 = flags;
1005 REQ_SEND; 1225 REQ_SEND;
1226 ptr_nuke (ST (0));
1006} 1227}
1228
1229void
1230db_env_txn_checkpoint (DB_ENV *env, U32 kbyte = 0, U32 min = 0, U32 flags = 0, SV *callback = &PL_sv_undef)
1231 CODE:
1232{
1233 dREQ (REQ_ENV_TXN_CHECKPOINT);
1234 req->env = env;
1235 req->uint1 = kbyte;
1236 req->int1 = min;
1237 req->uint2 = flags;
1238 REQ_SEND;
1239}
1240
1241void
1242db_env_lock_detect (DB_ENV *env, U32 flags = 0, U32 atype = DB_LOCK_DEFAULT, SV *dummy = 0, SV *callback = &PL_sv_undef)
1243 CODE:
1244{
1245 dREQ (REQ_ENV_LOCK_DETECT);
1246 req->env = env;
1247 req->uint1 = flags;
1248 req->uint2 = atype;
1249 REQ_SEND;
1250}
1251
1252void
1253db_env_memp_sync (DB_ENV *env, SV *dummy = 0, SV *callback = &PL_sv_undef)
1254 CODE:
1255{
1256 dREQ (REQ_ENV_MEMP_SYNC);
1257 req->env = env;
1258 REQ_SEND;
1259}
1260
1261void
1262db_env_memp_trickle (DB_ENV *env, int percent, SV *dummy = 0, SV *callback = &PL_sv_undef)
1263 CODE:
1264{
1265 dREQ (REQ_ENV_MEMP_TRICKLE);
1266 req->env = env;
1267 req->int1 = percent;
1268 REQ_SEND;
1269}
1270
1007 1271
1008DB * 1272DB *
1009db_create (DB_ENV *env = 0, U32 flags = 0) 1273db_create (DB_ENV *env = 0, U32 flags = 0)
1010 CODE: 1274 CODE:
1011{ 1275{
1012 errno = db_create (&RETVAL, env, flags); 1276 errno = db_create (&RETVAL, env, flags);
1013 if (errno) 1277 if (errno)
1014 croak ("db_env_create: %s", db_strerror (errno)); 1278 croak ("db_create: %s", db_strerror (errno));
1279
1280 if (RETVAL)
1281 RETVAL->app_private = (void *)newSVsv (ST (0));
1015} 1282}
1016 OUTPUT: 1283 OUTPUT:
1017 RETVAL 1284 RETVAL
1018 1285
1019void 1286void
1020db_open (DB *db, DB_TXN *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef) 1287db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
1021 CODE: 1288 CODE:
1022{ 1289{
1023 dREQ (REQ_DB_OPEN); 1290 dREQ (REQ_DB_OPEN);
1024 req->db = db; 1291 req->db = db;
1025 req->txn = txnid; 1292 req->txn = txnid;
1036 CODE: 1303 CODE:
1037{ 1304{
1038 dREQ (REQ_DB_CLOSE); 1305 dREQ (REQ_DB_CLOSE);
1039 req->db = db; 1306 req->db = db;
1040 req->uint1 = flags; 1307 req->uint1 = flags;
1308 req->sv1 = (SV *)db->app_private;
1041 REQ_SEND; 1309 REQ_SEND;
1310 ptr_nuke (ST (0));
1042} 1311}
1043 1312
1044void 1313void
1045db_compact (DB *db, DB_TXN *txn = 0, SV *start = 0, SV *stop = 0, SV *unused1 = 0, U32 flags = DB_FREE_SPACE, SV *unused2 = 0, SV *callback = &PL_sv_undef) 1314db_compact (DB *db, DB_TXN_ornull *txn = 0, SV *start = 0, SV *stop = 0, SV *unused1 = 0, U32 flags = DB_FREE_SPACE, SV *unused2 = 0, SV *callback = &PL_sv_undef)
1046 CODE: 1315 CODE:
1047{ 1316{
1048 dREQ (REQ_DB_COMPACT); 1317 dREQ (REQ_DB_COMPACT);
1049 req->db = db; 1318 req->db = db;
1050 req->txn = txn; 1319 req->txn = txn;
1051 set_dbt (&req->dbt1, start); 1320 sv_to_dbt (&req->dbt1, start);
1052 set_dbt (&req->dbt2, stop); 1321 sv_to_dbt (&req->dbt2, stop);
1053 req->uint1 = flags; 1322 req->uint1 = flags;
1054 REQ_SEND; 1323 REQ_SEND;
1055} 1324}
1056 1325
1057void 1326void
1063 req->uint1 = flags; 1332 req->uint1 = flags;
1064 REQ_SEND; 1333 REQ_SEND;
1065} 1334}
1066 1335
1067void 1336void
1337db_key_range (DB *db, DB_TXN_ornull *txn, SV *key, SV *key_range, U32 flags = 0, SV *callback = &PL_sv_undef)
1338 CODE:
1339{
1340 dREQ (REQ_DB_KEY_RANGE);
1341 req->db = db;
1342 req->txn = txn;
1343 sv_to_dbt (&req->dbt1, key);
1344 req->uint1 = flags;
1345 req->sv1 = SvREFCNT_inc (key_range); SvREADONLY_on (key_range);
1346 REQ_SEND;
1347}
1348
1349void
1068db_put (DB *db, DB_TXN *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef) 1350db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1069 CODE: 1351 CODE:
1070{ 1352{
1071 dREQ (REQ_DB_PUT); 1353 dREQ (REQ_DB_PUT);
1072 req->db = db; 1354 req->db = db;
1073 req->txn = 0; 1355 req->txn = txn;
1074 set_dbt (&req->dbt1, key); 1356 sv_to_dbt (&req->dbt1, key);
1075 set_dbt (&req->dbt2, data); 1357 sv_to_dbt (&req->dbt2, data);
1076 req->uint1 = flags; 1358 req->uint1 = flags;
1077 REQ_SEND; 1359 REQ_SEND;
1078} 1360}
1079 1361
1362void
1363db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1364 CODE:
1365{
1366 dREQ (REQ_DB_GET);
1367 req->db = db;
1368 req->txn = txn;
1369 req->uint1 = flags;
1370 sv_to_dbt (&req->dbt1, key);
1371 req->dbt3.flags = DB_DBT_MALLOC;
1372 req->sv3 = SvREFCNT_inc (data); SvREADONLY_on (data);
1373 REQ_SEND;
1374}
1375
1376void
1377db_pget (DB *db, DB_TXN_ornull *txn, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1378 CODE:
1379{
1380 dREQ (REQ_DB_PGET);
1381 req->db = db;
1382 req->txn = txn;
1383 req->uint1 = flags;
1384 sv_to_dbt (&req->dbt1, key);
1385 sv_to_dbt (&req->dbt2, pkey);
1386 req->dbt3.flags = DB_DBT_MALLOC;
1387 req->sv3 = SvREFCNT_inc (data); SvREADONLY_on (data);
1388 REQ_SEND;
1389}
1390
1391void
1392db_del (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef)
1393 CODE:
1394{
1395 dREQ (REQ_DB_DEL);
1396 req->db = db;
1397 req->txn = txn;
1398 req->uint1 = flags;
1399 sv_to_dbt (&req->dbt1, key);
1400 REQ_SEND;
1401}
1402
1403void
1404db_txn_commit (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
1405 CODE:
1406{
1407 dREQ (REQ_TXN_COMMIT);
1408 req->txn = txn;
1409 req->uint1 = flags;
1410 REQ_SEND;
1411 ptr_nuke (ST (0));
1412}
1413
1414void
1415db_txn_abort (DB_TXN *txn, SV *callback = &PL_sv_undef)
1416 CODE:
1417{
1418 dREQ (REQ_TXN_ABORT);
1419 req->txn = txn;
1420 REQ_SEND;
1421 ptr_nuke (ST (0));
1422}
1423
1424void
1425db_c_close (DBC *dbc, SV *callback = &PL_sv_undef)
1426 CODE:
1427{
1428 dREQ (REQ_C_CLOSE);
1429 req->dbc = dbc;
1430 REQ_SEND;
1431 ptr_nuke (ST (0));
1432}
1433
1434void
1435db_c_count (DBC *dbc, SV *count, U32 flags = 0, SV *callback = &PL_sv_undef)
1436 CODE:
1437{
1438 dREQ (REQ_C_COUNT);
1439 req->dbc = dbc;
1440 req->sv1 = SvREFCNT_inc (count);
1441 REQ_SEND;
1442}
1443
1444void
1445db_c_put (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1446 CODE:
1447{
1448 dREQ (REQ_C_PUT);
1449 req->dbc = dbc;
1450 sv_to_dbt (&req->dbt1, key);
1451 sv_to_dbt (&req->dbt2, data);
1452 req->uint1 = flags;
1453 REQ_SEND;
1454}
1455
1456void
1457db_c_get (DBC *dbc, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1458 CODE:
1459{
1460 dREQ (REQ_C_GET);
1461 req->dbc = dbc;
1462 req->uint1 = flags;
1463 if ((flags & DB_SET) == DB_SET
1464 || (flags & DB_SET_RANGE) == DB_SET_RANGE)
1465 sv_to_dbt (&req->dbt1, key);
1466 else
1467 req->dbt1.flags = DB_DBT_MALLOC;
1468
1469 req->sv1 = SvREFCNT_inc (key); SvREADONLY_on (key);
1470
1471 if ((flags & DB_GET_BOTH) == DB_GET_BOTH
1472 || (flags & DB_GET_BOTH_RANGE) == DB_GET_BOTH_RANGE)
1473 sv_to_dbt (&req->dbt3, data);
1474 else
1475 req->dbt3.flags = DB_DBT_MALLOC;
1476
1477 req->sv3 = SvREFCNT_inc (data); SvREADONLY_on (data);
1478 REQ_SEND;
1479}
1480
1481void
1482db_c_pget (DBC *dbc, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1483 CODE:
1484{
1485 dREQ (REQ_C_PGET);
1486 req->dbc = dbc;
1487 req->uint1 = flags;
1488 if ((flags & DB_SET) == DB_SET
1489 || (flags & DB_SET_RANGE) == DB_SET_RANGE)
1490 sv_to_dbt (&req->dbt1, key);
1491 else
1492 req->dbt1.flags = DB_DBT_MALLOC;
1493
1494 req->sv1 = SvREFCNT_inc (key); SvREADONLY_on (key);
1495
1496 req->dbt2.flags = DB_DBT_MALLOC;
1497 req->sv2 = SvREFCNT_inc (pkey); SvREADONLY_on (pkey);
1498
1499 if ((flags & DB_GET_BOTH) == DB_GET_BOTH
1500 || (flags & DB_GET_BOTH_RANGE) == DB_GET_BOTH_RANGE)
1501 sv_to_dbt (&req->dbt3, data);
1502 else
1503 req->dbt3.flags = DB_DBT_MALLOC;
1504
1505 req->sv3 = SvREFCNT_inc (data); SvREADONLY_on (data);
1506 REQ_SEND;
1507}
1508
1509void
1510db_c_del (DBC *dbc, U32 flags = 0, SV *callback = &PL_sv_undef)
1511 CODE:
1512{
1513 dREQ (REQ_C_DEL);
1514 req->dbc = dbc;
1515 req->uint1 = flags;
1516 REQ_SEND;
1517}
1518
1519
1520void
1521db_sequence_open (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, SV *key, U32 flags = 0, SV *callback = &PL_sv_undef)
1522 CODE:
1523{
1524 dREQ (REQ_SEQ_OPEN);
1525 req->seq = seq;
1526 req->txn = txnid;
1527 req->uint1 = flags | DB_THREAD;
1528 sv_to_dbt (&req->dbt1, key);
1529 REQ_SEND;
1530}
1531
1532void
1533db_sequence_close (DB_SEQUENCE *seq, U32 flags = 0, SV *callback = &PL_sv_undef)
1534 CODE:
1535{
1536 dREQ (REQ_SEQ_CLOSE);
1537 req->seq = seq;
1538 req->uint1 = flags;
1539 REQ_SEND;
1540 ptr_nuke (ST (0));
1541}
1542
1543void
1544db_sequence_get (DB_SEQUENCE *seq, DB_TXN_ornull *txnid, int delta, SV *seq_value, U32 flags = DB_TXN_NOSYNC, SV *callback = &PL_sv_undef)
1545 CODE:
1546{
1547 dREQ (REQ_SEQ_GET);
1548 req->seq = seq;
1549 req->txn = txnid;
1550 req->int1 = delta;
1551 req->uint1 = flags;
1552 req->sv1 = SvREFCNT_inc (seq_value); SvREADONLY_on (seq_value);
1553 REQ_SEND;
1554}
1555
1556void
1557db_sequence_remove (DB_SEQUENCE *seq, DB_TXN_ornull *txnid = 0, U32 flags = 0, SV *callback = &PL_sv_undef)
1558 CODE:
1559{
1560 dREQ (REQ_SEQ_REMOVE);
1561 req->seq = seq;
1562 req->txn = txnid;
1563 req->uint1 = flags;
1564 REQ_SEND;
1565}
1566
1080 1567
1081MODULE = BDB PACKAGE = BDB::Env 1568MODULE = BDB PACKAGE = BDB::Env
1082 1569
1570void
1571DESTROY (DB_ENV_ornull *env)
1572 CODE:
1573 if (env)
1574 env->close (env, 0);
1575
1576int set_data_dir (DB_ENV *env, const char *dir)
1577 CODE:
1578 RETVAL = env->set_data_dir (env, dir);
1579 OUTPUT:
1580 RETVAL
1581
1582int set_tmp_dir (DB_ENV *env, const char *dir)
1583 CODE:
1584 RETVAL = env->set_tmp_dir (env, dir);
1585 OUTPUT:
1586 RETVAL
1587
1588int set_lg_dir (DB_ENV *env, const char *dir)
1589 CODE:
1590 RETVAL = env->set_lg_dir (env, dir);
1591 OUTPUT:
1592 RETVAL
1593
1594int set_shm_key (DB_ENV *env, long shm_key)
1595 CODE:
1596 RETVAL = env->set_shm_key (env, shm_key);
1597 OUTPUT:
1598 RETVAL
1599
1083int set_cachesize (DB_ENV *env, U32 gbytes, U32 bytes, int ncache = 0) 1600int set_cachesize (DB_ENV *env, U32 gbytes, U32 bytes, int ncache = 0)
1084 CODE: 1601 CODE:
1085 RETVAL = env->set_cachesize (env, gbytes, bytes, ncache); 1602 RETVAL = env->set_cachesize (env, gbytes, bytes, ncache);
1086 OUTPUT: 1603 OUTPUT:
1087 RETVAL 1604 RETVAL
1102 CODE: 1619 CODE:
1103 RETVAL = env->set_timeout (env, timeout * 1000000, flags); 1620 RETVAL = env->set_timeout (env, timeout * 1000000, flags);
1104 OUTPUT: 1621 OUTPUT:
1105 RETVAL 1622 RETVAL
1106 1623
1624int set_mp_max_openfd (DB_ENV *env, int maxopenfd);
1625 CODE:
1626 RETVAL = env->set_mp_max_openfd (env, maxopenfd);
1627 OUTPUT:
1628 RETVAL
1629
1630int set_mp_max_write (DB_ENV *env, int maxwrite, int maxwrite_sleep);
1631 CODE:
1632 RETVAL = env->set_mp_max_write (env, maxwrite, maxwrite_sleep);
1633 OUTPUT:
1634 RETVAL
1635
1636int set_mp_mmapsize (DB_ENV *env, int mmapsize_mb)
1637 CODE:
1638 RETVAL = env->set_mp_mmapsize (env, ((size_t)mmapsize_mb) << 20);
1639 OUTPUT:
1640 RETVAL
1641
1642int set_lk_detect (DB_ENV *env, U32 detect = DB_LOCK_DEFAULT)
1643 CODE:
1644 RETVAL = env->set_lk_detect (env, detect);
1645 OUTPUT:
1646 RETVAL
1647
1648int set_lk_max_lockers (DB_ENV *env, U32 max)
1649 CODE:
1650 RETVAL = env->set_lk_max_lockers (env, max);
1651 OUTPUT:
1652 RETVAL
1653
1654int set_lk_max_locks (DB_ENV *env, U32 max)
1655 CODE:
1656 RETVAL = env->set_lk_max_locks (env, max);
1657 OUTPUT:
1658 RETVAL
1659
1660int set_lk_max_objects (DB_ENV *env, U32 max)
1661 CODE:
1662 RETVAL = env->set_lk_max_objects (env, max);
1663 OUTPUT:
1664 RETVAL
1665
1666int set_lg_bsize (DB_ENV *env, U32 max)
1667 CODE:
1668 RETVAL = env->set_lg_bsize (env, max);
1669 OUTPUT:
1670 RETVAL
1671
1672int set_lg_max (DB_ENV *env, U32 max)
1673 CODE:
1674 RETVAL = env->set_lg_max (env, max);
1675 OUTPUT:
1676 RETVAL
1677
1678DB_TXN *
1679txn_begin (DB_ENV *env, DB_TXN_ornull *parent = 0, U32 flags = 0)
1680 CODE:
1681 errno = env->txn_begin (env, parent, &RETVAL, flags);
1682 if (errno)
1683 croak ("DB_ENV->txn_begin: %s", db_strerror (errno));
1684 OUTPUT:
1685 RETVAL
1107 1686
1108MODULE = BDB PACKAGE = BDB::Db 1687MODULE = BDB PACKAGE = BDB::Db
1109 1688
1689void
1690DESTROY (DB_ornull *db)
1691 CODE:
1692 if (db)
1693 {
1694 SV *env = (SV *)db->app_private;
1695 db->close (db, 0);
1696 SvREFCNT_dec (env);
1697 }
1698
1110int set_cachesize (DB *db, U32 gbytes, U32 bytes, int ncache = 0) 1699int set_cachesize (DB *db, U32 gbytes, U32 bytes, int ncache = 0)
1111 CODE: 1700 CODE:
1112 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache); 1701 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache);
1113 OUTPUT: 1702 OUTPUT:
1114 RETVAL 1703 RETVAL
1129 CODE: 1718 CODE:
1130 RETVAL = db->set_lorder (db, lorder); 1719 RETVAL = db->set_lorder (db, lorder);
1131 OUTPUT: 1720 OUTPUT:
1132 RETVAL 1721 RETVAL
1133 1722
1134
1135int set_bt_minkey (DB *db, U32 minkey) 1723int set_bt_minkey (DB *db, U32 minkey)
1136 CODE: 1724 CODE:
1137 RETVAL = db->set_bt_minkey (db, minkey); 1725 RETVAL = db->set_bt_minkey (db, minkey);
1138 OUTPUT: 1726 OUTPUT:
1139 RETVAL 1727 RETVAL
1178 CODE: 1766 CODE:
1179 RETVAL = db->set_q_extentsize (db, extentsize); 1767 RETVAL = db->set_q_extentsize (db, extentsize);
1180 OUTPUT: 1768 OUTPUT:
1181 RETVAL 1769 RETVAL
1182 1770
1771DBC *
1772cursor (DB *db, DB_TXN_ornull *txn = 0, U32 flags = 0)
1773 CODE:
1774 errno = db->cursor (db, txn, &RETVAL, flags);
1775 if (errno)
1776 croak ("DB->cursor: %s", db_strerror (errno));
1777 OUTPUT:
1778 RETVAL
1183 1779
1780DB_SEQUENCE *
1781sequence (DB *db, U32 flags = 0)
1782 CODE:
1783{
1784 errno = db_sequence_create (&RETVAL, db, flags);
1785 if (errno)
1786 croak ("db_sequence_create: %s", db_strerror (errno));
1787}
1788 OUTPUT:
1789 RETVAL
1790
1791
1792MODULE = BDB PACKAGE = BDB::Txn
1793
1794void
1795DESTROY (DB_TXN_ornull *txn)
1796 CODE:
1797 if (txn)
1798 txn->abort (txn);
1799
1800int set_timeout (DB_TXN *txn, NV timeout, U32 flags)
1801 CODE:
1802 RETVAL = txn->set_timeout (txn, timeout * 1000000, flags);
1803 OUTPUT:
1804 RETVAL
1805
1806
1807MODULE = BDB PACKAGE = BDB::Cursor
1808
1809void
1810DESTROY (DBC_ornull *dbc)
1811 CODE:
1812 if (dbc)
1813 dbc->c_close (dbc);
1814
1815MODULE = BDB PACKAGE = BDB::Sequence
1816
1817void
1818DESTROY (DB_SEQUENCE_ornull *seq)
1819 CODE:
1820 if (seq)
1821 seq->close (seq, 0);
1822
1823int initial_value (DB_SEQUENCE *seq, db_seq_t value)
1824 CODE:
1825 RETVAL = seq->initial_value (seq, value);
1826 OUTPUT:
1827 RETVAL
1828
1829int set_cachesize (DB_SEQUENCE *seq, U32 size)
1830 CODE:
1831 RETVAL = seq->set_cachesize (seq, size);
1832 OUTPUT:
1833 RETVAL
1834
1835int set_flags (DB_SEQUENCE *seq, U32 flags)
1836 CODE:
1837 RETVAL = seq->set_flags (seq, flags);
1838 OUTPUT:
1839 RETVAL
1840
1841int set_range (DB_SEQUENCE *seq, db_seq_t min, db_seq_t max)
1842 CODE:
1843 RETVAL = seq->set_range (seq, min, max);
1844 OUTPUT:
1845 RETVAL
1846

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines