xa_db.c revision 1
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * See the file LICENSE for redistribution information.
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * Copyright (c) 1998
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * Sleepycat Software. All rights reserved.
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac#pragma ident "%Z%%M% %I% %E% SMI"
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignacstatic const char sccsid[] = "@(#)xa_db.c 10.6 (Sleepycat) 12/19/98";
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac#endif /* not lint */
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignacstatic int __xa_c_get __P((DBC *, DBT *, DBT *, u_int32_t));
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignacstatic int __xa_c_put __P((DBC *, DBT *, DBT *, u_int32_t));
4a7f0ad21d4c6a48235ffd7f7f4610315212d0e6JnRouvignacstatic int __xa_cursor __P((DB *, DB_TXN *, DBC **, u_int32_t));
943106fcb6a2100c9bdd2e044e454b7d2a2e900aJnRouvignacstatic int __xa_del __P((DB *, DB_TXN *, DBT *, u_int32_t));
13435a3727f5d58028108ab9dfdde0b4014998b5JnRouvignacstatic int __xa_get __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
2aa4baaaad626108d109989d725d14fa559d3052ludostatic int __xa_put __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignacstatic int __xa_stat __P((DB *, void *, void *(*)(size_t), u_int32_t));
4a7f0ad21d4c6a48235ffd7f7f4610315212d0e6JnRouvignacdb_xa_open(fname, type, flags, mode, dbinfo, dbpp)
4a7f0ad21d4c6a48235ffd7f7f4610315212d0e6JnRouvignac const char *fname;
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac * First try to open up the underlying DB.
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac * The dbenv argument is taken from the global list of environments.
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac * When the transaction manager called xa_start() (__db_xa_start()),
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac * the "current" DB environment was moved to the start of the list.
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * However, if we were called in a tpsvrinit function (which is
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * entirely plausible), then it's possible that xa_open was called
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * (which simply recorded the name of the environment to open) and
4a7f0ad21d4c6a48235ffd7f7f4610315212d0e6JnRouvignac * this is the next call into DB. In that case, we still have to
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac * open the environment.
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac * The way that we know that xa_open and nothing else was called
e29fffa2ec668b2d1cfbe5ee71f3f3bce1ba5375JnRouvignac * is because the nameq is not NULL.
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac if ((rp = TAILQ_FIRST(&DB_GLOBAL(db_nameq))) != NULL &&
943106fcb6a2100c9bdd2e044e454b7d2a2e900aJnRouvignac (ret = __db_rmid_to_env(rp->rmid, &dbenv, 1)) != 0)
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac type, flags, mode, dbenv, dbinfo, &real_dbp)) != 0)
943106fcb6a2100c9bdd2e044e454b7d2a2e900aJnRouvignac * Allocate our own DB handle, and copy the exported fields and
943106fcb6a2100c9bdd2e044e454b7d2a2e900aJnRouvignac * function pointers into it. The internal pointer references
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac * the real underlying DB handle.
32a5083e32925d98e03a79d5026ba26d176d0f62JnRouvignac if ((ret = __os_calloc(1, sizeof(DB), &dbp)) != 0) {
a90aefe298c0d3e67bd314bc7ce6322e8c3f5dccJnRouvignac /* Close any associated cursors. */
a90aefe298c0d3e67bd314bc7ce6322e8c3f5dccJnRouvignac while ((dbc = TAILQ_FIRST(&dbp->active_queue)) != NULL)
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac /* Close the DB handle. */
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac if ((ret = real_dbp->cursor(real_dbp, txn, &real_dbc, flags)) != 0)
714cebcb84382ced1505d9b04accf744a76b3786JnRouvignac * Allocate our own DBC handle, and copy the exported fields and
714cebcb84382ced1505d9b04accf744a76b3786JnRouvignac * function pointers into it. The internal pointer references
714cebcb84382ced1505d9b04accf744a76b3786JnRouvignac * the real underlying DBC handle.
714cebcb84382ced1505d9b04accf744a76b3786JnRouvignac if ((ret = __os_calloc(1, sizeof(DBC), &dbc)) != 0) {
714cebcb84382ced1505d9b04accf744a76b3786JnRouvignac TAILQ_INSERT_TAIL(&dbp->active_queue, dbc, links);
4a7f0ad21d4c6a48235ffd7f7f4610315212d0e6JnRouvignac return (real_dbp->del(real_dbp, txn, key, flags));
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac return (real_dbp->get(real_dbp, txn, key, data, flags));
11dea2cb49f8dfbd12424d677ab779a25d453b2aJnRouvignac return (real_dbp->put(real_dbp, txn, key, data, flags));
943106fcb6a2100c9bdd2e044e454b7d2a2e900aJnRouvignac return (real_dbp->stat(real_dbp, spp, db_malloc, flags));
c87c8fef4847562b343af5b65855fe0f5587c72eJnRouvignac TAILQ_REMOVE(&dbc->dbp->active_queue, dbc, links);
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac return (real_dbc->c_get(real_dbc, key, data, flags));
084bd019cee0fc133a55069326a7c3bd204aa936JnRouvignac return (real_dbc->c_put(real_dbc, key, data, flags));