gen_client_ret.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 2000
  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.29 2000/12/31 19:26:23 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_server.h"
  18. #include "db_int.h"
  19. #include "db_page.h"
  20. #include "txn.h"
  21. #include "db_ext.h"
  22. #include "rpc_client_ext.h"
  23. static void __db_db_stat_statsfree __P((u_int32_t *));
  24. static int __db_db_stat_statslist __P((__db_stat_statsreplist *, u_int32_t **));
  25. int
  26. __dbcl_env_close_ret(dbenv, flags, replyp)
  27. DB_ENV *dbenv;
  28. u_int32_t flags;
  29. __env_close_reply *replyp;
  30. {
  31. int ret;
  32. COMPQUIET(flags, 0);
  33. ret = __dbcl_refresh(dbenv);
  34. __os_free(dbenv, sizeof(*dbenv));
  35. if (replyp->status == 0 && ret != 0)
  36. return (ret);
  37. else
  38. return (replyp->status);
  39. }
  40. int
  41. __dbcl_env_open_ret(dbenv, home, flags, mode, replyp)
  42. DB_ENV *dbenv;
  43. const char *home;
  44. u_int32_t flags;
  45. int mode;
  46. __env_open_reply *replyp;
  47. {
  48. DB_TXNMGR *tmgrp;
  49. int ret;
  50. COMPQUIET(home, NULL);
  51. COMPQUIET(mode, 0);
  52. /*
  53.  * If error, return it.
  54.  */
  55. if (replyp->status != 0)
  56. return (replyp->status);
  57. /*
  58.  * If the user requested transactions, then we have some
  59.  * local client-side setup to do also.
  60.  */
  61. if (LF_ISSET(DB_INIT_TXN)) {
  62. if ((ret = __os_calloc(dbenv,
  63.     1, sizeof(DB_TXNMGR), &tmgrp)) != 0)
  64. return (ret);
  65. TAILQ_INIT(&tmgrp->txn_chain);
  66. tmgrp->dbenv = dbenv;
  67. dbenv->tx_handle = tmgrp;
  68. }
  69. return (replyp->status);
  70. }
  71. int
  72. __dbcl_env_remove_ret(dbenv, home, flags, replyp)
  73. DB_ENV *dbenv;
  74. const char *home;
  75. u_int32_t flags;
  76. __env_remove_reply *replyp;
  77. {
  78. int ret;
  79. COMPQUIET(home, NULL);
  80. COMPQUIET(flags, 0);
  81. ret = __dbcl_refresh(dbenv);
  82. __os_free(dbenv, sizeof(*dbenv));
  83. if (replyp->status == 0 && ret != 0)
  84. return (ret);
  85. else
  86. return (replyp->status);
  87. }
  88. int
  89. __dbcl_txn_abort_ret(txnp, replyp)
  90. DB_TXN *txnp;
  91. __txn_abort_reply *replyp;
  92. {
  93. __dbcl_txn_end(txnp);
  94. return (replyp->status);
  95. }
  96. int
  97. __dbcl_txn_begin_ret(envp, parent, txnpp, flags, replyp)
  98. DB_ENV *envp;
  99. DB_TXN *parent, **txnpp;
  100. u_int32_t flags;
  101. __txn_begin_reply *replyp;
  102. {
  103. DB_TXN *txn;
  104. int ret;
  105. COMPQUIET(flags, 0);
  106. if (replyp->status != 0)
  107. return (replyp->status);
  108. if ((ret = __os_calloc(envp, 1, sizeof(DB_TXN), &txn)) != 0)
  109. return (ret);
  110. txn->txnid = replyp->txnidcl_id;
  111. txn->mgrp = envp->tx_handle;
  112. txn->parent = parent;
  113. TAILQ_INIT(&txn->kids);
  114. txn->flags = TXN_MALLOC;
  115. if (parent != NULL)
  116. TAILQ_INSERT_HEAD(&parent->kids, txn, klinks);
  117. /*
  118.  * XXX
  119.  * In DB library the txn_chain is protected by the mgrp->mutexp.
  120.  * However, that mutex is implemented in the environments shared
  121.  * memory region.  The client library does not support all of the
  122.  * region - that just get forwarded to the server.  Therefore,
  123.  * the chain is unprotected here, but properly protected on the
  124.  * server.
  125.  */
  126. TAILQ_INSERT_TAIL(&txn->mgrp->txn_chain, txn, links);
  127. *txnpp = txn;
  128. return (replyp->status);
  129. }
  130. int
  131. __dbcl_txn_commit_ret(txnp, flags, replyp)
  132. DB_TXN *txnp;
  133. u_int32_t flags;
  134. __txn_commit_reply *replyp;
  135. {
  136. COMPQUIET(flags, 0);
  137. __dbcl_txn_end(txnp);
  138. return (replyp->status);
  139. }
  140. int
  141. __dbcl_db_close_ret(dbp, flags, replyp)
  142. DB *dbp;
  143. u_int32_t flags;
  144. __db_close_reply *replyp;
  145. {
  146. int ret;
  147. COMPQUIET(flags, 0);
  148. ret = __dbcl_dbclose_common(dbp);
  149. if (replyp->status != 0)
  150. return (replyp->status);
  151. else
  152. return (ret);
  153. }
  154. int
  155. __dbcl_db_get_ret(dbp, txnp, key, data, flags, replyp)
  156. DB *dbp;
  157. DB_TXN *txnp;
  158. DBT *key, *data;
  159. u_int32_t flags;
  160. __db_get_reply *replyp;
  161. {
  162. DB_ENV *dbenv;
  163. int ret;
  164. void *oldkey;
  165. COMPQUIET(txnp, NULL);
  166. COMPQUIET(flags, 0);
  167. ret = 0;
  168. if (replyp->status != 0)
  169. return (replyp->status);
  170. dbenv = dbp->dbenv;
  171. oldkey = key->data;
  172. ret = __dbcl_retcopy(dbenv, key, replyp->keydata.keydata_val,
  173.     replyp->keydata.keydata_len);
  174. if (ret)
  175. return (ret);
  176. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  177.     replyp->datadata.datadata_len);
  178. /*
  179.  * If an error on copying 'data' and we allocated for 'key'
  180.  * free it before returning the error.
  181.  */
  182. if (ret && oldkey != NULL)
  183. __os_free(key->data, key->size);
  184. return (ret);
  185. }
  186. int
  187. __dbcl_db_key_range_ret(dbp, txnp, key, range, flags, replyp)
  188. DB *dbp;
  189. DB_TXN *txnp;
  190. DBT *key;
  191. DB_KEY_RANGE *range;
  192. u_int32_t flags;
  193. __db_key_range_reply *replyp;
  194. {
  195. COMPQUIET(dbp, NULL);
  196. COMPQUIET(txnp, NULL);
  197. COMPQUIET(key, NULL);
  198. COMPQUIET(flags, 0);
  199. if (replyp->status != 0)
  200. return (replyp->status);
  201. range->less = replyp->less;
  202. range->equal = replyp->equal;
  203. range->greater = replyp->greater;
  204. return (replyp->status);
  205. }
  206. int
  207. __dbcl_db_open_ret(dbp, name, subdb, type, flags, mode, replyp)
  208. DB *dbp;
  209. const char *name, *subdb;
  210. DBTYPE type;
  211. u_int32_t flags;
  212. int mode;
  213. __db_open_reply *replyp;
  214. {
  215. COMPQUIET(name, NULL);
  216. COMPQUIET(subdb, NULL);
  217. COMPQUIET(type, 0);
  218. COMPQUIET(flags, 0);
  219. COMPQUIET(mode, 0);
  220. dbp->type = replyp->type;
  221. /*
  222.  * XXX
  223.  * This is only for Tcl which peeks at the dbp flags.
  224.  * When dbp->get_flags exists, this should go away.
  225.  */
  226. dbp->flags = replyp->dbflags;
  227. return (replyp->status);
  228. }
  229. int
  230. __dbcl_db_put_ret(dbp, txnp, key, data, flags, replyp)
  231. DB *dbp;
  232. DB_TXN *txnp;
  233. DBT *key, *data;
  234. u_int32_t flags;
  235. __db_put_reply *replyp;
  236. {
  237. int ret;
  238. COMPQUIET(dbp, NULL);
  239. COMPQUIET(txnp, NULL);
  240. COMPQUIET(data, NULL);
  241. ret = replyp->status;
  242. if (replyp->status == 0 && (flags == DB_APPEND))
  243. *(db_recno_t *)key->data =
  244.     *(db_recno_t *)replyp->keydata.keydata_val;
  245. return (ret);
  246. }
  247. int
  248. __dbcl_db_remove_ret(dbp, name, subdb, flags, replyp)
  249. DB *dbp;
  250. const char *name, *subdb;
  251. u_int32_t flags;
  252. __db_remove_reply *replyp;
  253. {
  254. int ret;
  255. COMPQUIET(name, 0);
  256. COMPQUIET(subdb, 0);
  257. COMPQUIET(flags, 0);
  258. ret = __dbcl_dbclose_common(dbp);
  259. if (replyp->status != 0)
  260. return (replyp->status);
  261. else
  262. return (ret);
  263. }
  264. int
  265. __dbcl_db_rename_ret(dbp, name, subdb, newname, flags, replyp)
  266. DB *dbp;
  267. const char *name, *subdb, *newname;
  268. u_int32_t flags;
  269. __db_remove_reply *replyp;
  270. {
  271. int ret;
  272. COMPQUIET(name, 0);
  273. COMPQUIET(subdb, 0);
  274. COMPQUIET(newname, 0);
  275. COMPQUIET(flags, 0);
  276. ret = __dbcl_dbclose_common(dbp);
  277. if (replyp->status != 0)
  278. return (replyp->status);
  279. else
  280. return (ret);
  281. }
  282. int
  283. __dbcl_db_stat_ret(dbp, sp, func, flags, replyp)
  284. DB *dbp;
  285. void *sp;
  286. void *(*func) __P((size_t));
  287. u_int32_t flags;
  288. __db_stat_reply *replyp;
  289. {
  290. int ret;
  291. u_int32_t *__db_statslist;
  292. COMPQUIET(dbp, NULL);
  293. COMPQUIET(func, NULL);
  294. COMPQUIET(flags, 0);
  295. if (replyp->status != 0)
  296. return (replyp->status);
  297. if ((ret =
  298.     __db_db_stat_statslist(replyp->statslist, &__db_statslist)) != 0)
  299. return (ret);
  300. if (sp == NULL)
  301. __db_db_stat_statsfree(__db_statslist);
  302. else
  303. *(u_int32_t **)sp = __db_statslist;
  304. return (replyp->status);
  305. }
  306. static int
  307. __db_db_stat_statslist(locp, ppp)
  308. __db_stat_statsreplist *locp;
  309. u_int32_t **ppp;
  310. {
  311. u_int32_t *pp;
  312. int cnt, ret, size;
  313. __db_stat_statsreplist *nl;
  314. for (cnt = 0, nl = locp; nl != NULL; cnt++, nl = nl->next)
  315. ;
  316. if (cnt == 0) {
  317. *ppp = NULL;
  318. return (0);
  319. }
  320. size = sizeof(*pp) * cnt;
  321. if ((ret = __os_malloc(NULL, size, NULL, ppp)) != 0)
  322. return (ret);
  323. memset(*ppp, 0, size);
  324. for (pp = *ppp, nl = locp; nl != NULL; nl = nl->next, pp++) {
  325. *pp = *(u_int32_t *)nl->ent.ent_val;
  326. }
  327. return (0);
  328. }
  329. static void
  330. __db_db_stat_statsfree(pp)
  331. u_int32_t *pp;
  332. {
  333. size_t size;
  334. u_int32_t *p;
  335. if (pp == NULL)
  336. return;
  337. size = sizeof(*p);
  338. for (p = pp; *p != 0; p++)
  339. size += sizeof(*p);
  340. __os_free(pp, size);
  341. }
  342. int
  343. __dbcl_db_cursor_ret(dbp, txnp, dbcpp, flags, replyp)
  344. DB *dbp;
  345. DB_TXN *txnp;
  346. DBC **dbcpp;
  347. u_int32_t flags;
  348. __db_cursor_reply *replyp;
  349. {
  350. COMPQUIET(txnp, NULL);
  351. COMPQUIET(flags, 0);
  352. if (replyp->status != 0)
  353. return (replyp->status);
  354. return (__dbcl_c_setup(replyp->dbcidcl_id, dbp, dbcpp));
  355. }
  356. int
  357. __dbcl_db_join_ret(dbp, curs, dbcpp, flags, replyp)
  358. DB *dbp;
  359. DBC **curs, **dbcpp;
  360. u_int32_t flags;
  361. __db_join_reply *replyp;
  362. {
  363. COMPQUIET(curs, NULL);
  364. COMPQUIET(flags, 0);
  365. if (replyp->status != 0)
  366. return (replyp->status);
  367. /*
  368.  * We set this up as a normal cursor.  We do not need
  369.  * to treat a join cursor any differently than a normal
  370.  * cursor, even though DB itself must.  We only need the
  371.  * client-side cursor/db relationship to know what cursors
  372.  * are open in the db, and to store their ID.  Nothing else.
  373.  */
  374. return (__dbcl_c_setup(replyp->dbcidcl_id, dbp, dbcpp));
  375. }
  376. int
  377. __dbcl_dbc_close_ret(dbcp, replyp)
  378. DBC *dbcp;
  379. __dbc_close_reply *replyp;
  380. {
  381. DB *dbp;
  382. dbp = dbcp->dbp;
  383. __dbcl_c_refresh(dbcp);
  384. return (replyp->status);
  385. }
  386. int
  387. __dbcl_dbc_count_ret(dbc, countp, flags, replyp)
  388. DBC *dbc;
  389. db_recno_t *countp;
  390. u_int32_t flags;
  391. __dbc_count_reply *replyp;
  392. {
  393. COMPQUIET(dbc, NULL);
  394. COMPQUIET(flags, 0);
  395. if (replyp->status != 0)
  396. return (replyp->status);
  397. *countp = replyp->dupcount;
  398. return (replyp->status);
  399. }
  400. int
  401. __dbcl_dbc_dup_ret(dbcp, dbcpp, flags, replyp)
  402. DBC *dbcp, **dbcpp;
  403. u_int32_t flags;
  404. __dbc_dup_reply *replyp;
  405. {
  406. COMPQUIET(flags, 0);
  407. if (replyp->status != 0)
  408. return (replyp->status);
  409. return (__dbcl_c_setup(replyp->dbcidcl_id, dbcp->dbp, dbcpp));
  410. }
  411. int
  412. __dbcl_dbc_get_ret(dbcp, key, data, flags, replyp)
  413. DBC *dbcp;
  414. DBT *key, *data;
  415. u_int32_t flags;
  416. __dbc_get_reply *replyp;
  417. {
  418. DB_ENV *dbenv;
  419. int ret;
  420. void *oldkey;
  421. COMPQUIET(flags, 0);
  422. ret = 0;
  423. if (replyp->status != 0)
  424. return (replyp->status);
  425. dbenv = dbcp->dbp->dbenv;
  426. oldkey = key->data;
  427. ret = __dbcl_retcopy(dbenv, key, replyp->keydata.keydata_val,
  428.     replyp->keydata.keydata_len);
  429. if (ret)
  430. return (ret);
  431. ret = __dbcl_retcopy(dbenv, data, replyp->datadata.datadata_val,
  432.     replyp->datadata.datadata_len);
  433. /*
  434.  * If an error on copying 'data' and we allocated for 'key'
  435.  * free it before returning the error.
  436.  */
  437. if (ret && oldkey != NULL)
  438. __os_free(key->data, key->size);
  439. return (ret);
  440. }
  441. int
  442. __dbcl_dbc_put_ret(dbcp, key, data, flags, replyp)
  443. DBC *dbcp;
  444. DBT *key, *data;
  445. u_int32_t flags;
  446. __dbc_put_reply *replyp;
  447. {
  448. COMPQUIET(data, NULL);
  449. if (replyp->status != 0)
  450. return (replyp->status);
  451. if (replyp->status == 0 && dbcp->dbp->type == DB_RECNO &&
  452.     (flags == DB_AFTER || flags == DB_BEFORE))
  453. *(db_recno_t *)key->data =
  454.     *(db_recno_t *)replyp->keydata.keydata_val;
  455. return (replyp->status);
  456. }
  457. #endif /* HAVE_RPC */