⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_server_proc.c

📁 关于Berkelay数据库的共享源码
💻 C
📖 第 1 页 / 共 5 页
字号:
				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 + -