📄 db_server_proc.c
字号:
goto err; } data.flags |= DB_DBT_USERMEM; } else data.flags |= DB_DBT_MALLOC; if (dataflags & DB_DBT_PARTIAL) data.flags |= DB_DBT_PARTIAL; /* Got all our stuff, now do the get */ ret = dbp->get(dbp, txnp, &key, &data, flags); /* * Otherwise just status. */ if (ret == 0) { /* * XXX * We need to xdr_free whatever we are returning, next time. * However, DB does not allocate a new key if one was given * and we'd be free'ing up space allocated in the request. * So, allocate a new key/data pointer if it is the same one * as in the request. */ *freep = 1; /* * Key */ if (key.data == keydata) { ret = __os_umalloc(dbp->dbenv, key.size, &replyp->keydata.keydata_val); if (ret != 0) goto err; memcpy(replyp->keydata.keydata_val, key.data, key.size); } else replyp->keydata.keydata_val = key.data; replyp->keydata.keydata_len = key.size; /* * Data */ if (data.data == datadata) { ret = __os_umalloc(dbp->dbenv, data.size, &replyp->datadata.datadata_val); if (ret != 0) goto err; memcpy(replyp->datadata.datadata_val, data.data, data.size); } else replyp->datadata.datadata_val = data.data; replyp->datadata.datadata_len = data.size; } else {err: FREE_IF_CHANGED(dbp->dbenv, key.data, keydata); FREE_IF_CHANGED(dbp->dbenv, data.data, datadata); FREE_IF_CHANGED(dbp->dbenv, replyp->keydata.keydata_val, key.data); FREE_IF_CHANGED(dbp->dbenv, replyp->datadata.datadata_val, data.data); replyp->keydata.keydata_val = NULL; replyp->keydata.keydata_len = 0; replyp->datadata.datadata_val = NULL; replyp->datadata.datadata_len = 0; *freep = 0; } replyp->status = ret; return;}/* * PUBLIC: void __db_get_h_ffactor_proc __P((u_int, * PUBLIC: __db_get_h_ffactor_reply *)); */void__db_get_h_ffactor_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_h_ffactor_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_h_ffactor(dbp, &replyp->ffactor);}/* * PUBLIC: void __db_set_h_ffactor_proc __P((u_int, u_int32_t, * PUBLIC: __db_set_h_ffactor_reply *)); */void__db_set_h_ffactor_proc(dbpcl_id, ffactor, replyp) u_int dbpcl_id; u_int32_t ffactor; __db_set_h_ffactor_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; ret = dbp->set_h_ffactor(dbp, ffactor); replyp->status = ret; return;}/* * PUBLIC: void __db_get_h_nelem_proc __P((u_int, __db_get_h_nelem_reply *)); */void__db_get_h_nelem_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_h_nelem_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_h_nelem(dbp, &replyp->nelem);}/* * PUBLIC: void __db_set_h_nelem_proc __P((u_int, u_int32_t, * PUBLIC: __db_set_h_nelem_reply *)); */void__db_set_h_nelem_proc(dbpcl_id, nelem, replyp) u_int dbpcl_id; u_int32_t nelem; __db_set_h_nelem_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; ret = dbp->set_h_nelem(dbp, nelem); replyp->status = ret; return;}/* * PUBLIC: void __db_key_range_proc __P((u_int, u_int, u_int32_t, u_int32_t, * PUBLIC: u_int32_t, u_int32_t, void *, u_int32_t, u_int32_t, * PUBLIC: __db_key_range_reply *)); */void__db_key_range_proc(dbpcl_id, txnpcl_id, keydlen, keydoff, keyulen, keyflags, keydata, keysize, flags, replyp) u_int dbpcl_id; u_int txnpcl_id; u_int32_t keydlen; u_int32_t keydoff; u_int32_t keyulen; u_int32_t keyflags; void *keydata; u_int32_t keysize; u_int32_t flags; __db_key_range_reply *replyp;{ DB *dbp; DBT key; DB_KEY_RANGE range; DB_TXN *txnp; ct_entry *dbp_ctp, *txnp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_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; memset(&key, 0, sizeof(key)); /* Set up key and data DBT */ key.dlen = keydlen; key.ulen = keyulen; key.doff = keydoff; key.size = keysize; key.data = keydata; key.flags = keyflags; ret = dbp->key_range(dbp, txnp, &key, &range, flags); replyp->status = ret; replyp->less = range.less; replyp->equal = range.equal; replyp->greater = range.greater; return;}/* * PUBLIC: void __db_get_lorder_proc __P((u_int, __db_get_lorder_reply *)); */void__db_get_lorder_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_lorder_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_lorder(dbp, (int *)&replyp->lorder);}/* * PUBLIC: void __db_set_lorder_proc * PUBLIC: __P((u_int, u_int32_t, __db_set_lorder_reply *)); */void__db_set_lorder_proc(dbpcl_id, lorder, replyp) u_int dbpcl_id; u_int32_t lorder; __db_set_lorder_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; ret = dbp->set_lorder(dbp, lorder); replyp->status = ret; return;}/* * PUBLIC: void __db_get_dbname_proc __P((u_int, __db_get_dbname_reply *)); */void__db_get_dbname_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_dbname_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_dbname(dbp, (const char **)&replyp->filename, (const char **)&replyp->dbname);}/* * PUBLIC: void __db_get_open_flags_proc __P((u_int, * PUBLIC: __db_get_open_flags_reply *)); */void__db_get_open_flags_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_open_flags_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_open_flags(dbp, &replyp->flags);}/* * PUBLIC: void __db_open_proc __P((u_int, u_int, char *, char *, u_int32_t, * PUBLIC: u_int32_t, u_int32_t, __db_open_reply *)); */void__db_open_proc(dbpcl_id, txnpcl_id, name, subdb, type, flags, mode, replyp) u_int dbpcl_id; u_int txnpcl_id; char *name; char *subdb; u_int32_t type; u_int32_t flags; u_int32_t mode; __db_open_reply *replyp;{ DB *dbp; DB_TXN *txnp; DBTYPE dbtype; ct_entry *dbp_ctp, *new_ctp, *txnp_ctp; int isswapped, ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_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; replyp->dbcl_id = dbpcl_id; if ((new_ctp = __dbsrv_sharedb(dbp_ctp, name, subdb, type, flags)) != NULL) { /* * We can share, clean up old ID, set new one. */ if (__dbsrv_verbose) printf("Sharing db ID %ld\n", new_ctp->ct_id); replyp->dbcl_id = new_ctp->ct_id; ret = __db_close_int(dbpcl_id, 0); goto out; } ret = dbp->open(dbp, txnp, name, subdb, (DBTYPE)type, flags, mode); if (ret == 0) { (void)dbp->get_type(dbp, &dbtype); replyp->type = dbtype; /* * We need to determine the byte order of the database * and send it back to the client. Determine it by * the server's native order and the swapped value of * the DB itself. */ (void)dbp->get_byteswapped(dbp, &isswapped); if (__db_byteorder(NULL, 1234) == 0) { if (isswapped == 0) replyp->lorder = 1234; else replyp->lorder = 4321; } else { if (isswapped == 0) replyp->lorder = 4321; else replyp->lorder = 1234; } dbp_ctp->ct_dbdp.type = dbtype; dbp_ctp->ct_dbdp.dbflags = LF_ISSET(DB_SERVER_DBFLAGS); if (name == NULL) dbp_ctp->ct_dbdp.db = NULL; else if ((ret = __os_strdup(dbp->dbenv, name, &dbp_ctp->ct_dbdp.db)) != 0) goto out; if (subdb == NULL) dbp_ctp->ct_dbdp.subdb = NULL; else if ((ret = __os_strdup(dbp->dbenv, subdb, &dbp_ctp->ct_dbdp.subdb)) != 0) goto out; }out: replyp->status = ret; return;}/* * PUBLIC: void __db_get_pagesize_proc __P((u_int, __db_get_pagesize_reply *)); */void__db_get_pagesize_proc(dbpcl_id, replyp) u_int dbpcl_id; __db_get_pagesize_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; replyp->status = dbp->get_pagesize(dbp, &replyp->pagesize);}/* * PUBLIC: void __db_set_pagesize_proc __P((u_int, u_int32_t, * PUBLIC: __db_set_pagesize_reply *)); */void__db_set_pagesize_proc(dbpcl_id, pagesize, replyp) u_int dbpcl_id; u_int32_t pagesize; __db_set_pagesize_reply *replyp;{ DB *dbp; ct_entry *dbp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_ctp->ct_anyp; ret = dbp->set_pagesize(dbp, pagesize); replyp->status = ret; return;}/* * PUBLIC: void __db_pget_proc __P((u_int, u_int, u_int32_t, u_int32_t, * PUBLIC: u_int32_t, u_int32_t, void *, u_int32_t, u_int32_t, * PUBLIC: u_int32_t, u_int32_t, u_int32_t, void *, u_int32_t, * PUBLIC: u_int32_t, u_int32_t, u_int32_t, u_int32_t, void *, * PUBLIC: u_int32_t, u_int32_t, __db_pget_reply *, int *)); */void__db_pget_proc(dbpcl_id, txnpcl_id, skeydlen, skeydoff, skeyulen, skeyflags, skeydata, skeysize, pkeydlen, pkeydoff, pkeyulen, pkeyflags, pkeydata, pkeysize, datadlen, datadoff, dataulen, dataflags, datadata, datasize, flags, replyp, freep) u_int dbpcl_id; u_int txnpcl_id; u_int32_t skeydlen; u_int32_t skeydoff; u_int32_t skeyulen; u_int32_t skeyflags; void *skeydata; u_int32_t skeysize; u_int32_t pkeydlen; u_int32_t pkeydoff; u_int32_t pkeyulen; u_int32_t pkeyflags; void *pkeydata; u_int32_t pkeysize; u_int32_t datadlen; u_int32_t datadoff; u_int32_t dataulen; u_int32_t dataflags; void *datadata; u_int32_t datasize; u_int32_t flags; __db_pget_reply *replyp; int * freep;{ DB *dbp; DBT skey, pkey, data; DB_TXN *txnp; ct_entry *dbp_ctp, *txnp_ctp; int ret; ACTIVATE_CTP(dbp_ctp, dbpcl_id, CT_DB); dbp = (DB *)dbp_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; replyp->skeydata.skeydata_val = NULL; replyp->pkeydata.pkeydata_val = NULL; replyp->datadata.datadata_val = NULL; *freep = 0; memset(&skey, 0, sizeof(skey)); memset(&pkey, 0, sizeof(pkey)); memset(&data, 0, sizeof(data)); /* * Ignore memory related flags on server. */ /* Set up key and data DBT */ skey.flags = DB_DBT_MALLOC; skey.dlen = skeydlen; skey.ulen = skeyulen; skey.doff = skeydoff; if (skeyflags & DB_DBT_PARTIAL) skey.flags |= DB_DBT_PARTIAL; skey.size = skeysize; skey.data = skeydata; pkey.flags = DB_DBT_MALLOC; pkey.dlen = pkeydlen; pkey.ulen = pkeyulen; pkey.doff = pkeydoff; if (pkeyflags & DB_DBT_PARTIAL) pkey.flags |= DB_DBT_PARTIAL; pkey.size = pkeysize; pkey.data = pkeydata; data.flags = DB_DBT_MALLOC; data.dlen = datadlen; data.ulen = dataulen; data.doff = datadoff; if (dataflags & DB_DBT_PARTIAL) data.flags |= DB_DBT_PARTIAL; data.size = datasize; data.data = datadata; /* Got all our stuff, now do the get */ ret = dbp->pget(dbp, txnp, &skey, &pkey, &data, flags); /* * Otherwise just status. */ if (ret == 0) { /* * XXX * We need to xdr_free whatever we are returning, next time. * However, DB does not allocate a new key if one was given * and we'd be free'ing up space allocated in the request. * So, allocate a new key/data pointer if it is the same one * as in the request. */ *freep = 1; /* * Key */ if (skey.data == skeydata) { ret = __os_umalloc(dbp->dbenv, skey.size, &replyp->skeydata.skeydata_val); if (ret != 0) goto err; memcpy(replyp->skeydata.skeydata_val, skey.data, skey.size); } else replyp->skeydata.skeydata_val = skey.data; replyp->skeydata.skeydata_len = skey.size; /* * Primary key */ if (pkey.data == pkeydata) { ret = __os_umalloc(dbp->dbenv, pkey.size, &replyp->pkeydata.pkeydata_val); if (ret != 0) goto err; /* * We can set it to 2, because they cannot send the * pkey over without sending the skey over too. * So if they did send a pkey, they must have sent * the skey as well. */ memcpy(replyp->pkeydata.pkeydata_val, pkey.data, pkey.size); } else replyp->pkeydata.pkeydata_val = pkey.data; replyp->pkeydata.pkeydata_len = pkey.size; /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -