gen_client_ret.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:17k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2000-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: gen_client_ret.c,v 1.57 2002/08/06 06:18:37 bostic Exp $";
  10. #endif /* not lint */
  11. #ifdef HAVE_RPC
  12. #ifndef NO_SYSTEM_INCLUDES
  13. #include <sys/types.h>
  14. #include <rpc/rpc.h>
  15. #include <string.h>
  16. #endif
  17. #include "db_int.h"
  18. #include "dbinc/db_page.h"
  19. #include "dbinc/db_am.h"
  20. #include "dbinc/txn.h"
  21. #include "dbinc_auto/db_server.h"
  22. #include "dbinc_auto/rpc_client_ext.h"
  23. /*
  24.  * PUBLIC: int __dbcl_env_close_ret
  25.  * PUBLIC:     __P((DB_ENV *, u_int32_t, __env_close_reply *));
  26.  */
  27. int
  28. __dbcl_env_close_ret(dbenv, flags, replyp)
  29. DB_ENV *dbenv;
  30. u_int32_t flags;
  31. __env_close_reply *replyp;
  32. {
  33. int ret;
  34. COMPQUIET(flags, 0);
  35. ret = __dbcl_refresh(dbenv);
  36. __os_free(NULL, dbenv);
  37. if (replyp->status == 0 && ret != 0)
  38. return (ret);
  39. else
  40. return (replyp->status);
  41. }
  42. /*
  43.  * PUBLIC: int __dbcl_env_create_ret
  44.  * PUBLIC:     __P((DB_ENV *, long, __env_create_reply *));
  45.  */
  46. int
  47. __dbcl_env_create_ret(dbenv, timeout, replyp)
  48. DB_ENV * dbenv;
  49. long timeout;
  50. __env_create_reply *replyp;
  51. {
  52. COMPQUIET(timeout, 0);
  53. if (replyp->status != 0)
  54. return (replyp->status);
  55. dbenv->cl_id = replyp->envcl_id;
  56. return (replyp->status);
  57. }
  58. /*
  59.  * PUBLIC: int __dbcl_env_open_ret __P((DB_ENV *,
  60.  * PUBLIC:     const char *, u_int32_t, int, __env_open_reply *));
  61.  */
  62. int
  63. __dbcl_env_open_ret(dbenv, home, flags, mode, replyp)
  64. DB_ENV *dbenv;
  65. const char *home;
  66. u_int32_t flags;
  67. int mode;
  68. __env_open_reply *replyp;
  69. {
  70. DB_TXNMGR *tmgrp;
  71. int ret;
  72. COMPQUIET(home, NULL);
  73. COMPQUIET(mode, 0);
  74. /*
  75.  * If error, return it.
  76.  */
  77. if (replyp->status != 0)
  78. return (replyp->status);
  79. dbenv->cl_id = replyp->envcl_id;
  80. /*
  81.  * If the user requested transactions, then we have some
  82.  * local client-side setup to do also.
  83.  */
  84. if (LF_ISSET(DB_INIT_TXN)) {
  85. if ((ret = __os_calloc(dbenv,
  86.     1, sizeof(DB_TXNMGR), &tmgrp)) != 0)
  87. return (ret);
  88. TAILQ_INIT(&tmgrp->txn_chain);
  89. tmgrp->dbenv = dbenv;
  90. dbenv->tx_handle = tmgrp;
  91. }
  92. return (replyp->status);
  93. }
  94. /*
  95.  * PUBLIC: int __dbcl_env_remove_ret
  96.  * PUBLIC:     __P((DB_ENV *, const char *, u_int32_t, __env_remove_reply *));
  97.  */
  98. int
  99. __dbcl_env_remove_ret(dbenv, home, flags, replyp)
  100. DB_ENV *dbenv;
  101. const char *home;
  102. u_int32_t flags;
  103. __env_remove_reply *replyp;
  104. {
  105. int ret;
  106. COMPQUIET(home, NULL);
  107. COMPQUIET(flags, 0);
  108. ret = __dbcl_refresh(dbenv);
  109. __os_free(NULL, dbenv);
  110. if (replyp->status == 0 && ret != 0)
  111. return (ret);
  112. else
  113. return (replyp->status);
  114. }
  115. /*
  116.  * PUBLIC: int __dbcl_txn_abort_ret __P((DB_TXN *, __txn_abort_reply *));
  117.  */
  118. int
  119. __dbcl_txn_abort_ret(txnp, replyp)
  120. DB_TXN *txnp;
  121. __txn_abort_reply *replyp;
  122. {
  123. __dbcl_txn_end(txnp);
  124. return (replyp->status);
  125. }
  126. /*
  127.  * PUBLIC: int __dbcl_txn_begin_ret __P((DB_ENV *,
  128.  * PUBLIC:     DB_TXN *, DB_TXN **, u_int32_t, __txn_begin_reply *));
  129.  */
  130. int
  131. __dbcl_txn_begin_ret(envp, parent, txnpp, flags, replyp)
  132. DB_ENV *envp;
  133. DB_TXN *parent, **txnpp;
  134. u_int32_t flags;
  135. __txn_begin_reply *replyp;
  136. {
  137. DB_TXN *txn;
  138. int ret;
  139. COMPQUIET(flags, 0);
  140. if (replyp->status != 0)
  141. return (replyp->status);
  142. if ((ret = __os_calloc(envp, 1, sizeof(DB_TXN), &txn)) != 0)
  143. return (ret);
  144. __dbcl_txn_setup(envp, txn, parent, replyp->txnidcl_id);
  145. *txnpp = txn;
  146. return (replyp->status);
  147. }
  148. /*
  149.  * PUBLIC: int __dbcl_txn_commit_ret
  150.  * PUBLIC:     __P((DB_TXN *, u_int32_t, __txn_commit_reply *));
  151.  */
  152. int
  153. __dbcl_txn_commit_ret(txnp, flags, replyp)
  154. DB_TXN *txnp;
  155. u_int32_t flags;
  156. __txn_commit_reply *replyp;
  157. {
  158. COMPQUIET(flags, 0);
  159. __dbcl_txn_end(txnp);
  160. return (replyp->status);
  161. }
  162. /*
  163.  * PUBLIC: int __dbcl_txn_discard_ret __P((DB_TXN *, u_int32_t,
  164.  * PUBLIC:      __txn_discard_reply *));
  165.  */
  166. int
  167. __dbcl_txn_discard_ret(txnp, flags, replyp)
  168. DB_TXN * txnp;
  169. u_int32_t flags;
  170. __txn_discard_reply *replyp;
  171. {
  172. COMPQUIET(flags, 0);
  173. __dbcl_txn_end(txnp);
  174. return (replyp->status);
  175. }
  176. /*
  177.  * PUBLIC: int __dbcl_txn_recover_ret __P((DB_ENV *, DB_PREPLIST *, long,
  178.  * PUBLIC:      long *, u_int32_t, __txn_recover_reply *));
  179.  */
  180. int
  181. __dbcl_txn_recover_ret(dbenv, preplist, count, retp, flags, replyp)
  182. DB_ENV * dbenv;
  183. DB_PREPLIST * preplist;
  184. long count;
  185. long * retp;
  186. u_int32_t flags;
  187. __txn_recover_reply *replyp;
  188. {
  189. DB_PREPLIST *prep;
  190. DB_TXN *txnarray, *txn;
  191. u_int32_t i, *txnid;
  192. int ret;
  193. u_int8_t *gid;
  194. COMPQUIET(flags, 0);
  195. COMPQUIET(count, 0);
  196. if (replyp->status != 0)
  197. return (replyp->status);
  198. *retp = (long) replyp->retcount;
  199. if (replyp->retcount == 0)
  200. return (replyp->status);
  201. if ((ret = __os_calloc(dbenv, replyp->retcount, sizeof(DB_TXN),
  202.     &txnarray)) != 0)
  203. return (ret);
  204. /*
  205.  * We have a bunch of arrays that need to iterate in
  206.  * lockstep with each other.
  207.  */
  208. i = 0;
  209. txn = txnarray;
  210. txnid = (u_int32_t *)replyp->txn.txn_val;
  211. gid = (u_int8_t *)replyp->gid.gid_val;
  212. prep = preplist;
  213. while (i++ < replyp->retcount) {
  214. __dbcl_txn_setup(dbenv, txn, NULL, *txnid);
  215. prep->txn = txn;
  216. memcpy(&prep->gid, gid, DB_XIDDATASIZE);
  217. /*
  218.  * Now increment all our array pointers.
  219.  */
  220. txn++;
  221. gid += DB_XIDDATASIZE;
  222. txnid++;
  223. prep++;
  224. }
  225. return (0);
  226. }
  227. /*
  228.  * PUBLIC: int __dbcl_db_close_ret __P((DB *, u_int32_t, __db_close_reply *));
  229.  */
  230. int
  231. __dbcl_db_close_ret(dbp, flags, replyp)
  232. DB *dbp;
  233. u_int32_t flags;
  234. __db_close_reply *replyp;
  235. {
  236. int ret;
  237. COMPQUIET(flags, 0);
  238. ret = __dbcl_dbclose_common(dbp);
  239. if (replyp->status != 0)
  240. return (replyp->status);
  241. else
  242. return (ret);
  243. }
  244. /*
  245.  * PUBLIC: int __dbcl_db_create_ret
  246.  * PUBLIC:     __P((DB *, DB_ENV *, u_int32_t, __db_create_reply *));
  247.  */
  248. int
  249. __dbcl_db_create_ret(dbp, dbenv, flags, replyp)
  250. DB * dbp;
  251. DB_ENV * dbenv;
  252. u_int32_t flags;
  253. __db_create_reply *replyp;
  254. {
  255. COMPQUIET(dbenv, NULL);
  256. COMPQUIET(flags, 0);
  257. if (replyp->status != 0)
  258. return (replyp->status);
  259. dbp->cl_id = replyp->dbcl_id;
  260. return (replyp->status);
  261. }
  262. /*
  263.  * PUBLIC: int __dbcl_db_get_ret
  264.  * PUBLIC:     __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t, __db_get_reply *));
  265.  */
  266. int
  267. __dbcl_db_get_ret(dbp, txnp, key, data, flags, replyp)
  268. DB *dbp;
  269. DB_TXN *txnp;
  270. DBT *key, *data;
  271. u_int32_t flags;
  272. __db_get_reply *replyp;
  273. {
  274. DB_ENV *dbenv;
  275. int ret;
  276. void *oldkey;
  277. COMPQUIET(txnp, NULL);
  278. COMPQUIET(flags, 0);
  279. ret = 0;
  280. if (replyp->status != 0)
  281. return (replyp->status);
  282. dbenv = dbp->dbenv;
  283. oldkey = key->data;
  284. ret = __dbcl_retcopy(dbenv, key, replyp->keydata.keydata_val,
  285.     replyp->keydata.keydata_len, &dbp->my_rkey.data,
  286.     &dbp->my_rkey.ulen);
  287. if (ret)
  288. return (ret);
  289. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  290.     replyp->datadata.datadata_len, &dbp->my_rdata.data,
  291.     &dbp->my_rdata.ulen);
  292. /*
  293.  * If an error on copying 'data' and we allocated for 'key'
  294.  * free it before returning the error.
  295.  */
  296. if (ret && oldkey != NULL)
  297. __os_free(dbenv, key->data);
  298. return (ret);
  299. }
  300. /*
  301.  * PUBLIC: int __dbcl_db_key_range_ret __P((DB *, DB_TXN *,
  302.  * PUBLIC:     DBT *, DB_KEY_RANGE *, u_int32_t, __db_key_range_reply *));
  303.  */
  304. int
  305. __dbcl_db_key_range_ret(dbp, txnp, key, range, flags, replyp)
  306. DB *dbp;
  307. DB_TXN *txnp;
  308. DBT *key;
  309. DB_KEY_RANGE *range;
  310. u_int32_t flags;
  311. __db_key_range_reply *replyp;
  312. {
  313. COMPQUIET(dbp, NULL);
  314. COMPQUIET(txnp, NULL);
  315. COMPQUIET(key, NULL);
  316. COMPQUIET(flags, 0);
  317. if (replyp->status != 0)
  318. return (replyp->status);
  319. range->less = replyp->less;
  320. range->equal = replyp->equal;
  321. range->greater = replyp->greater;
  322. return (replyp->status);
  323. }
  324. /*
  325.  * PUBLIC: int __dbcl_db_open_ret __P((DB *, DB_TXN *, const char *,
  326.  * PUBLIC:     const char *, DBTYPE, u_int32_t, int, __db_open_reply *));
  327.  */
  328. int
  329. __dbcl_db_open_ret(dbp, txn, name, subdb, type, flags, mode, replyp)
  330. DB *dbp;
  331. DB_TXN *txn;
  332. const char *name, *subdb;
  333. DBTYPE type;
  334. u_int32_t flags;
  335. int mode;
  336. __db_open_reply *replyp;
  337. {
  338. COMPQUIET(txn, NULL);
  339. COMPQUIET(name, NULL);
  340. COMPQUIET(subdb, NULL);
  341. COMPQUIET(type, 0);
  342. COMPQUIET(flags, 0);
  343. COMPQUIET(mode, 0);
  344. if (replyp->status == 0) {
  345. dbp->cl_id = replyp->dbcl_id;
  346. dbp->type = replyp->type;
  347. /*
  348.  * We get back the database's byteorder on the server.
  349.  * Determine if our byteorder is the same or not by
  350.  * calling __db_set_lorder.
  351.  *
  352.  * XXX
  353.  * This MUST come before we set the flags because
  354.  * __db_set_lorder checks that it is called before
  355.  * the open flag is set.
  356.  */
  357. (void)__db_set_lorder(dbp, replyp->lorder);
  358. /*
  359.  * XXX
  360.  * This is only for Tcl which peeks at the dbp flags.
  361.  * When dbp->get_flags exists, this should go away.
  362.  */
  363. dbp->flags = replyp->dbflags;
  364. }
  365. return (replyp->status);
  366. }
  367. /*
  368.  * PUBLIC: int __dbcl_db_pget_ret __P((DB *, DB_TXN *, DBT *, DBT *, DBT *,
  369.  * PUBLIC:      u_int32_t, __db_pget_reply *));
  370.  */
  371. int
  372. __dbcl_db_pget_ret(dbp, txnp, skey, pkey, data, flags, replyp)
  373. DB * dbp;
  374. DB_TXN * txnp;
  375. DBT * skey;
  376. DBT * pkey;
  377. DBT * data;
  378. u_int32_t flags;
  379. __db_pget_reply *replyp;
  380. {
  381. DB_ENV *dbenv;
  382. int ret;
  383. void *oldskey, *oldpkey;
  384. COMPQUIET(txnp, NULL);
  385. COMPQUIET(flags, 0);
  386. ret = 0;
  387. if (replyp->status != 0)
  388. return (replyp->status);
  389. dbenv = dbp->dbenv;
  390. oldskey = skey->data;
  391. ret = __dbcl_retcopy(dbenv, skey, replyp->skeydata.skeydata_val,
  392.     replyp->skeydata.skeydata_len, &dbp->my_rskey.data,
  393.     &dbp->my_rskey.ulen);
  394. if (ret)
  395. return (ret);
  396. oldpkey = pkey->data;
  397. ret = __dbcl_retcopy(dbenv, pkey, replyp->pkeydata.pkeydata_val,
  398.     replyp->pkeydata.pkeydata_len, &dbp->my_rkey.data,
  399.     &dbp->my_rkey.ulen);
  400. if (ret && oldskey != NULL) {
  401. __os_free(dbenv, skey->data);
  402. return (ret);
  403. }
  404. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  405.     replyp->datadata.datadata_len, &dbp->my_rdata.data,
  406.     &dbp->my_rdata.ulen);
  407. /*
  408.  * If an error on copying 'data' and we allocated for '*key'
  409.  * free it before returning the error.
  410.  */
  411. if (ret) {
  412. if (oldskey != NULL)
  413. __os_free(dbenv, skey->data);
  414. if (oldpkey != NULL)
  415. __os_free(dbenv, pkey->data);
  416. }
  417. return (ret);
  418. }
  419. /*
  420.  * PUBLIC: int __dbcl_db_put_ret
  421.  * PUBLIC:     __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t, __db_put_reply *));
  422.  */
  423. int
  424. __dbcl_db_put_ret(dbp, txnp, key, data, flags, replyp)
  425. DB *dbp;
  426. DB_TXN *txnp;
  427. DBT *key, *data;
  428. u_int32_t flags;
  429. __db_put_reply *replyp;
  430. {
  431. int ret;
  432. COMPQUIET(dbp, NULL);
  433. COMPQUIET(txnp, NULL);
  434. COMPQUIET(data, NULL);
  435. ret = replyp->status;
  436. if (replyp->status == 0 && (flags == DB_APPEND))
  437. *(db_recno_t *)key->data =
  438.     *(db_recno_t *)replyp->keydata.keydata_val;
  439. return (ret);
  440. }
  441. /*
  442.  * PUBLIC: int __dbcl_db_remove_ret __P((DB *,
  443.  * PUBLIC:     const char *, const char *, u_int32_t, __db_remove_reply *));
  444.  */
  445. int
  446. __dbcl_db_remove_ret(dbp, name, subdb, flags, replyp)
  447. DB *dbp;
  448. const char *name, *subdb;
  449. u_int32_t flags;
  450. __db_remove_reply *replyp;
  451. {
  452. int ret;
  453. COMPQUIET(name, 0);
  454. COMPQUIET(subdb, 0);
  455. COMPQUIET(flags, 0);
  456. ret = __dbcl_dbclose_common(dbp);
  457. if (replyp->status != 0)
  458. return (replyp->status);
  459. else
  460. return (ret);
  461. }
  462. /*
  463.  * PUBLIC: int __dbcl_db_rename_ret __P((DB *, const char *,
  464.  * PUBLIC:     const char *, const char *, u_int32_t, __db_rename_reply *));
  465.  */
  466. int
  467. __dbcl_db_rename_ret(dbp, name, subdb, newname, flags, replyp)
  468. DB *dbp;
  469. const char *name, *subdb, *newname;
  470. u_int32_t flags;
  471. __db_rename_reply *replyp;
  472. {
  473. int ret;
  474. COMPQUIET(name, 0);
  475. COMPQUIET(subdb, 0);
  476. COMPQUIET(newname, 0);
  477. COMPQUIET(flags, 0);
  478. ret = __dbcl_dbclose_common(dbp);
  479. if (replyp->status != 0)
  480. return (replyp->status);
  481. else
  482. return (ret);
  483. }
  484. /*
  485.  * PUBLIC: int __dbcl_db_stat_ret
  486.  * PUBLIC:     __P((DB *, void *, u_int32_t, __db_stat_reply *));
  487.  */
  488. int
  489. __dbcl_db_stat_ret(dbp, sp, flags, replyp)
  490. DB *dbp;
  491. void *sp;
  492. u_int32_t flags;
  493. __db_stat_reply *replyp;
  494. {
  495. int len, ret;
  496. u_int32_t i, *q, *p, *retsp;
  497. COMPQUIET(flags, 0);
  498. if (replyp->status != 0 || sp == NULL)
  499. return (replyp->status);
  500. len = replyp->stats.stats_len * sizeof(u_int32_t);
  501. if ((ret = __os_umalloc(dbp->dbenv, len, &retsp)) != 0)
  502. return (ret);
  503. for (i = 0, q = retsp, p = (u_int32_t *)replyp->stats.stats_val;
  504.     i < replyp->stats.stats_len; i++, q++, p++)
  505. *q = *p;
  506. *(u_int32_t **)sp = retsp;
  507. return (0);
  508. }
  509. /*
  510.  * PUBLIC: int __dbcl_db_truncate_ret __P((DB *, DB_TXN *, u_int32_t  *,
  511.  * PUBLIC:      u_int32_t, __db_truncate_reply *));
  512.  */
  513. int
  514. __dbcl_db_truncate_ret(dbp, txnp, countp, flags, replyp)
  515. DB *dbp;
  516. DB_TXN *txnp;
  517. u_int32_t *countp, flags;
  518. __db_truncate_reply *replyp;
  519. {
  520. COMPQUIET(dbp, NULL);
  521. COMPQUIET(txnp, NULL);
  522. COMPQUIET(flags, 0);
  523. if (replyp->status != 0)
  524. return (replyp->status);
  525. *countp = replyp->count;
  526. return (replyp->status);
  527. }
  528. /*
  529.  * PUBLIC: int __dbcl_db_cursor_ret
  530.  * PUBLIC:     __P((DB *, DB_TXN *, DBC **, u_int32_t, __db_cursor_reply *));
  531.  */
  532. int
  533. __dbcl_db_cursor_ret(dbp, txnp, dbcp, flags, replyp)
  534. DB *dbp;
  535. DB_TXN *txnp;
  536. DBC **dbcp;
  537. u_int32_t flags;
  538. __db_cursor_reply *replyp;
  539. {
  540. COMPQUIET(txnp, NULL);
  541. COMPQUIET(flags, 0);
  542. if (replyp->status != 0)
  543. return (replyp->status);
  544. return (__dbcl_c_setup(replyp->dbcidcl_id, dbp, dbcp));
  545. }
  546. /*
  547.  * PUBLIC: int __dbcl_db_join_ret
  548.  * PUBLIC:     __P((DB *, DBC **, DBC **, u_int32_t, __db_join_reply *));
  549.  */
  550. int
  551. __dbcl_db_join_ret(dbp, curs, dbcp, flags, replyp)
  552. DB *dbp;
  553. DBC **curs, **dbcp;
  554. u_int32_t flags;
  555. __db_join_reply *replyp;
  556. {
  557. COMPQUIET(curs, NULL);
  558. COMPQUIET(flags, 0);
  559. if (replyp->status != 0)
  560. return (replyp->status);
  561. /*
  562.  * We set this up as a normal cursor.  We do not need
  563.  * to treat a join cursor any differently than a normal
  564.  * cursor, even though DB itself must.  We only need the
  565.  * client-side cursor/db relationship to know what cursors
  566.  * are open in the db, and to store their ID.  Nothing else.
  567.  */
  568. return (__dbcl_c_setup(replyp->dbcidcl_id, dbp, dbcp));
  569. }
  570. /*
  571.  * PUBLIC: int __dbcl_dbc_close_ret __P((DBC *, __dbc_close_reply *));
  572.  */
  573. int
  574. __dbcl_dbc_close_ret(dbc, replyp)
  575. DBC *dbc;
  576. __dbc_close_reply *replyp;
  577. {
  578. __dbcl_c_refresh(dbc);
  579. return (replyp->status);
  580. }
  581. /*
  582.  * PUBLIC: int __dbcl_dbc_count_ret
  583.  * PUBLIC:     __P((DBC *, db_recno_t *, u_int32_t, __dbc_count_reply *));
  584.  */
  585. int
  586. __dbcl_dbc_count_ret(dbc, countp, flags, replyp)
  587. DBC *dbc;
  588. db_recno_t *countp;
  589. u_int32_t flags;
  590. __dbc_count_reply *replyp;
  591. {
  592. COMPQUIET(dbc, NULL);
  593. COMPQUIET(flags, 0);
  594. if (replyp->status != 0)
  595. return (replyp->status);
  596. *countp = replyp->dupcount;
  597. return (replyp->status);
  598. }
  599. /*
  600.  * PUBLIC: int __dbcl_dbc_dup_ret
  601.  * PUBLIC:     __P((DBC *, DBC **, u_int32_t, __dbc_dup_reply *));
  602.  */
  603. int
  604. __dbcl_dbc_dup_ret(dbc, dbcp, flags, replyp)
  605. DBC *dbc, **dbcp;
  606. u_int32_t flags;
  607. __dbc_dup_reply *replyp;
  608. {
  609. COMPQUIET(flags, 0);
  610. if (replyp->status != 0)
  611. return (replyp->status);
  612. return (__dbcl_c_setup(replyp->dbcidcl_id, dbc->dbp, dbcp));
  613. }
  614. /*
  615.  * PUBLIC: int __dbcl_dbc_get_ret
  616.  * PUBLIC:     __P((DBC *, DBT *, DBT *, u_int32_t, __dbc_get_reply *));
  617.  */
  618. int
  619. __dbcl_dbc_get_ret(dbc, key, data, flags, replyp)
  620. DBC *dbc;
  621. DBT *key, *data;
  622. u_int32_t flags;
  623. __dbc_get_reply *replyp;
  624. {
  625. DB_ENV *dbenv;
  626. int ret;
  627. void *oldkey;
  628. COMPQUIET(flags, 0);
  629. ret = 0;
  630. if (replyp->status != 0)
  631. return (replyp->status);
  632. dbenv = dbc->dbp->dbenv;
  633. oldkey = key->data;
  634. ret = __dbcl_retcopy(dbenv, key, replyp->keydata.keydata_val,
  635.     replyp->keydata.keydata_len, &dbc->my_rkey.data,
  636.     &dbc->my_rkey.ulen);
  637. if (ret)
  638. return (ret);
  639. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  640.     replyp->datadata.datadata_len, &dbc->my_rdata.data,
  641.     &dbc->my_rdata.ulen);
  642. /*
  643.  * If an error on copying 'data' and we allocated for 'key'
  644.  * free it before returning the error.
  645.  */
  646. if (ret && oldkey != NULL)
  647. __os_free(dbenv, key->data);
  648. return (ret);
  649. }
  650. /*
  651.  * PUBLIC: int __dbcl_dbc_pget_ret __P((DBC *, DBT *, DBT *, DBT *, u_int32_t,
  652.  * PUBLIC:      __dbc_pget_reply *));
  653.  */
  654. int
  655. __dbcl_dbc_pget_ret(dbc, skey, pkey, data, flags, replyp)
  656. DBC * dbc;
  657. DBT * skey;
  658. DBT * pkey;
  659. DBT * data;
  660. u_int32_t flags;
  661. __dbc_pget_reply *replyp;
  662. {
  663. DB_ENV *dbenv;
  664. int ret;
  665. void *oldskey, *oldpkey;
  666. COMPQUIET(flags, 0);
  667. ret = 0;
  668. if (replyp->status != 0)
  669. return (replyp->status);
  670. dbenv = dbc->dbp->dbenv;
  671. oldskey = skey->data;
  672. ret = __dbcl_retcopy(dbenv, skey, replyp->skeydata.skeydata_val,
  673.     replyp->skeydata.skeydata_len, &dbc->my_rskey.data,
  674.     &dbc->my_rskey.ulen);
  675. if (ret)
  676. return (ret);
  677. oldpkey = pkey->data;
  678. ret = __dbcl_retcopy(dbenv, pkey, replyp->pkeydata.pkeydata_val,
  679.     replyp->pkeydata.pkeydata_len, &dbc->my_rkey.data,
  680.     &dbc->my_rkey.ulen);
  681. if (ret && oldskey != NULL) {
  682. __os_free(dbenv, skey->data);
  683. return (ret);
  684. }
  685. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  686.     replyp->datadata.datadata_len, &dbc->my_rdata.data,
  687.     &dbc->my_rdata.ulen);
  688. /*
  689.  * If an error on copying 'data' and we allocated for '*key'
  690.  * free it before returning the error.
  691.  */
  692. if (ret) {
  693. if (oldskey != NULL)
  694. __os_free(dbenv, skey->data);
  695. if (oldpkey != NULL)
  696. __os_free(dbenv, pkey->data);
  697. }
  698. return (ret);
  699. }
  700. /*
  701.  * PUBLIC: int __dbcl_dbc_put_ret
  702.  * PUBLIC:     __P((DBC *, DBT *, DBT *, u_int32_t, __dbc_put_reply *));
  703.  */
  704. int
  705. __dbcl_dbc_put_ret(dbc, key, data, flags, replyp)
  706. DBC *dbc;
  707. DBT *key, *data;
  708. u_int32_t flags;
  709. __dbc_put_reply *replyp;
  710. {
  711. COMPQUIET(data, NULL);
  712. if (replyp->status != 0)
  713. return (replyp->status);
  714. if (replyp->status == 0 && dbc->dbp->type == DB_RECNO &&
  715.     (flags == DB_AFTER || flags == DB_BEFORE))
  716. *(db_recno_t *)key->data =
  717.     *(db_recno_t *)replyp->keydata.keydata_val;
  718. return (replyp->status);
  719. }
  720. #endif /* HAVE_RPC */