📄 db_server_proc.c
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2000,2007 Oracle. All rights reserved. * * $Id: db_server_proc.c,v 12.22 2007/06/28 13:59:24 bostic Exp $ */#include "db_config.h"#include "db_int.h"#ifdef HAVE_SYSTEM_INCLUDE_FILES#include <rpc/rpc.h>#endif#include "db_server.h"#include "dbinc/db_server_int.h"#include "dbinc_auto/rpc_server_ext.h"/* * PUBLIC: void __env_get_cachesize_proc __P((u_int, * PUBLIC: __env_get_cachesize_reply *)); */void__env_get_cachesize_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_get_cachesize_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; replyp->status = dbenv->get_cachesize(dbenv, &replyp->gbytes, &replyp->bytes, (int *)&replyp->ncache);}/* * PUBLIC: void __env_set_cachesize_proc __P((u_int, u_int32_t, u_int32_t, * PUBLIC: u_int32_t, __env_set_cachesize_reply *)); */void__env_set_cachesize_proc(dbenvcl_id, gbytes, bytes, ncache, replyp) u_int dbenvcl_id; u_int32_t gbytes; u_int32_t bytes; u_int32_t ncache; __env_set_cachesize_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; int ret; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; ret = dbenv->set_cachesize(dbenv, gbytes, bytes, ncache); replyp->status = ret; return;}/* * PUBLIC: void __env_cdsgroup_begin_proc __P((u_int, * PUBLIC: __env_cdsgroup_begin_reply *)); */void__env_cdsgroup_begin_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_cdsgroup_begin_reply *replyp;{ DB_ENV *dbenv; DB_TXN *txnp; ct_entry *ctp, *dbenv_ctp; int ret; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; ctp = new_ct_ent(&replyp->status); if (ctp == NULL) return; ret = dbenv->cdsgroup_begin(dbenv, &txnp); if (ret == 0) { ctp->ct_txnp = txnp; ctp->ct_type = CT_TXN; ctp->ct_parent = NULL; ctp->ct_envparent = dbenv_ctp; replyp->txnidcl_id = ctp->ct_id; __dbsrv_settimeout(ctp, dbenv_ctp->ct_timeout); __dbsrv_active(ctp); } else __dbclear_ctp(ctp); replyp->status = ret; return;}/* * PUBLIC: void __env_close_proc __P((u_int, u_int32_t, __env_close_reply *)); */void__env_close_proc(dbenvcl_id, flags, replyp) u_int dbenvcl_id; u_int32_t flags; __env_close_reply *replyp;{ ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); replyp->status = __env_close_int(dbenvcl_id, flags, 0); return;}/* * PUBLIC: void __env_create_proc __P((u_int32_t, __env_create_reply *)); */void__env_create_proc(timeout, replyp) u_int32_t timeout; __env_create_reply *replyp;{ DB_ENV *dbenv; ct_entry *ctp; int ret; ctp = new_ct_ent(&replyp->status); if (ctp == NULL) return; if ((ret = db_env_create(&dbenv, 0)) == 0) { ctp->ct_envp = dbenv; ctp->ct_type = CT_ENV; ctp->ct_parent = NULL; ctp->ct_envparent = ctp; __dbsrv_settimeout(ctp, timeout); __dbsrv_active(ctp); replyp->envcl_id = ctp->ct_id; } else __dbclear_ctp(ctp); replyp->status = ret; return;}/* * PUBLIC: void __env_dbremove_proc __P((u_int, u_int, char *, char *, * PUBLIC: u_int32_t, __env_dbremove_reply *)); */void__env_dbremove_proc(dbenvcl_id, txnpcl_id, name, subdb, flags, replyp) u_int dbenvcl_id; u_int txnpcl_id; char *name; char *subdb; u_int32_t flags; __env_dbremove_reply *replyp;{ int ret; DB_ENV * dbenv; ct_entry *dbenv_ctp; DB_TXN * txnp; ct_entry *txnp_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; if (txnpcl_id != 0) { ACTIVATE_CTP(txnp_ctp, txnpcl_id, CT_TXN); txnp = (DB_TXN *)txnp_ctp->ct_anyp; } else txnp = NULL; ret = dbenv->dbremove(dbenv, txnp, name, subdb, flags); replyp->status = ret; return;}/* * PUBLIC: void __env_dbrename_proc __P((u_int, u_int, char *, char *, char *, * PUBLIC: u_int32_t, __env_dbrename_reply *)); */void__env_dbrename_proc(dbenvcl_id, txnpcl_id, name, subdb, newname, flags, replyp) u_int dbenvcl_id; u_int txnpcl_id; char *name; char *subdb; char *newname; u_int32_t flags; __env_dbrename_reply *replyp;{ int ret; DB_ENV * dbenv; ct_entry *dbenv_ctp; DB_TXN * txnp; ct_entry *txnp_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; if (txnpcl_id != 0) { ACTIVATE_CTP(txnp_ctp, txnpcl_id, CT_TXN); txnp = (DB_TXN *)txnp_ctp->ct_anyp; } else txnp = NULL; ret = dbenv->dbrename(dbenv, txnp, name, subdb, newname, flags); replyp->status = ret; return;}/* * PUBLIC: void __env_get_encrypt_flags_proc __P((u_int, * PUBLIC: __env_get_encrypt_flags_reply *)); */void__env_get_encrypt_flags_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_get_encrypt_flags_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; replyp->status = dbenv->get_encrypt_flags(dbenv, &replyp->flags);}/* * PUBLIC: void __env_set_encrypt_proc __P((u_int, char *, u_int32_t, * PUBLIC: __env_set_encrypt_reply *)); */void__env_set_encrypt_proc(dbenvcl_id, passwd, flags, replyp) u_int dbenvcl_id; char *passwd; u_int32_t flags; __env_set_encrypt_reply *replyp;{ int ret; DB_ENV * dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; ret = dbenv->set_encrypt(dbenv, passwd, flags); replyp->status = ret; return;}/* * PUBLIC: void __env_get_flags_proc __P((u_int, __env_get_flags_reply *)); */void__env_get_flags_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_get_flags_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; replyp->status = dbenv->get_flags(dbenv, &replyp->flags);}/* * PUBLIC: void __env_set_flags_proc __P((u_int, u_int32_t, u_int32_t, * PUBLIC: __env_set_flags_reply *)); */void__env_set_flags_proc(dbenvcl_id, flags, onoff, replyp) u_int dbenvcl_id; u_int32_t flags; u_int32_t onoff; __env_set_flags_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; int ret; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; ret = dbenv->set_flags(dbenv, flags, onoff); if (onoff) dbenv_ctp->ct_envdp.onflags = flags; else dbenv_ctp->ct_envdp.offflags = flags; replyp->status = ret; return;}/* * PUBLIC: void __env_get_home_proc __P((u_int, __env_get_home_reply *)); */void__env_get_home_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_get_home_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; replyp->status = dbenv->get_home(dbenv, (const char **)&replyp->home);}/* * PUBLIC: void __env_get_open_flags_proc __P((u_int, * PUBLIC: __env_get_open_flags_reply *)); */void__env_get_open_flags_proc(dbenvcl_id, replyp) u_int dbenvcl_id; __env_get_open_flags_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; replyp->status = dbenv->get_open_flags(dbenv, &replyp->flags);}/* * PUBLIC: void __env_open_proc __P((u_int, char *, u_int32_t, u_int32_t, * PUBLIC: __env_open_reply *)); */void__env_open_proc(dbenvcl_id, home, flags, mode, replyp) u_int dbenvcl_id; char *home; u_int32_t flags; u_int32_t mode; __env_open_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp, *new_ctp; u_int32_t newflags, shareflags; int ret; home_entry *fullhome; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; fullhome = get_fullhome(home); if (fullhome == NULL) { ret = DB_NOSERVER_HOME; goto out; } /* * If they are using locking do deadlock detection for them, * internally. */ if ((flags & DB_INIT_LOCK) && (ret = dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT)) != 0) goto out; if (__dbsrv_verbose) { dbenv->set_errfile(dbenv, stderr); dbenv->set_errpfx(dbenv, fullhome->home); } else dbenv->set_errfile(dbenv, NULL); /* * Mask off flags we ignore */ newflags = (flags & ~DB_SERVER_FLAGMASK); shareflags = (newflags & DB_SERVER_ENVFLAGS); /* * Check now whether we can share a handle for this env. */ replyp->envcl_id = dbenvcl_id; if ((new_ctp = __dbsrv_shareenv(dbenv_ctp, fullhome, shareflags)) != NULL) { /* * We can share, clean up old ID, set new one. */ if (__dbsrv_verbose) printf("Sharing env ID %ld\n", new_ctp->ct_id); replyp->envcl_id = new_ctp->ct_id; ret = __env_close_int(dbenvcl_id, 0, 0); } else { ret = dbenv->open(dbenv, fullhome->home, newflags, mode); dbenv_ctp->ct_envdp.home = fullhome; dbenv_ctp->ct_envdp.envflags = shareflags; }out: replyp->status = ret; return;}/* * PUBLIC: void __env_remove_proc __P((u_int, char *, u_int32_t, * PUBLIC: __env_remove_reply *)); */void__env_remove_proc(dbenvcl_id, home, flags, replyp) u_int dbenvcl_id; char *home; u_int32_t flags; __env_remove_reply *replyp;{ DB_ENV *dbenv; ct_entry *dbenv_ctp; int ret; home_entry *fullhome; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; fullhome = get_fullhome(home); if (fullhome == NULL) { replyp->status = DB_NOSERVER_HOME; return; } ret = dbenv->remove(dbenv, fullhome->home, flags); __dbdel_ctp(dbenv_ctp); replyp->status = ret; return;}/* * PUBLIC: void __txn_abort_proc __P((u_int, __txn_abort_reply *)); */void__txn_abort_proc(txnpcl_id, replyp) u_int txnpcl_id; __txn_abort_reply *replyp;{ DB_TXN *txnp; ct_entry *txnp_ctp; int ret; ACTIVATE_CTP(txnp_ctp, txnpcl_id, CT_TXN); txnp = (DB_TXN *)txnp_ctp->ct_anyp; ret = txnp->abort(txnp); __dbdel_ctp(txnp_ctp); replyp->status = ret; return;}/* * PUBLIC: void __env_txn_begin_proc __P((u_int, u_int, u_int32_t, * PUBLIC: __env_txn_begin_reply *)); */void__env_txn_begin_proc(dbenvcl_id, parentcl_id, flags, replyp) u_int dbenvcl_id; u_int parentcl_id; u_int32_t flags; __env_txn_begin_reply *replyp;{ DB_ENV *dbenv; DB_TXN *parent, *txnp; ct_entry *ctp, *dbenv_ctp, *parent_ctp; int ret; ACTIVATE_CTP(dbenv_ctp, dbenvcl_id, CT_ENV); dbenv = (DB_ENV *)dbenv_ctp->ct_anyp; parent_ctp = NULL; ctp = new_ct_ent(&replyp->status); if (ctp == NULL) return; if (parentcl_id != 0) { ACTIVATE_CTP(parent_ctp, parentcl_id, CT_TXN); parent = (DB_TXN *)parent_ctp->ct_anyp; ctp->ct_activep = parent_ctp->ct_activep; } else parent = NULL; /* * Need to set DB_TXN_NOWAIT or the RPC server may deadlock * itself and no one can break the lock. */ ret = dbenv->txn_begin(dbenv, parent, &txnp, flags | DB_TXN_NOWAIT); if (ret == 0) { ctp->ct_txnp = txnp; ctp->ct_type = CT_TXN; ctp->ct_parent = parent_ctp; ctp->ct_envparent = dbenv_ctp; replyp->txnidcl_id = ctp->ct_id; __dbsrv_settimeout(ctp, dbenv_ctp->ct_timeout); __dbsrv_active(ctp); } else __dbclear_ctp(ctp); replyp->status = ret; return;}/* * PUBLIC: void __txn_commit_proc __P((u_int, u_int32_t, * PUBLIC: __txn_commit_reply *)); */void__txn_commit_proc(txnpcl_id, flags, replyp) u_int txnpcl_id; u_int32_t flags; __txn_commit_reply *replyp;{ DB_TXN *txnp; ct_entry *txnp_ctp; int ret; ACTIVATE_CTP(txnp_ctp, txnpcl_id, CT_TXN); txnp = (DB_TXN *)txnp_ctp->ct_anyp; ret = txnp->commit(txnp, flags); __dbdel_ctp(txnp_ctp); replyp->status = ret; return;}/* * PUBLIC: void __txn_discard_proc __P((u_int, u_int32_t, * PUBLIC: __txn_discard_reply *)); */void__txn_discard_proc(txnpcl_id, flags, replyp) u_int txnpcl_id; u_int32_t flags; __txn_discard_reply *replyp;{ DB_TXN *txnp; ct_entry *txnp_ctp; int ret; ACTIVATE_CTP(txnp_ctp, txnpcl_id, CT_TXN); txnp = (DB_TXN *)txnp_ctp->ct_anyp; ret = txnp->discard(txnp, flags); __dbdel_ctp(txnp_ctp); replyp->status = ret; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -