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

Comparing BDB/BDB.xs (file contents):
Revision 1.1 by root, Mon Feb 5 18:40:55 2007 UTC vs.
Revision 1.5 by root, Mon Feb 5 23:46:15 2007 UTC

18 18
19#include <stddef.h> 19#include <stddef.h>
20#include <stdlib.h> 20#include <stdlib.h>
21#include <errno.h> 21#include <errno.h>
22#include <sys/time.h> 22#include <sys/time.h>
23#include <sys/select.h>
24#include <sys/types.h> 23#include <sys/types.h>
25#include <sys/stat.h>
26#include <limits.h> 24#include <limits.h>
27#include <unistd.h> 25#include <unistd.h>
28#include <fcntl.h> 26#include <fcntl.h>
29#include <signal.h> 27
30#include <sched.h> 28#include <db.h>
31 29
32/* number of seconds after which idle threads exit */ 30/* number of seconds after which idle threads exit */
33#define IDLE_TIMEOUT 10 31#define IDLE_TIMEOUT 10
34 32
35/* wether word reads are potentially non-atomic. 33/* wether word reads are potentially non-atomic.
42# else 40# else
43# define WORDACCESS_UNSAFE 1 41# define WORDACCESS_UNSAFE 1
44# endif 42# endif
45#endif 43#endif
46 44
45typedef DB_ENV DB_ENV_ornull;
46typedef DB_TXN DB_TXN_ornull;
47typedef DBC DBC_ornull;
48typedef DB DB_ornull;
49
47typedef SV SV8; /* byte-sv, used for argument-checking */ 50typedef SV SV8; /* byte-sv, used for argument-checking */
51typedef char *octetstring;
48 52
53static SV *prepare_cb;
54
55static inline char *
56strdup_ornull (const char *s)
57{
58 return s ? strdup (s) : 0;
59}
60
61inline void
62sv_to_dbt (DBT *dbt, SV *sv)
63{
64 STRLEN len;
65 char *data = SvPVbyte (sv, len);
66
67 dbt->data = malloc (len);
68 memcpy (dbt->data, data, len);
69 dbt->size = len;
70}
71
72inline void
73dbt_to_sv (SV *sv, DBT *dbt)
74{
75 SvREADONLY_off (sv);
76 sv_setpvn_mg (sv, dbt->data, dbt->size);
77
78 free (dbt->data);
79}
80
49enum { 81enum {
50 REQ_QUIT, 82 REQ_QUIT,
83 REQ_ENV_OPEN, REQ_ENV_CLOSE,
84 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET,
85 REQ_TXN_COMMIT, REQ_TXN_ABORT,
51}; 86};
52 87
53#define AIO_CB \
54 struct aio_cb *volatile next; \
55 SV *callback; \
56 int type, pri
57
58typedef struct aio_cb 88typedef struct aio_cb
59{ 89{
60 AIO_CB; 90 struct aio_cb *volatile next;
91 SV *callback;
92 int type, pri, result;
93
94 DB_ENV *env;
95 DB *db;
96 DB_TXN *txn;
97 DBC *cursor;
98 int int1, int2;
99 U32 uint1, uint2;
100 char *buf1, *buf2;
101 SV *sv1, *sv2;
102
103 DBT dbt1, dbt2, dbt3;
61} aio_cb; 104} aio_cb;
62 105
63typedef aio_cb *aio_req; 106typedef aio_cb *aio_req;
64 107
65enum { 108enum {
230 273
231 abort (); 274 abort ();
232} 275}
233 276
234static int poll_cb (); 277static int poll_cb ();
235static int req_invoke (aio_req req);
236static void req_free (aio_req req); 278static void req_free (aio_req req);
237static void req_cancel (aio_req req); 279static void req_cancel (aio_req req);
238 280
239static int req_invoke (aio_req req) 281static int req_invoke (aio_req req)
240{ 282{
247 PUSHMARK (SP); 289 PUSHMARK (SP);
248 EXTEND (SP, 1); 290 EXTEND (SP, 1);
249 291
250 switch (req->type) 292 switch (req->type)
251 { 293 {
294 case REQ_DB_GET:
295 case REQ_DB_PGET:
296 dbt_to_sv (req->sv1, &req->dbt3);
297 SvREFCNT_dec (req->sv1);
298 break;
299
300 case REQ_DB_CLOSE:
301 SvREFCNT_dec (req->sv1);
302 break;
252 } 303 }
304
305 errno = req->result;
253 306
254 PUTBACK; 307 PUTBACK;
255 call_sv (req->callback, G_VOID | G_EVAL); 308 call_sv (req->callback, G_VOID | G_EVAL);
256 SPAGAIN; 309 SPAGAIN;
257 310
262 return !SvTRUE (ERRSV); 315 return !SvTRUE (ERRSV);
263} 316}
264 317
265static void req_free (aio_req req) 318static void req_free (aio_req req)
266{ 319{
320 free (req->buf1);
321 free (req->buf2);
267 Safefree (req); 322 Safefree (req);
268} 323}
269 324
270static void *aio_proc(void *arg); 325static void *aio_proc (void *arg);
271 326
272static void start_thread (void) 327static void start_thread (void)
273{ 328{
274 sigset_t fullsigset, oldsigset; 329 sigset_t fullsigset, oldsigset;
275 pthread_attr_t attr; 330 pthread_attr_t attr;
317 start_thread (); 372 start_thread ();
318} 373}
319 374
320static void req_send (aio_req req) 375static void req_send (aio_req req)
321{ 376{
377 SV *wait_callback = 0;
378
379 // synthesize callback if none given
380 if (!SvOK (req->callback))
381 {
382 dSP;
383 PUSHMARK (SP);
384 PUTBACK;
385 int count = call_sv (prepare_cb, G_ARRAY);
386 SPAGAIN;
387
388 if (count != 2)
389 croak ("prepare callback must return exactly two values\n");
390
391 wait_callback = SvREFCNT_inc (POPs);
392 SvREFCNT_dec (req->callback);
393 req->callback = SvREFCNT_inc (POPs);
394 }
395
322 ++nreqs; 396 ++nreqs;
323 397
324 LOCK (reqlock); 398 LOCK (reqlock);
325 ++nready; 399 ++nready;
326 reqq_push (&req_queue, req); 400 reqq_push (&req_queue, req);
327 pthread_cond_signal (&reqwait); 401 pthread_cond_signal (&reqwait);
328 UNLOCK (reqlock); 402 UNLOCK (reqlock);
329 403
330 maybe_start_thread (); 404 maybe_start_thread ();
405
406 if (wait_callback)
407 {
408 dSP;
409 PUSHMARK (SP);
410 PUTBACK;
411 call_sv (wait_callback, G_DISCARD);
412 SvREFCNT_dec (wait_callback);
413 }
331} 414}
332 415
333static void end_thread (void) 416static void end_thread (void)
334{ 417{
335 aio_req req; 418 aio_req req;
530 613
531 --nready; 614 --nready;
532 615
533 UNLOCK (reqlock); 616 UNLOCK (reqlock);
534 617
535 errno = 0; /* strictly unnecessary */
536
537 switch (req->type) 618 switch (req->type)
538 { 619 {
539 case REQ_QUIT: 620 case REQ_QUIT:
540 goto quit; 621 goto quit;
541 622
623 case REQ_ENV_OPEN:
624 req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1);
625 break;
626
627 case REQ_ENV_CLOSE:
628 req->result = req->env->close (req->env, req->uint1);
629 break;
630
631 case REQ_DB_OPEN:
632 req->result = req->db->open (req->db, req->txn, req->buf1, req->buf2, req->int1, req->uint1, req->int2);
633 break;
634
635 case REQ_DB_CLOSE:
636 req->result = req->db->close (req->db, req->uint1);
637 break;
638
639 case REQ_DB_COMPACT:
640 req->result = req->db->compact (req->db, req->txn, &req->dbt1, &req->dbt2, 0, req->uint1, 0);
641 break;
642
643 case REQ_DB_SYNC:
644 req->result = req->db->sync (req->db, req->uint1);
645 break;
646
647 case REQ_DB_PUT:
648 req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1);
649 break;
650
651 case REQ_DB_GET:
652 req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1);
653 break;
654
655 case REQ_DB_PGET:
656 req->result = req->db->pget (req->db, req->txn, &req->dbt1, &req->dbt2, &req->dbt3, req->uint1);
657 break;
658
659 case REQ_TXN_COMMIT:
660 req->result = req->txn->commit (req->txn, req->uint1);
661 break;
662
663 case REQ_TXN_ABORT:
664 req->result = req->txn->abort (req->txn);
665 break;
666
542 default: 667 default:
543 //req->result = ENOSYS; 668 req->result = ENOSYS;
544 break; 669 break;
545 } 670 }
546
547 //req->errorno = errno;
548 671
549 LOCK (reslock); 672 LOCK (reslock);
550 673
551 ++npending; 674 ++npending;
552 675
616 create_pipe (); 739 create_pipe ();
617 740
618 atfork_parent (); 741 atfork_parent ();
619} 742}
620 743
621#define dREQ \ 744#define dREQ(reqtype) \
622 aio_req req; \ 745 aio_req req; \
623 int req_pri = next_pri; \ 746 int req_pri = next_pri; \
624 next_pri = DEFAULT_PRI + PRI_BIAS; \ 747 next_pri = DEFAULT_PRI + PRI_BIAS; \
625 \ 748 \
626 if (SvOK (callback) && !SvROK (callback)) \ 749 if (SvOK (callback) && !SvROK (callback)) \
627 croak ("callback must be undef or of reference type"); \ 750 croak ("callback must be undef or of reference type"); \
628 \ 751 \
629 Newz (0, req, 1, aio_cb); \ 752 Newz (0, req, 1, aio_cb); \
630 if (!req) \ 753 if (!req) \
631 croak ("out of memory during aio_req allocation"); \ 754 croak ("out of memory during aio_req allocation"); \
632 \ 755 \
633 req->callback = newSVsv (callback); \ 756 req->callback = newSVsv (callback); \
757 req->type = (reqtype); \
634 req->pri = req_pri 758 req->pri = req_pri
635 759
636#define REQ_SEND \ 760#define REQ_SEND \
637 req_send (req); \ 761 req_send (req)
762
763#define SvPTR(var, arg, type, class, nullok) \
764 if (!SvOK (arg)) \
765 { \
766 if (!nullok) \
767 Perl_croak (# var " must be a " # class " object, not undef"); \
638 \ 768 \
639 if (GIMME_V != G_VOID) \ 769 (var) = 0; \
640 XPUSHs (req_sv (req, AIO_REQ_KLASS)); 770 } \
641 771 else if (sv_derived_from ((arg), # class)) \
772 { \
773 IV tmp = SvIV ((SV*) SvRV (arg)); \
774 (var) = INT2PTR (type, tmp); \
775 if (!var) \
776 Perl_croak (# var " is not a valid " # class " object anymore"); \
777 } \
778 else \
779 Perl_croak (# var " is not of type " # class); \
780 \
781
782static void
783ptr_nuke (SV *sv)
784{
785 assert (SvROK (sv));
786 sv_setiv (SvRV (sv), 0);
787}
788
642MODULE = BDB::AIO PACKAGE = BDB::AIO 789MODULE = BDB PACKAGE = BDB
643 790
644PROTOTYPES: ENABLE 791PROTOTYPES: ENABLE
645 792
646BOOT: 793BOOT:
647{ 794{
648 HV *stash = gv_stashpv ("BDB::AIO", 1); 795 HV *stash = gv_stashpv ("BDB", 1);
796
797 static const struct {
798 const char *name;
799 IV iv;
800 } *civ, const_iv[] = {
801#define const_iv(name) { # name, (IV)DB_ ## name },
802 const_iv (RPCCLIENT)
803 const_iv (INIT_CDB)
804 const_iv (INIT_LOCK)
805 const_iv (INIT_LOG)
806 const_iv (INIT_MPOOL)
807 const_iv (INIT_REP)
808 const_iv (INIT_TXN)
809 const_iv (RECOVER)
810 const_iv (INIT_TXN)
811 const_iv (RECOVER_FATAL)
812 const_iv (CREATE)
813 const_iv (USE_ENVIRON)
814 const_iv (USE_ENVIRON_ROOT)
815 const_iv (LOCKDOWN)
816 const_iv (PRIVATE)
817 const_iv (REGISTER)
818 const_iv (SYSTEM_MEM)
819 const_iv (AUTO_COMMIT)
820 const_iv (CDB_ALLDB)
821 const_iv (DIRECT_DB)
822 const_iv (DIRECT_LOG)
823 const_iv (DSYNC_DB)
824 const_iv (DSYNC_LOG)
825 const_iv (LOG_AUTOREMOVE)
826 const_iv (LOG_INMEMORY)
827 const_iv (NOLOCKING)
828 const_iv (MULTIVERSION)
829 const_iv (NOMMAP)
830 const_iv (NOPANIC)
831 const_iv (OVERWRITE)
832 const_iv (PANIC_ENVIRONMENT)
833 const_iv (REGION_INIT)
834 const_iv (TIME_NOTGRANTED)
835 const_iv (TXN_NOSYNC)
836 const_iv (TXN_SNAPSHOT)
837 const_iv (TXN_WRITE_NOSYNC)
838 const_iv (WRITECURSOR)
839 const_iv (YIELDCPU)
840 const_iv (ENCRYPT_AES)
841 const_iv (XA_CREATE)
842 const_iv (BTREE)
843 const_iv (HASH)
844 const_iv (QUEUE)
845 const_iv (RECNO)
846 const_iv (UNKNOWN)
847 const_iv (EXCL)
848 const_iv (READ_COMMITTED)
849 const_iv (READ_UNCOMMITTED)
850 const_iv (TRUNCATE)
851 const_iv (NOSYNC)
852 const_iv (CHKSUM)
853 const_iv (ENCRYPT)
854 const_iv (TXN_NOT_DURABLE)
855 const_iv (DUP)
856 const_iv (DUPSORT)
857 const_iv (RECNUM)
858 const_iv (RENUMBER)
859 const_iv (REVSPLITOFF)
860 const_iv (INORDER)
861 const_iv (CONSUME)
862 const_iv (CONSUME_WAIT)
863 const_iv (GET_BOTH)
864 //const_iv (SET_RECNO)
865 //const_iv (MULTIPLE)
866 const_iv (SNAPSHOT)
867 const_iv (JOIN_ITEM)
868 const_iv (RMW)
869
870 const_iv (NOTFOUND)
871 const_iv (KEYEMPTY)
872 const_iv (LOCK_DEADLOCK)
873 const_iv (LOCK_NOTGRANTED)
874 const_iv (RUNRECOVERY)
875 const_iv (OLD_VERSION)
876 const_iv (REP_HANDLE_DEAD)
877 const_iv (REP_LOCKOUT)
878
879 const_iv (FREE_SPACE)
880 const_iv (FREELIST_ONLY)
881
882 const_iv (APPEND)
883 const_iv (NODUPDATA)
884 const_iv (NOOVERWRITE)
885
886 const_iv (TXN_NOWAIT)
887 const_iv (TXN_SNAPSHOT)
888 const_iv (TXN_SYNC)
889
890 const_iv (SET_LOCK_TIMEOUT)
891 const_iv (SET_TXN_TIMEOUT)
892 };
893
894 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
895 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
649 896
650 create_pipe (); 897 create_pipe ();
651 pthread_atfork (atfork_prepare, atfork_parent, atfork_child); 898 pthread_atfork (atfork_prepare, atfork_parent, atfork_child);
652} 899}
653 900
685 max_outstanding = maxreqs; 932 max_outstanding = maxreqs;
686 OUTPUT: 933 OUTPUT:
687 RETVAL 934 RETVAL
688 935
689int 936int
690bdbreq_pri (int pri = 0) 937dbreq_pri (int pri = 0)
691 PROTOTYPE: ;$ 938 PROTOTYPE: ;$
692 CODE: 939 CODE:
693 RETVAL = next_pri - PRI_BIAS; 940 RETVAL = next_pri - PRI_BIAS;
694 if (items > 0) 941 if (items > 0)
695 { 942 {
699 } 946 }
700 OUTPUT: 947 OUTPUT:
701 RETVAL 948 RETVAL
702 949
703void 950void
704bdbreq_nice (int nice = 0) 951dbreq_nice (int nice = 0)
705 CODE: 952 CODE:
706 nice = next_pri - nice; 953 nice = next_pri - nice;
707 if (nice < PRI_MIN) nice = PRI_MIN; 954 if (nice < PRI_MIN) nice = PRI_MIN;
708 if (nice > PRI_MAX) nice = PRI_MAX; 955 if (nice > PRI_MAX) nice = PRI_MAX;
709 next_pri = nice + PRI_BIAS; 956 next_pri = nice + PRI_BIAS;
717 poll_wait (); 964 poll_wait ();
718 poll_cb (); 965 poll_cb ();
719 } 966 }
720 967
721int 968int
722poll() 969poll ()
723 PROTOTYPE: 970 PROTOTYPE:
724 CODE: 971 CODE:
725 poll_wait (); 972 poll_wait ();
726 RETVAL = poll_cb (); 973 RETVAL = poll_cb ();
727 OUTPUT: 974 OUTPUT:
728 RETVAL 975 RETVAL
729 976
730int 977int
731poll_fileno() 978poll_fileno ()
732 PROTOTYPE: 979 PROTOTYPE:
733 CODE: 980 CODE:
734 RETVAL = respipe [0]; 981 RETVAL = respipe [0];
735 OUTPUT: 982 OUTPUT:
736 RETVAL 983 RETVAL
737 984
738int 985int
739poll_cb(...) 986poll_cb (...)
740 PROTOTYPE: 987 PROTOTYPE:
741 CODE: 988 CODE:
742 RETVAL = poll_cb (); 989 RETVAL = poll_cb ();
743 OUTPUT: 990 OUTPUT:
744 RETVAL 991 RETVAL
745 992
746void 993void
747poll_wait() 994poll_wait ()
748 PROTOTYPE: 995 PROTOTYPE:
749 CODE: 996 CODE:
750 poll_wait (); 997 poll_wait ();
751 998
752int 999int
753nreqs() 1000nreqs ()
754 PROTOTYPE: 1001 PROTOTYPE:
755 CODE: 1002 CODE:
756 RETVAL = nreqs; 1003 RETVAL = nreqs;
757 OUTPUT: 1004 OUTPUT:
758 RETVAL 1005 RETVAL
759 1006
760int 1007int
761nready() 1008nready ()
762 PROTOTYPE: 1009 PROTOTYPE:
763 CODE: 1010 CODE:
764 RETVAL = get_nready (); 1011 RETVAL = get_nready ();
765 OUTPUT: 1012 OUTPUT:
766 RETVAL 1013 RETVAL
767 1014
768int 1015int
769npending() 1016npending ()
770 PROTOTYPE: 1017 PROTOTYPE:
771 CODE: 1018 CODE:
772 RETVAL = get_npending (); 1019 RETVAL = get_npending ();
773 OUTPUT: 1020 OUTPUT:
774 RETVAL 1021 RETVAL
775 1022
776int 1023int
777nthreads() 1024nthreads ()
778 PROTOTYPE: 1025 PROTOTYPE:
779 CODE: 1026 CODE:
780 if (WORDACCESS_UNSAFE) LOCK (wrklock); 1027 if (WORDACCESS_UNSAFE) LOCK (wrklock);
781 RETVAL = started; 1028 RETVAL = started;
782 if (WORDACCESS_UNSAFE) UNLOCK (wrklock); 1029 if (WORDACCESS_UNSAFE) UNLOCK (wrklock);
783 OUTPUT: 1030 OUTPUT:
784 RETVAL 1031 RETVAL
785 1032
1033void
1034set_sync_prepare (SV *cb)
1035 PROTOTYPE: &
1036 CODE:
1037 SvREFCNT_dec (prepare_cb);
1038 prepare_cb = newSVsv (cb);
786 1039
1040DB_ENV *
1041db_env_create (U32 env_flags = 0)
1042 CODE:
1043{
1044 errno = db_env_create (&RETVAL, env_flags);
1045 if (errno)
1046 croak ("db_env_create: %s", db_strerror (errno));
1047}
1048 OUTPUT:
1049 RETVAL
1050
1051void
1052db_env_open (DB_ENV *env, octetstring db_home, U32 open_flags, int mode, SV *callback = &PL_sv_undef)
1053 CODE:
1054{
1055 dREQ (REQ_ENV_OPEN);
1056 req->env = env;
1057 req->uint1 = open_flags | DB_THREAD;
1058 req->int1 = mode;
1059 req->buf1 = strdup_ornull (db_home);
1060 REQ_SEND;
1061}
1062
1063void
1064db_env_close (DB_ENV *env, U32 flags = 0, SV *callback = &PL_sv_undef)
1065 CODE:
1066{
1067 dREQ (REQ_ENV_CLOSE);
1068 req->env = env;
1069 req->uint1 = flags;
1070 REQ_SEND;
1071 ptr_nuke (ST (0));
1072}
1073
1074DB *
1075db_create (DB_ENV *env = 0, U32 flags = 0)
1076 CODE:
1077{
1078 errno = db_create (&RETVAL, env, flags);
1079 if (errno)
1080 croak ("db_env_create: %s", db_strerror (errno));
1081
1082 if (RETVAL)
1083 RETVAL->app_private = (void *)newSVsv (ST (0));
1084}
1085 OUTPUT:
1086 RETVAL
1087
1088void
1089db_open (DB *db, DB_TXN_ornull *txnid, octetstring file, octetstring database, int type, U32 flags, int mode, SV *callback = &PL_sv_undef)
1090 CODE:
1091{
1092 dREQ (REQ_DB_OPEN);
1093 req->db = db;
1094 req->txn = txnid;
1095 req->buf1 = strdup_ornull (file);
1096 req->buf2 = strdup_ornull (database);
1097 req->int1 = type;
1098 req->uint1 = flags | DB_THREAD;
1099 req->int2 = mode;
1100 REQ_SEND;
1101}
1102
1103void
1104db_close (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
1105 CODE:
1106{
1107 dREQ (REQ_DB_CLOSE);
1108 req->db = db;
1109 req->uint1 = flags;
1110 req->sv1 = (SV *)db->app_private;
1111 REQ_SEND;
1112 ptr_nuke (ST (0));
1113}
1114
1115void
1116db_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)
1117 CODE:
1118{
1119 dREQ (REQ_DB_COMPACT);
1120 req->db = db;
1121 req->txn = txn;
1122 sv_to_dbt (&req->dbt1, start);
1123 sv_to_dbt (&req->dbt2, stop);
1124 req->uint1 = flags;
1125 REQ_SEND;
1126}
1127
1128void
1129db_sync (DB *db, U32 flags = 0, SV *callback = &PL_sv_undef)
1130 CODE:
1131{
1132 dREQ (REQ_DB_SYNC);
1133 req->db = db;
1134 req->uint1 = flags;
1135 REQ_SEND;
1136}
1137
1138void
1139db_put (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1140 CODE:
1141{
1142 dREQ (REQ_DB_PUT);
1143 req->db = db;
1144 req->txn = txn;
1145 sv_to_dbt (&req->dbt1, key);
1146 sv_to_dbt (&req->dbt2, data);
1147 req->uint1 = flags;
1148 REQ_SEND;
1149}
1150
1151void
1152db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1153 CODE:
1154{
1155 dREQ (REQ_DB_GET);
1156 req->db = db;
1157 req->txn = txn;
1158 sv_to_dbt (&req->dbt1, key);
1159 req->dbt3.flags = DB_DBT_MALLOC;
1160 req->uint1 = flags;
1161 req->sv1 = SvREFCNT_inc (data);
1162 SvREADONLY_on (data);
1163 REQ_SEND;
1164}
1165
1166void
1167db_pget (DB *db, DB_TXN_ornull *txn, SV *key, SV *pkey, SV *data, U32 flags = 0, SV *callback = &PL_sv_undef)
1168 CODE:
1169{
1170 dREQ (REQ_DB_PGET);
1171 req->db = db;
1172 req->txn = txn;
1173 sv_to_dbt (&req->dbt1, key);
1174 sv_to_dbt (&req->dbt2, pkey);
1175 req->dbt3.flags = DB_DBT_MALLOC;
1176 req->uint1 = flags;
1177 req->sv1 = SvREFCNT_inc (data);
1178 SvREADONLY_on (data);
1179 REQ_SEND;
1180}
1181
1182void
1183db_txn_commit (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
1184 CODE:
1185{
1186 dREQ (REQ_TXN_COMMIT);
1187 req->txn = txn;
1188 req->uint1 = flags;
1189 REQ_SEND;
1190 ptr_nuke (ST (0));
1191}
1192
1193void
1194db_txn_abort (DB_TXN *txn, SV *callback = &PL_sv_undef)
1195 CODE:
1196{
1197 dREQ (REQ_TXN_ABORT);
1198 req->txn = txn;
1199 REQ_SEND;
1200 ptr_nuke (ST (0));
1201}
1202
1203
1204MODULE = BDB PACKAGE = BDB::Env
1205
1206void
1207DESTROY (DB_ENV_ornull *env)
1208 CODE:
1209 if (env)
1210 env->close (env, 0);
1211
1212int set_cachesize (DB_ENV *env, U32 gbytes, U32 bytes, int ncache = 0)
1213 CODE:
1214 RETVAL = env->set_cachesize (env, gbytes, bytes, ncache);
1215 OUTPUT:
1216 RETVAL
1217
1218int set_flags (DB_ENV *env, U32 flags, int onoff)
1219 CODE:
1220 RETVAL = env->set_flags (env, flags, onoff);
1221 OUTPUT:
1222 RETVAL
1223
1224int set_encrypt (DB_ENV *env, const char *password, U32 flags = 0)
1225 CODE:
1226 RETVAL = env->set_encrypt (env, password, flags);
1227 OUTPUT:
1228 RETVAL
1229
1230int set_timeout (DB_ENV *env, NV timeout, U32 flags)
1231 CODE:
1232 RETVAL = env->set_timeout (env, timeout * 1000000, flags);
1233 OUTPUT:
1234 RETVAL
1235
1236DB_TXN *
1237txn_begin (DB_ENV *env, DB_TXN_ornull *parent = 0, U32 flags = 0)
1238 CODE:
1239 errno = env->txn_begin (env, parent, &RETVAL, flags);
1240 if (errno)
1241 croak ("txn_begin: %s", db_strerror (errno));
1242 OUTPUT:
1243 RETVAL
1244
1245MODULE = BDB PACKAGE = BDB::Db
1246
1247void
1248DESTROY (DB_ornull *db)
1249 CODE:
1250 if (db)
1251 {
1252 SV *env = (SV *)db->app_private;
1253 db->close (db, 0);
1254 SvREFCNT_dec (env);
1255 }
1256
1257int set_cachesize (DB *db, U32 gbytes, U32 bytes, int ncache = 0)
1258 CODE:
1259 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache);
1260 OUTPUT:
1261 RETVAL
1262
1263int set_flags (DB *db, U32 flags);
1264 CODE:
1265 RETVAL = db->set_flags (db, flags);
1266 OUTPUT:
1267 RETVAL
1268
1269int set_encrypt (DB *db, const char *password, U32 flags)
1270 CODE:
1271 RETVAL = db->set_encrypt (db, password, flags);
1272 OUTPUT:
1273 RETVAL
1274
1275int set_lorder (DB *db, int lorder)
1276 CODE:
1277 RETVAL = db->set_lorder (db, lorder);
1278 OUTPUT:
1279 RETVAL
1280
1281
1282int set_bt_minkey (DB *db, U32 minkey)
1283 CODE:
1284 RETVAL = db->set_bt_minkey (db, minkey);
1285 OUTPUT:
1286 RETVAL
1287
1288int set_re_delim(DB *db, int delim);
1289 CODE:
1290 RETVAL = db->set_re_delim (db, delim);
1291 OUTPUT:
1292 RETVAL
1293
1294int set_re_pad (DB *db, int re_pad)
1295 CODE:
1296 RETVAL = db->set_re_pad (db, re_pad);
1297 OUTPUT:
1298 RETVAL
1299
1300int set_re_source (DB *db, char *source)
1301 CODE:
1302 RETVAL = db->set_re_source (db, source);
1303 OUTPUT:
1304 RETVAL
1305
1306int set_re_len (DB *db, U32 re_len)
1307 CODE:
1308 RETVAL = db->set_re_len (db, re_len);
1309 OUTPUT:
1310 RETVAL
1311
1312int set_h_ffactor (DB *db, U32 h_ffactor)
1313 CODE:
1314 RETVAL = db->set_h_ffactor (db, h_ffactor);
1315 OUTPUT:
1316 RETVAL
1317
1318int set_h_nelem (DB *db, U32 h_nelem)
1319 CODE:
1320 RETVAL = db->set_h_nelem (db, h_nelem);
1321 OUTPUT:
1322 RETVAL
1323
1324int set_q_extentsize (DB *db, U32 extentsize)
1325 CODE:
1326 RETVAL = db->set_q_extentsize (db, extentsize);
1327 OUTPUT:
1328 RETVAL
1329
1330MODULE = BDB PACKAGE = BDB::Txn
1331
1332void
1333DESTROY (DB_TXN_ornull *txn)
1334 CODE:
1335 if (txn)
1336 txn->abort (txn);
1337
1338int set_timeout (DB_TXN *txn, NV timeout, U32 flags)
1339 CODE:
1340 RETVAL = txn->set_timeout (txn, timeout * 1000000, flags);
1341 OUTPUT:
1342 RETVAL
1343
1344

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines