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

Comparing BDB/BDB.xs (file contents):
Revision 1.41 by root, Wed Jul 9 12:15:36 2008 UTC vs.
Revision 1.45 by root, Wed Jul 9 21:08:29 2008 UTC

139enum { 139enum {
140 REQ_QUIT, 140 REQ_QUIT,
141 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT, 141 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT,
142 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME, 142 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, REQ_ENV_DBREMOVE, REQ_ENV_DBRENAME,
143 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_UPGRADE, 143 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, REQ_DB_UPGRADE,
144 REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE, 144 REQ_DB_PUT, REQ_DB_EXISTS, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE,
145 REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH, 145 REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH,
146 REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL, 146 REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL,
147 REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE, 147 REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE,
148}; 148};
149 149
411 return !SvTRUE (ERRSV); 411 return !SvTRUE (ERRSV);
412} 412}
413 413
414static void req_free (bdb_req req) 414static void req_free (bdb_req req)
415{ 415{
416 SvREFCNT_dec (req->callback);
417
416 free (req->buf1); 418 free (req->buf1);
417 free (req->buf2); 419 free (req->buf2);
418 free (req->buf3); 420 free (req->buf3);
421
419 Safefree (req); 422 Safefree (req);
420} 423}
421 424
422#ifdef USE_SOCKETS_AS_HANDLES 425#ifdef USE_SOCKETS_AS_HANDLES
423# define TO_SOCKET(x) (win32_get_osfhandle (x)) 426# define TO_SOCKET(x) (win32_get_osfhandle (x))
803 req->result = req->db->upgrade (req->db, req->buf1, req->uint1); 806 req->result = req->db->upgrade (req->db, req->buf1, req->uint1);
804 break; 807 break;
805 808
806 case REQ_DB_PUT: 809 case REQ_DB_PUT:
807 req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1); 810 req->result = req->db->put (req->db, req->txn, &req->dbt1, &req->dbt2, req->uint1);
811 break;
812
813 case REQ_DB_EXISTS:
814 req->result = req->db->exists (req->db, req->txn, &req->dbt1, req->uint1);
808 break; 815 break;
809 816
810 case REQ_DB_GET: 817 case REQ_DB_GET:
811 req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1); 818 req->result = req->db->get (req->db, req->txn, &req->dbt1, &req->dbt3, req->uint1);
812 break; 819 break;
997 (var) = INT2PTR (type, tmp); \ 1004 (var) = INT2PTR (type, tmp); \
998 if (!var && nullok != 2) \ 1005 if (!var && nullok != 2) \
999 croak (# var " is not a valid " # class " object anymore"); \ 1006 croak (# var " is not a valid " # class " object anymore"); \
1000 } \ 1007 } \
1001 else \ 1008 else \
1002 croak (# var " is not of type " # class); \ 1009 croak (# var " is not of type " # class);
1003 \
1004 1010
1005static void 1011static void
1006ptr_nuke (SV *sv) 1012ptr_nuke (SV *sv)
1007{ 1013{
1008 assert (SvROK (sv)); 1014 assert (SvROK (sv));
1046 vtbl_errno = PL_vtbl_sv; 1052 vtbl_errno = PL_vtbl_sv;
1047 vtbl_errno.svt_get = errno_get; 1053 vtbl_errno.svt_get = errno_get;
1048 mg->mg_virtual = &vtbl_errno; 1054 mg->mg_virtual = &vtbl_errno;
1049} 1055}
1050 1056
1051static SV * 1057#if __GNUC__ >= 4
1058# define noinline __attribute__ ((noinline))
1059#else
1060# define noinline
1061#endif
1062
1063static noinline SV *
1052pop_callback (I32 *ritems, SV *sv) 1064pop_callback (I32 *ritems, SV *sv)
1053{ 1065{
1054 if (SvROK (sv)) 1066 if (SvROK (sv))
1055 { 1067 {
1056 HV *st; 1068 HV *st;
1057 GV *gvp; 1069 GV *gvp;
1070 CV *cv;
1071 const char *name;
1072
1073 /* forgive me */
1074 if (SvTYPE (SvRV (sv)) == SVt_PVMG
1075 && (st = SvSTASH (SvRV (sv)))
1076 && (name = HvNAME_get (st))
1077 && (name [0] == 'B' && name [1] == 'D' && name [2] == 'B' && name [3] == ':'))
1078 return 0;
1079
1058 CV *cv = sv_2cv (sv, &st, &gvp, 0); 1080 if ((cv = sv_2cv (sv, &st, &gvp, 0)))
1059
1060 if (cv)
1061 { 1081 {
1062 --*ritems; 1082 --*ritems;
1063 return (SV *)cv; 1083 return (SV *)cv;
1064 } 1084 }
1065 } 1085 }
1674 req->uint1 = flags; 1694 req->uint1 = flags;
1675 REQ_SEND; 1695 REQ_SEND;
1676} 1696}
1677 1697
1678void 1698void
1699db_exists (DB *db, DB_TXN_ornull *txn, SV *key, U32 flags = 0, SV *callback = 0)
1700 PREINIT:
1701 CALLBACK
1702 CODE:
1703{
1704 dREQ (REQ_DB_EXISTS);
1705 req->db = db;
1706 req->txn = txn;
1707 req->uint1 = flags;
1708 sv_to_dbt (&req->dbt1, key);
1709 REQ_SEND;
1710}
1711
1712void
1679db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0) 1713db_get (DB *db, DB_TXN_ornull *txn, SV *key, SV *data, U32 flags = 0, SV *callback = 0)
1680 PREINIT: 1714 PREINIT:
1681 CALLBACK 1715 CALLBACK
1682 CODE: 1716 CODE:
1683 if (SvREADONLY (data)) 1717 if (SvREADONLY (data))
2100 if (errno) 2134 if (errno)
2101 croak ("DB_ENV->txn_begin: %s", db_strerror (errno)); 2135 croak ("DB_ENV->txn_begin: %s", db_strerror (errno));
2102 OUTPUT: 2136 OUTPUT:
2103 RETVAL 2137 RETVAL
2104 2138
2139DB_TXN *
2140cdsgroup_begin (DB_ENV *env)
2141 CODE:
2142 errno = env->cdsgroup_begin (env, &RETVAL);
2143 if (errno)
2144 croak ("DB_ENV->cdsgroup_begin: %s", db_strerror (errno));
2145 OUTPUT:
2146 RETVAL
2147
2105MODULE = BDB PACKAGE = BDB::Db 2148MODULE = BDB PACKAGE = BDB::Db
2106 2149
2107void 2150void
2108DESTROY (DB_ornuked *db) 2151DESTROY (DB_ornuked *db)
2109 CODE: 2152 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines