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

Comparing BDB/BDB.xs (file contents):
Revision 1.2 by root, Mon Feb 5 20:21:38 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 */
56typedef char *octetstring;
46 57
58static SV *prepare_cb;
59
60static inline char *
61strdup_ornull (const char *s)
62{
63 return s ? strdup (s) : 0;
64}
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
47enum 91enum {
48{
49 REQ_QUIT, 92 REQ_QUIT,
50 REQ_ENV_OPEN, REQ_ENV_CLOSE, 93 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT,
51 REQ_DB_OPEN, REQ_DB_CLOSE, 94 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE,
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,
52}; 100};
53 101
54typedef struct aio_cb 102typedef struct aio_cb
55{ 103{
56 struct aio_cb *volatile next; 104 struct aio_cb *volatile next;
57 SV *callback; 105 SV *callback;
58 int type, pri, errorno; 106 int type, pri, result;
59 107
60 DB_ENV *env; 108 DB_ENV *env;
61 DB *db; 109 DB *db;
62 DB_TXN *txn; 110 DB_TXN *txn;
63 DBC *cursor; 111 DBC *dbc;
112
113 UV uv1;
64 int int1, int2; 114 int int1, int2;
65 U32 uint1, uint2; 115 U32 uint1, uint2;
66 char *buf1, *buf2; 116 char *buf1, *buf2;
117 SV *sv1, *sv2, *sv3;
118
119 DBT dbt1, dbt2, dbt3;
120 DB_KEY_RANGE key_range;
121 DB_SEQUENCE *seq;
122 db_seq_t seq_t;
67} aio_cb; 123} aio_cb;
68 124
69typedef aio_cb *aio_req; 125typedef aio_cb *aio_req;
70 126
71enum { 127enum {
248 if (SvOK (req->callback)) 304 if (SvOK (req->callback))
249 { 305 {
250 ENTER; 306 ENTER;
251 SAVETMPS; 307 SAVETMPS;
252 PUSHMARK (SP); 308 PUSHMARK (SP);
253 EXTEND (SP, 1);
254 309
255 switch (req->type) 310 switch (req->type)
256 { 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;
257 } 352 }
353
354 errno = req->result;
258 355
259 PUTBACK; 356 PUTBACK;
260 call_sv (req->callback, G_VOID | G_EVAL); 357 call_sv (req->callback, G_VOID | G_EVAL);
261 SPAGAIN; 358 SPAGAIN;
262 359
272 free (req->buf1); 369 free (req->buf1);
273 free (req->buf2); 370 free (req->buf2);
274 Safefree (req); 371 Safefree (req);
275} 372}
276 373
277static void *aio_proc(void *arg); 374static void *aio_proc (void *arg);
278 375
279static void start_thread (void) 376static void start_thread (void)
280{ 377{
281 sigset_t fullsigset, oldsigset; 378 sigset_t fullsigset, oldsigset;
282 pthread_attr_t attr; 379 pthread_attr_t attr;
324 start_thread (); 421 start_thread ();
325} 422}
326 423
327static void req_send (aio_req req) 424static void req_send (aio_req req)
328{ 425{
426 SV *wait_callback = 0;
427
428 // synthesize callback if none given
429 if (!SvOK (req->callback))
430 {
431 dSP;
432 PUSHMARK (SP);
433 PUTBACK;
434 int count = call_sv (prepare_cb, G_ARRAY);
435 SPAGAIN;
436
437 if (count != 2)
438 croak ("prepare callback must return exactly two values\n");
439
440 wait_callback = SvREFCNT_inc (POPs);
441 SvREFCNT_dec (req->callback);
442 req->callback = SvREFCNT_inc (POPs);
443 }
444
329 ++nreqs; 445 ++nreqs;
330 446
331 LOCK (reqlock); 447 LOCK (reqlock);
332 ++nready; 448 ++nready;
333 reqq_push (&req_queue, req); 449 reqq_push (&req_queue, req);
334 pthread_cond_signal (&reqwait); 450 pthread_cond_signal (&reqwait);
335 UNLOCK (reqlock); 451 UNLOCK (reqlock);
336 452
337 maybe_start_thread (); 453 maybe_start_thread ();
454
455 if (wait_callback)
456 {
457 dSP;
458 PUSHMARK (SP);
459 PUTBACK;
460 call_sv (wait_callback, G_DISCARD);
461 SvREFCNT_dec (wait_callback);
462 }
338} 463}
339 464
340static void end_thread (void) 465static void end_thread (void)
341{ 466{
342 aio_req req; 467 aio_req req;
537 662
538 --nready; 663 --nready;
539 664
540 UNLOCK (reqlock); 665 UNLOCK (reqlock);
541 666
542 errno = 0; /* strictly unnecessary */
543
544 switch (req->type) 667 switch (req->type)
545 { 668 {
546 case REQ_QUIT: 669 case REQ_QUIT:
547 goto quit; 670 goto quit;
548 671
672 case REQ_ENV_OPEN:
673 req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1);
674 break;
675
676 case REQ_ENV_CLOSE:
677 req->result = req->env->close (req->env, req->uint1);
678 break;
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
696 case REQ_DB_OPEN:
697 req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2);
698 break;
699
700 case REQ_DB_CLOSE:
701 req->result = req->db->close (req->db, req->uint1);
702 break;
703
704 case REQ_DB_COMPACT:
705 req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0);
706 break;
707
708 case REQ_DB_SYNC:
709 req->result = req->db->sync (req->db, req->uint1);
710 break;
711
712 case REQ_DB_PUT:
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);
782 break;
783
549 default: 784 default:
550 //req->result = ENOSYS; 785 req->result = ENOSYS;
551 break; 786 break;
552 } 787 }
553
554 //req->errorno = errno;
555 788
556 LOCK (reslock); 789 LOCK (reslock);
557 790
558 ++npending; 791 ++npending;
559 792
642 req->pri = req_pri 875 req->pri = req_pri
643 876
644#define REQ_SEND \ 877#define REQ_SEND \
645 req_send (req) 878 req_send (req)
646 879
647#define SvPTR(var, arg, type, class) \ 880#define SvPTR(var, arg, type, class, nullok) \
648 if (!SvOK (arg)) \ 881 if (!SvOK (arg)) \
882 { \
883 if (!nullok) \
884 croak (# var " must be a " # class " object, not undef"); \
885 \
649 (var) = 0; \ 886 (var) = 0; \
887 } \
650 else if (sv_derived_from ((arg), # class)) \ 888 else if (sv_derived_from ((arg), # class)) \
651 { \ 889 { \
652 IV tmp = SvIV ((SV*) SvRV (arg)); \ 890 IV tmp = SvIV ((SV*) SvRV (arg)); \
653 (var) = INT2PTR (type, tmp); \ 891 (var) = INT2PTR (type, tmp); \
892 if (!var) \
893 croak (# var " is not a valid " # class " object anymore"); \
654 } \ 894 } \
655 else \ 895 else \
656 Perl_croak (# var " is not of type " # type) 896 croak (# var " is not of type " # class); \
657 897 \
898
899static void
900ptr_nuke (SV *sv)
901{
902 assert (SvROK (sv));
903 sv_setiv (SvRV (sv), 0);
904}
905
658MODULE = BDB PACKAGE = BDB 906MODULE = BDB PACKAGE = BDB
659 907
660PROTOTYPES: ENABLE 908PROTOTYPES: ENABLE
661 909
662BOOT: 910BOOT:
702 const_iv (REGION_INIT) 950 const_iv (REGION_INIT)
703 const_iv (TIME_NOTGRANTED) 951 const_iv (TIME_NOTGRANTED)
704 const_iv (TXN_NOSYNC) 952 const_iv (TXN_NOSYNC)
705 const_iv (TXN_SNAPSHOT) 953 const_iv (TXN_SNAPSHOT)
706 const_iv (TXN_WRITE_NOSYNC) 954 const_iv (TXN_WRITE_NOSYNC)
955 const_iv (WRITECURSOR)
707 const_iv (YIELDCPU) 956 const_iv (YIELDCPU)
708 const_iv (ENCRYPT_AES) 957 const_iv (ENCRYPT_AES)
709 const_iv (XA_CREATE) 958 const_iv (XA_CREATE)
710 const_iv (BTREE) 959 const_iv (BTREE)
711 const_iv (HASH) 960 const_iv (HASH)
712 const_iv (QUEUE) 961 const_iv (QUEUE)
713 const_iv (RECNO) 962 const_iv (RECNO)
714 const_iv (UNKNOWN) 963 const_iv (UNKNOWN)
715 const_iv (EXCL) 964 const_iv (EXCL)
965 const_iv (READ_COMMITTED)
716 const_iv (READ_UNCOMMITTED) 966 const_iv (READ_UNCOMMITTED)
717 const_iv (TRUNCATE) 967 const_iv (TRUNCATE)
718 const_iv (NOSYNC) 968 const_iv (NOSYNC)
719 const_iv (CHKSUM) 969 const_iv (CHKSUM)
720 const_iv (ENCRYPT) 970 const_iv (ENCRYPT)
725 const_iv (RENUMBER) 975 const_iv (RENUMBER)
726 const_iv (REVSPLITOFF) 976 const_iv (REVSPLITOFF)
727 const_iv (INORDER) 977 const_iv (INORDER)
728 const_iv (CONSUME) 978 const_iv (CONSUME)
729 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)
730 const_iv (SNAPSHOT) 984 const_iv (SNAPSHOT)
731 const_iv (JOIN_ITEM) 985 const_iv (JOIN_ITEM)
732 const_iv (RMW) 986 const_iv (RMW)
733 987
734 const_iv (NOTFOUND) 988 const_iv (NOTFOUND)
735 const_iv (KEYEMPTY) 989 const_iv (KEYEMPTY)
736 const_iv (LOCK_DEADLOCK) 990 const_iv (LOCK_DEADLOCK)
737 const_iv (LOCK_NOTGRANTED) 991 const_iv (LOCK_NOTGRANTED)
738 const_iv (RUNRECOVERY) 992 const_iv (RUNRECOVERY)
993 const_iv (OLD_VERSION)
994 const_iv (REP_HANDLE_DEAD)
995 const_iv (REP_LOCKOUT)
996 const_iv (SECONDARY_BAD)
997
998 const_iv (FREE_SPACE)
999 const_iv (FREELIST_ONLY)
1000
1001 const_iv (APPEND)
1002 const_iv (NODUPDATA)
1003 const_iv (NOOVERWRITE)
1004
1005 const_iv (TXN_NOWAIT)
1006 const_iv (TXN_SNAPSHOT)
1007 const_iv (TXN_SYNC)
1008
1009 const_iv (SET_LOCK_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)
739 }; 1044 };
740 1045
741 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; )
742 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 1047 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
743 1048
779 max_outstanding = maxreqs; 1084 max_outstanding = maxreqs;
780 OUTPUT: 1085 OUTPUT:
781 RETVAL 1086 RETVAL
782 1087
783int 1088int
784bdbreq_pri (int pri = 0) 1089dbreq_pri (int pri = 0)
785 PROTOTYPE: ;$ 1090 PROTOTYPE: ;$
786 CODE: 1091 CODE:
787 RETVAL = next_pri - PRI_BIAS; 1092 RETVAL = next_pri - PRI_BIAS;
788 if (items > 0) 1093 if (items > 0)
789 { 1094 {
793 } 1098 }
794 OUTPUT: 1099 OUTPUT:
795 RETVAL 1100 RETVAL
796 1101
797void 1102void
798bdbreq_nice (int nice = 0) 1103dbreq_nice (int nice = 0)
799 CODE: 1104 CODE:
800 nice = next_pri - nice; 1105 nice = next_pri - nice;
801 if (nice < PRI_MIN) nice = PRI_MIN; 1106 if (nice < PRI_MIN) nice = PRI_MIN;
802 if (nice > PRI_MAX) nice = PRI_MAX; 1107 if (nice > PRI_MAX) nice = PRI_MAX;
803 next_pri = nice + PRI_BIAS; 1108 next_pri = nice + PRI_BIAS;
811 poll_wait (); 1116 poll_wait ();
812 poll_cb (); 1117 poll_cb ();
813 } 1118 }
814 1119
815int 1120int
816poll() 1121poll ()
817 PROTOTYPE: 1122 PROTOTYPE:
818 CODE: 1123 CODE:
819 poll_wait (); 1124 poll_wait ();
820 RETVAL = poll_cb (); 1125 RETVAL = poll_cb ();
821 OUTPUT: 1126 OUTPUT:
822 RETVAL 1127 RETVAL
823 1128
824int 1129int
825poll_fileno() 1130poll_fileno ()
826 PROTOTYPE: 1131 PROTOTYPE:
827 CODE: 1132 CODE:
828 RETVAL = respipe [0]; 1133 RETVAL = respipe [0];
829 OUTPUT: 1134 OUTPUT:
830 RETVAL 1135 RETVAL
831 1136
832int 1137int
833poll_cb(...) 1138poll_cb (...)
834 PROTOTYPE: 1139 PROTOTYPE:
835 CODE: 1140 CODE:
836 RETVAL = poll_cb (); 1141 RETVAL = poll_cb ();
837 OUTPUT: 1142 OUTPUT:
838 RETVAL 1143 RETVAL
839 1144
840void 1145void
841poll_wait() 1146poll_wait ()
842 PROTOTYPE: 1147 PROTOTYPE:
843 CODE: 1148 CODE:
844 poll_wait (); 1149 poll_wait ();
845 1150
846int 1151int
847nreqs() 1152nreqs ()
848 PROTOTYPE: 1153 PROTOTYPE:
849 CODE: 1154 CODE:
850 RETVAL = nreqs; 1155 RETVAL = nreqs;
851 OUTPUT: 1156 OUTPUT:
852 RETVAL 1157 RETVAL
853 1158
854int 1159int
855nready() 1160nready ()
856 PROTOTYPE: 1161 PROTOTYPE:
857 CODE: 1162 CODE:
858 RETVAL = get_nready (); 1163 RETVAL = get_nready ();
859 OUTPUT: 1164 OUTPUT:
860 RETVAL 1165 RETVAL
861 1166
862int 1167int
863npending() 1168npending ()
864 PROTOTYPE: 1169 PROTOTYPE:
865 CODE: 1170 CODE:
866 RETVAL = get_npending (); 1171 RETVAL = get_npending ();
867 OUTPUT: 1172 OUTPUT:
868 RETVAL 1173 RETVAL
869 1174
870int 1175int
871nthreads() 1176nthreads ()
872 PROTOTYPE: 1177 PROTOTYPE:
873 CODE: 1178 CODE:
874 if (WORDACCESS_UNSAFE) LOCK (wrklock); 1179 if (WORDACCESS_UNSAFE) LOCK (wrklock);
875 RETVAL = started; 1180 RETVAL = started;
876 if (WORDACCESS_UNSAFE) UNLOCK (wrklock); 1181 if (WORDACCESS_UNSAFE) UNLOCK (wrklock);
877 OUTPUT: 1182 OUTPUT:
878 RETVAL 1183 RETVAL
879 1184
1185void
1186set_sync_prepare (SV *cb)
1187 PROTOTYPE: &
1188 CODE:
1189 SvREFCNT_dec (prepare_cb);
1190 prepare_cb = newSVsv (cb);
1191
1192
880DB_ENV * 1193DB_ENV *
881bdb_env_create (U32 env_flags = 0) 1194db_env_create (U32 env_flags = 0)
882 CODE: 1195 CODE:
883{ 1196{
884 int err = db_env_create (&RETVAL, env_flags); 1197 errno = db_env_create (&RETVAL, env_flags);
885 if (err) 1198 if (errno)
886 croak ("db_env_create: %s", db_strerror (err)); 1199 croak ("db_env_create: %s", db_strerror (errno));
887} 1200}
1201 OUTPUT:
1202 RETVAL
888 1203
889void 1204void
890bdb_env_open (DB_ENV *env, char *db_home, U32 open_flags, int mode, SV *callback = 0) 1205db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
891 CODE: 1206 CODE:
892{ 1207{
1208 env->set_thread_count (env, get_nthreads ());
1209
893 dREQ (REQ_ENV_OPEN); 1210 dREQ (REQ_ENV_OPEN);
894 req->env = env; 1211 req->env = env;
895 req->uint1 = open_flags; 1212 req->uint1 = open_flags | DB_THREAD;
896 req->int1 = mode; 1213 req->int1 = mode;
897 req->buf1 = strdup (db_home); 1214 req->buf1 = strdup_ornull (db_home);
898 REQ_SEND; 1215 REQ_SEND;
899} 1216}
900 1217
901void 1218void
902bdb_env_close (DB_ENV *env, U32 flags = 0, SV *callback = 0) 1219db_env_close (DB_ENV *env, U32 flags = 0, SV *callback = &PL_sv_undef)
903 CODE: 1220 CODE:
904{ 1221{
905 dREQ (REQ_ENV_CLOSE); 1222 dREQ (REQ_ENV_CLOSE);
906 req->env = env; 1223 req->env = env;
907 req->uint1 = flags; 1224 req->uint1 = flags;
908 REQ_SEND; 1225 REQ_SEND;
1226 ptr_nuke (ST (0));
909} 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
910 1271
911DB * 1272DB *
912bdb_db_create (DB_ENV *env = 0, U32 flags = 0) 1273db_create (DB_ENV *env = 0, U32 flags = 0)
913 CODE: 1274 CODE:
914{ 1275{
915 int err = db_create (&RETVAL, env, flags); 1276 errno = db_create (&RETVAL, env, flags);
916 if (err) 1277 if (errno)
917 croak ("db_env_create: %s", db_strerror (err)); 1278 croak ("db_create: %s", db_strerror (errno));
918}
919 1279
1280 if (RETVAL)
1281 RETVAL->app_private = (void *)newSVsv (ST (0));
1282}
1283 OUTPUT:
1284 RETVAL
1285
920void 1286void
921bdb_db_open (DB *db, DB_TXN *txnid, const char *file, const char *database, int type, U32 flags, int mode, SV *callback = 0) 1287db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
922 CODE: 1288 CODE:
923{ 1289{
924 dREQ (REQ_DB_OPEN); 1290 dREQ (REQ_DB_OPEN);
925 req->db = db; 1291 req->db = db;
926 req->txn = txnid; 1292 req->txn = txnid;
927 req->buf1 = strdup (file); 1293 req->buf1 = strdup_ornull (file);
928 req->buf2 = strdup (database); 1294 req->buf2 = strdup_ornull (database);
929 req->int1 = type; 1295 req->int1 = type;
930 req->uint1 = flags; 1296 req->uint1 = flags | DB_THREAD;
931 req->int2 = mode; 1297 req->int2 = mode;
932 REQ_SEND; 1298 REQ_SEND;
933} 1299}
934 1300
935void 1301void
936bdb_db_close (DB *db, U32 flags = 0, SV *callback = 0) 1302db_close (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
937 CODE: 1303 CODE:
938{ 1304{
939 dREQ (REQ_DB_CLOSE); 1305 dREQ (REQ_DB_CLOSE);
940 req->db = db; 1306 req->db = db;
941 req->uint1 = flags; 1307 req->uint1 = flags;
1308 req->sv1 = (SV *)db->app_private;
1309 REQ_SEND;
1310 ptr_nuke (ST (0));
1311}
1312
1313void
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)
1315 CODE:
1316{
1317 dREQ (REQ_DB_COMPACT);
1318 req->db = db;
1319 req->txn = txn;
1320 sv_to_dbt (&req->dbt1, start);
1321 sv_to_dbt (&req->dbt2, stop);
1322 req->uint1 = flags;
1323 REQ_SEND;
1324}
1325
1326void
1327db_sync (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
1328 CODE:
1329{
1330 dREQ (REQ_DB_SYNC);
1331 req->db = db;
1332 req->uint1 = flags;
1333 REQ_SEND;
1334}
1335
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
1350db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1351 CODE:
1352{
1353 dREQ (REQ_DB_PUT);
1354 req->db = db;
1355 req->txn = txn;
1356 sv_to_dbt (&req->dbt1, key);
1357 sv_to_dbt (&req->dbt2, data);
1358 req->uint1 = flags;
1359 REQ_SEND;
1360}
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;
942 REQ_SEND; 1564 REQ_SEND;
943} 1565}
944 1566
945 1567
946MODULE = BDB PACKAGE = BDB::Env 1568MODULE = BDB PACKAGE = BDB::Env
947 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
948int 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)
1601 CODE:
1602 RETVAL = env->set_cachesize (env, gbytes, bytes, ncache);
1603 OUTPUT:
1604 RETVAL
949 1605
950int set_flags (DB_ENV *env, U32 flags, int onoff) 1606int set_flags (DB_ENV *env, U32 flags, int onoff)
1607 CODE:
1608 RETVAL = env->set_flags (env, flags, onoff);
1609 OUTPUT:
1610 RETVAL
951 1611
952int set_encrypt (DB_ENV *env, const char *password, U32 flags) 1612int set_encrypt (DB_ENV *env, const char *password, U32 flags = 0)
1613 CODE:
1614 RETVAL = env->set_encrypt (env, password, flags);
1615 OUTPUT:
1616 RETVAL
1617
1618int set_timeout (DB_ENV *env, NV timeout, U32 flags)
1619 CODE:
1620 RETVAL = env->set_timeout (env, timeout * 1000000, flags);
1621 OUTPUT:
1622 RETVAL
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
953 1686
954MODULE = BDB PACKAGE = BDB::Db 1687MODULE = BDB PACKAGE = BDB::Db
955 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
956int set_cachesize (DB *db, U32 gbytes, U32 bytes, int ncache = 0) 1699int set_cachesize (DB *db, U32 gbytes, U32 bytes, int ncache = 0)
1700 CODE:
1701 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache);
1702 OUTPUT:
1703 RETVAL
957 1704
958int set_flags (DB *env, U32 flags, int onoff) 1705int set_flags (DB *db, U32 flags);
1706 CODE:
1707 RETVAL = db->set_flags (db, flags);
1708 OUTPUT:
1709 RETVAL
959 1710
960int set_encrypt (DB *db, const char *password, U32 flags) 1711int set_encrypt (DB *db, const char *password, U32 flags)
1712 CODE:
1713 RETVAL = db->set_encrypt (db, password, flags);
1714 OUTPUT:
1715 RETVAL
961 1716
962int set_lorder (DB *db, int lorder) 1717int set_lorder (DB *db, int lorder)
963 1718 CODE:
1719 RETVAL = db->set_lorder (db, lorder);
1720 OUTPUT:
1721 RETVAL
964 1722
965int set_bt_minkey (DB *db, U32 minkey) 1723int set_bt_minkey (DB *db, U32 minkey)
1724 CODE:
1725 RETVAL = db->set_bt_minkey (db, minkey);
1726 OUTPUT:
1727 RETVAL
966 1728
967int set_re_delim(DB *db, int delim); 1729int set_re_delim(DB *db, int delim);
1730 CODE:
1731 RETVAL = db->set_re_delim (db, delim);
1732 OUTPUT:
1733 RETVAL
968 1734
969int set_re_pad (DB *db, int re_pad) 1735int set_re_pad (DB *db, int re_pad)
1736 CODE:
1737 RETVAL = db->set_re_pad (db, re_pad);
1738 OUTPUT:
1739 RETVAL
970 1740
971int set_re_source (DB *db, char *source) 1741int set_re_source (DB *db, char *source)
1742 CODE:
1743 RETVAL = db->set_re_source (db, source);
1744 OUTPUT:
1745 RETVAL
972 1746
973int set_re_len (DB *db, U32 re_len) 1747int set_re_len (DB *db, U32 re_len)
1748 CODE:
1749 RETVAL = db->set_re_len (db, re_len);
1750 OUTPUT:
1751 RETVAL
974 1752
975int set_h_ffactor (DB *db, U32 h_ffactor) 1753int set_h_ffactor (DB *db, U32 h_ffactor)
1754 CODE:
1755 RETVAL = db->set_h_ffactor (db, h_ffactor);
1756 OUTPUT:
1757 RETVAL
976 1758
977int set_h_nelem (DB *db, U32 h_nelem) 1759int set_h_nelem (DB *db, U32 h_nelem)
1760 CODE:
1761 RETVAL = db->set_h_nelem (db, h_nelem);
1762 OUTPUT:
1763 RETVAL
978 1764
979int set_q_extentsize (DB *db, U32 extentsize) 1765int set_q_extentsize (DB *db, U32 extentsize)
1766 CODE:
1767 RETVAL = db->set_q_extentsize (db, extentsize);
1768 OUTPUT:
1769 RETVAL
980 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
981 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