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

Comparing BDB/BDB.xs (file contents):
Revision 1.14 by root, Sun Jul 8 13:41:03 2007 UTC vs.
Revision 1.18 by root, Sun Sep 16 18:15:34 2007 UTC

45typedef SV SV8; /* byte-sv, used for argument-checking */ 45typedef SV SV8; /* byte-sv, used for argument-checking */
46typedef char *octetstring; 46typedef char *octetstring;
47 47
48static SV *prepare_cb; 48static SV *prepare_cb;
49 49
50#if DB_VERSION_MINOR >= 6
51# define c_close close
52# define c_count count
53# define c_del del
54# define c_dup dup
55# define c_get get
56# define c_pget pget
57# define c_put put
58#endif
59
50static void 60static void
51debug_errcall (const DB_ENV *dbenv, const char *errpfx, const char *msg) 61debug_errcall (const DB_ENV *dbenv, const char *errpfx, const char *msg)
52{ 62{
53 printf ("err[%s]\n", msg); 63 printf ("err[%s]\n", msg);
54} 64}
94 REQ_QUIT, 104 REQ_QUIT,
95 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT, 105 REQ_ENV_OPEN, REQ_ENV_CLOSE, REQ_ENV_TXN_CHECKPOINT, REQ_ENV_LOCK_DETECT,
96 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE, 106 REQ_ENV_MEMP_SYNC, REQ_ENV_MEMP_TRICKLE,
97 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC, 107 REQ_DB_OPEN, REQ_DB_CLOSE, REQ_DB_COMPACT, REQ_DB_SYNC,
98 REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE, 108 REQ_DB_PUT, REQ_DB_GET, REQ_DB_PGET, REQ_DB_DEL, REQ_DB_KEY_RANGE,
99 REQ_TXN_COMMIT, REQ_TXN_ABORT, 109 REQ_TXN_COMMIT, REQ_TXN_ABORT, REQ_TXN_FINISH,
100 REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL, 110 REQ_C_CLOSE, REQ_C_COUNT, REQ_C_PUT, REQ_C_GET, REQ_C_PGET, REQ_C_DEL,
101 REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE, 111 REQ_SEQ_OPEN, REQ_SEQ_CLOSE, REQ_SEQ_GET, REQ_SEQ_REMOVE,
102}; 112};
103 113
104typedef struct aio_cb 114typedef struct aio_cb
658 X_UNLOCK (reqlock); 668 X_UNLOCK (reqlock);
659 669
660 switch (req->type) 670 switch (req->type)
661 { 671 {
662 case REQ_QUIT: 672 case REQ_QUIT:
673 req->result = ENOSYS;
663 goto quit; 674 goto quit;
664 675
665 case REQ_ENV_OPEN: 676 case REQ_ENV_OPEN:
666 req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1); 677 req->result = req->env->open (req->env, req->buf1, req->uint1, req->int1);
667 break; 678 break;
726 req->result = req->txn->commit (req->txn, req->uint1); 737 req->result = req->txn->commit (req->txn, req->uint1);
727 break; 738 break;
728 739
729 case REQ_TXN_ABORT: 740 case REQ_TXN_ABORT:
730 req->result = req->txn->abort (req->txn); 741 req->result = req->txn->abort (req->txn);
742 break;
743
744 case REQ_TXN_FINISH:
745 if (req->txn->flags & TXN_DEADLOCK)
746 {
747 req->result = req->txn->abort (req->txn);
748 if (!req->result)
749 req->result = DB_LOCK_DEADLOCK;
750 }
751 else
752 req->result = req->txn->commit (req->txn, req->uint1);
731 break; 753 break;
732 754
733 case REQ_C_CLOSE: 755 case REQ_C_CLOSE:
734 req->result = req->dbc->c_close (req->dbc); 756 req->result = req->dbc->c_close (req->dbc);
735 break; 757 break;
776 798
777 default: 799 default:
778 req->result = ENOSYS; 800 req->result = ENOSYS;
779 break; 801 break;
780 } 802 }
803
804 if (req->txn && (req->result > 0 || req->result == DB_LOCK_NOTGRANTED))
805 req->txn->flags |= TXN_DEADLOCK;
781 806
782 X_LOCK (reslock); 807 X_LOCK (reslock);
783 808
784 ++npending; 809 ++npending;
785 810
1073 const_iv (VERSION_PATCH) 1098 const_iv (VERSION_PATCH)
1074#if DB_VERSION_MINOR >= 5 1099#if DB_VERSION_MINOR >= 5
1075 const_iv (MULTIVERSION) 1100 const_iv (MULTIVERSION)
1076 const_iv (TXN_SNAPSHOT) 1101 const_iv (TXN_SNAPSHOT)
1077#endif 1102#endif
1103#if DB_VERSION_MINOR >= 6
1104 const_iv (PREV_DUP)
1105# if 0
1106 const_iv (PRIORITY_UNCHANGED)
1107 const_iv (PRIORITY_VERY_LOW)
1108 const_iv (PRIORITY_LOW)
1109 const_iv (PRIORITY_DEFAULT)
1110 const_iv (PRIORITY_HIGH)
1111 const_iv (PRIORITY_VERY_HIGH)
1112# endif
1113#endif
1078 }; 1114 };
1079 1115
1080 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) 1116 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
1081 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); 1117 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
1082 1118
1479 REQ_SEND; 1515 REQ_SEND;
1480 ptr_nuke (ST (0)); 1516 ptr_nuke (ST (0));
1481} 1517}
1482 1518
1483void 1519void
1520db_txn_finish (DB_TXN *txn, U32 flags = 0, SV *callback = &PL_sv_undef)
1521 CODE:
1522{
1523 dREQ (REQ_TXN_FINISH);
1524 req->txn = txn;
1525 req->uint1 = flags;
1526 REQ_SEND;
1527 ptr_nuke (ST (0));
1528}
1529
1530void
1484db_c_close (DBC *dbc, SV *callback = &PL_sv_undef) 1531db_c_close (DBC *dbc, SV *callback = &PL_sv_undef)
1485 CODE: 1532 CODE:
1486{ 1533{
1487 dREQ (REQ_C_CLOSE); 1534 dREQ (REQ_C_CLOSE);
1488 req->dbc = dbc; 1535 req->dbc = dbc;
1666 CODE: 1713 CODE:
1667 RETVAL = env->set_flags (env, flags, onoff); 1714 RETVAL = env->set_flags (env, flags, onoff);
1668 OUTPUT: 1715 OUTPUT:
1669 RETVAL 1716 RETVAL
1670 1717
1671void set_errfile (DB_ENV *env, FILE *errfile) 1718void set_errfile (DB_ENV *env, FILE *errfile = 0)
1672 CODE: 1719 CODE:
1673 env->set_errfile (env, errfile); 1720 env->set_errfile (env, errfile);
1674 1721
1675void set_msgfile (DB_ENV *env, FILE *msgfile) 1722void set_msgfile (DB_ENV *env, FILE *msgfile = 0)
1676 CODE: 1723 CODE:
1677 env->set_msgfile (env, msgfile); 1724 env->set_msgfile (env, msgfile);
1678 1725
1679int set_verbose (DB_ENV *env, U32 which, int onoff = 1) 1726int set_verbose (DB_ENV *env, U32 which, int onoff = 1)
1680 CODE: 1727 CODE:
1686 CODE: 1733 CODE:
1687 RETVAL = env->set_encrypt (env, password, flags); 1734 RETVAL = env->set_encrypt (env, password, flags);
1688 OUTPUT: 1735 OUTPUT:
1689 RETVAL 1736 RETVAL
1690 1737
1691int set_timeout (DB_ENV *env, NV timeout, U32 flags) 1738int set_timeout (DB_ENV *env, NV timeout, U32 flags = DB_SET_TXN_TIMEOUT)
1692 CODE: 1739 CODE:
1693 RETVAL = env->set_timeout (env, timeout * 1000000, flags); 1740 RETVAL = env->set_timeout (env, timeout * 1000000, flags);
1694 OUTPUT: 1741 OUTPUT:
1695 RETVAL 1742 RETVAL
1696 1743
1773 CODE: 1820 CODE:
1774 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache); 1821 RETVAL = db->set_cachesize (db, gbytes, bytes, ncache);
1775 OUTPUT: 1822 OUTPUT:
1776 RETVAL 1823 RETVAL
1777 1824
1778int set_flags (DB *db, U32 flags); 1825int set_flags (DB *db, U32 flags)
1779 CODE: 1826 CODE:
1780 RETVAL = db->set_flags (db, flags); 1827 RETVAL = db->set_flags (db, flags);
1781 OUTPUT: 1828 OUTPUT:
1782 RETVAL 1829 RETVAL
1783 1830
1797 CODE: 1844 CODE:
1798 RETVAL = db->set_bt_minkey (db, minkey); 1845 RETVAL = db->set_bt_minkey (db, minkey);
1799 OUTPUT: 1846 OUTPUT:
1800 RETVAL 1847 RETVAL
1801 1848
1802int set_re_delim(DB *db, int delim); 1849int set_re_delim (DB *db, int delim)
1803 CODE: 1850 CODE:
1804 RETVAL = db->set_re_delim (db, delim); 1851 RETVAL = db->set_re_delim (db, delim);
1805 OUTPUT: 1852 OUTPUT:
1806 RETVAL 1853 RETVAL
1807 1854
1868DESTROY (DB_TXN_ornull *txn) 1915DESTROY (DB_TXN_ornull *txn)
1869 CODE: 1916 CODE:
1870 if (txn) 1917 if (txn)
1871 txn->abort (txn); 1918 txn->abort (txn);
1872 1919
1873int set_timeout (DB_TXN *txn, NV timeout, U32 flags) 1920int set_timeout (DB_TXN *txn, NV timeout, U32 flags = DB_SET_TXN_TIMEOUT)
1874 CODE: 1921 CODE:
1875 RETVAL = txn->set_timeout (txn, timeout * 1000000, flags); 1922 RETVAL = txn->set_timeout (txn, timeout * 1000000, flags);
1923 OUTPUT:
1924 RETVAL
1925
1926int failed (DB_TXN *txn)
1927 CODE:
1928 RETVAL = !!(txn->flags & TXN_DEADLOCK);
1876 OUTPUT: 1929 OUTPUT:
1877 RETVAL 1930 RETVAL
1878 1931
1879 1932
1880MODULE = BDB PACKAGE = BDB::Cursor 1933MODULE = BDB PACKAGE = BDB::Cursor

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines