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

MySQL数据库

开发平台:

Visual C++

  1. /* Do not edit: automatically built by gen_rec.awk. */
  2. #include "db_config.h"
  3. #ifndef NO_SYSTEM_INCLUDES
  4. #include <sys/types.h>
  5. #include <ctype.h>
  6. #include <string.h>
  7. #endif
  8. #include "db_int.h"
  9. #include "dbinc/crypto.h"
  10. #include "dbinc/db_page.h"
  11. #include "dbinc/db_dispatch.h"
  12. #include "dbinc/db_am.h"
  13. #include "dbinc/log.h"
  14. #include "dbinc/rep.h"
  15. #include "dbinc/txn.h"
  16. /*
  17.  * PUBLIC: int __txn_regop_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  18.  * PUBLIC:     u_int32_t, u_int32_t, int32_t));
  19.  */
  20. int
  21. __txn_regop_log(dbenv, txnid, ret_lsnp, flags,
  22.     opcode, timestamp)
  23. DB_ENV *dbenv;
  24. DB_TXN *txnid;
  25. DB_LSN *ret_lsnp;
  26. u_int32_t flags;
  27. u_int32_t opcode;
  28. int32_t timestamp;
  29. {
  30. DBT logrec;
  31. DB_LSN *lsnp, null_lsn;
  32. u_int32_t uinttmp;
  33. u_int32_t npad, rectype, txn_num;
  34. int ret;
  35. u_int8_t *bp;
  36. rectype = DB___txn_regop;
  37. npad = 0;
  38. if (txnid == NULL) {
  39. txn_num = 0;
  40. null_lsn.file = 0;
  41. null_lsn.offset = 0;
  42. lsnp = &null_lsn;
  43. } else {
  44. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  45.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  46. return (ret);
  47. txn_num = txnid->txnid;
  48. lsnp = &txnid->last_lsn;
  49. }
  50. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  51.     + sizeof(u_int32_t)
  52.     + sizeof(u_int32_t);
  53. if (CRYPTO_ON(dbenv)) {
  54. npad =
  55.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  56. logrec.size += npad;
  57. }
  58. if ((ret = __os_malloc(dbenv,
  59.     logrec.size, &logrec.data)) != 0)
  60. return (ret);
  61. if (npad > 0)
  62. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  63. bp = logrec.data;
  64. memcpy(bp, &rectype, sizeof(rectype));
  65. bp += sizeof(rectype);
  66. memcpy(bp, &txn_num, sizeof(txn_num));
  67. bp += sizeof(txn_num);
  68. memcpy(bp, lsnp, sizeof(DB_LSN));
  69. bp += sizeof(DB_LSN);
  70. uinttmp = (u_int32_t)opcode;
  71. memcpy(bp, &uinttmp, sizeof(uinttmp));
  72. bp += sizeof(uinttmp);
  73. uinttmp = (u_int32_t)timestamp;
  74. memcpy(bp, &uinttmp, sizeof(uinttmp));
  75. bp += sizeof(uinttmp);
  76. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  77. ret = dbenv->log_put(dbenv,
  78.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  79. if (txnid != NULL && ret == 0)
  80. txnid->last_lsn = *ret_lsnp;
  81. #ifdef LOG_DIAGNOSTIC
  82. if (ret != 0)
  83. (void)__txn_regop_print(dbenv,
  84.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  85. #endif
  86. __os_free(dbenv, logrec.data);
  87. return (ret);
  88. }
  89. /*
  90.  * PUBLIC: int __txn_regop_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  91.  * PUBLIC:     db_recops, void *));
  92.  */
  93. int
  94. __txn_regop_getpgnos(dbenv, rec, lsnp, notused1, summary)
  95. DB_ENV *dbenv;
  96. DBT *rec;
  97. DB_LSN *lsnp;
  98. db_recops notused1;
  99. void *summary;
  100. {
  101. TXN_RECS *t;
  102. int ret;
  103. COMPQUIET(rec, NULL);
  104. COMPQUIET(notused1, DB_TXN_ABORT);
  105. t = (TXN_RECS *)summary;
  106. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  107. return (ret);
  108. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  109. t->array[t->npages].lsn = *lsnp;
  110. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  111. memset(&t->array[t->npages].pgdesc, 0,
  112.     sizeof(t->array[t->npages].pgdesc));
  113. t->npages++;
  114. return (0);
  115. }
  116. /*
  117.  * PUBLIC: int __txn_regop_print __P((DB_ENV *, DBT *, DB_LSN *,
  118.  * PUBLIC:     db_recops, void *));
  119.  */
  120. int
  121. __txn_regop_print(dbenv, dbtp, lsnp, notused2, notused3)
  122. DB_ENV *dbenv;
  123. DBT *dbtp;
  124. DB_LSN *lsnp;
  125. db_recops notused2;
  126. void *notused3;
  127. {
  128. __txn_regop_args *argp;
  129. int ret;
  130. notused2 = DB_TXN_ABORT;
  131. notused3 = NULL;
  132. if ((ret = __txn_regop_read(dbenv, dbtp->data, &argp)) != 0)
  133. return (ret);
  134. (void)printf(
  135.     "[%lu][%lu]__txn_regop: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  136.     (u_long)lsnp->file,
  137.     (u_long)lsnp->offset,
  138.     (u_long)argp->type,
  139.     (u_long)argp->txnid->txnid,
  140.     (u_long)argp->prev_lsn.file,
  141.     (u_long)argp->prev_lsn.offset);
  142. (void)printf("topcode: %lun", (u_long)argp->opcode);
  143. (void)printf("ttimestamp: %ldn", (long)argp->timestamp);
  144. (void)printf("n");
  145. __os_free(dbenv, argp);
  146. return (0);
  147. }
  148. /*
  149.  * PUBLIC: int __txn_regop_read __P((DB_ENV *, void *, __txn_regop_args **));
  150.  */
  151. int
  152. __txn_regop_read(dbenv, recbuf, argpp)
  153. DB_ENV *dbenv;
  154. void *recbuf;
  155. __txn_regop_args **argpp;
  156. {
  157. __txn_regop_args *argp;
  158. u_int32_t uinttmp;
  159. u_int8_t *bp;
  160. int ret;
  161. if ((ret = __os_malloc(dbenv,
  162.     sizeof(__txn_regop_args) + sizeof(DB_TXN), &argp)) != 0)
  163. return (ret);
  164. argp->txnid = (DB_TXN *)&argp[1];
  165. bp = recbuf;
  166. memcpy(&argp->type, bp, sizeof(argp->type));
  167. bp += sizeof(argp->type);
  168. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  169. bp += sizeof(argp->txnid->txnid);
  170. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  171. bp += sizeof(DB_LSN);
  172. memcpy(&uinttmp, bp, sizeof(uinttmp));
  173. argp->opcode = (u_int32_t)uinttmp;
  174. bp += sizeof(uinttmp);
  175. memcpy(&uinttmp, bp, sizeof(uinttmp));
  176. argp->timestamp = (int32_t)uinttmp;
  177. bp += sizeof(uinttmp);
  178. *argpp = argp;
  179. return (0);
  180. }
  181. /*
  182.  * PUBLIC: int __txn_ckp_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  183.  * PUBLIC:     u_int32_t, DB_LSN *, DB_LSN *, int32_t));
  184.  */
  185. int
  186. __txn_ckp_log(dbenv, txnid, ret_lsnp, flags,
  187.     ckp_lsn, last_ckp, timestamp)
  188. DB_ENV *dbenv;
  189. DB_TXN *txnid;
  190. DB_LSN *ret_lsnp;
  191. u_int32_t flags;
  192. DB_LSN * ckp_lsn;
  193. DB_LSN * last_ckp;
  194. int32_t timestamp;
  195. {
  196. DBT logrec;
  197. DB_LSN *lsnp, null_lsn;
  198. u_int32_t uinttmp;
  199. u_int32_t npad, rectype, txn_num;
  200. int ret;
  201. u_int8_t *bp;
  202. rectype = DB___txn_ckp;
  203. npad = 0;
  204. if (txnid == NULL) {
  205. txn_num = 0;
  206. null_lsn.file = 0;
  207. null_lsn.offset = 0;
  208. lsnp = &null_lsn;
  209. } else {
  210. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  211.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  212. return (ret);
  213. txn_num = txnid->txnid;
  214. lsnp = &txnid->last_lsn;
  215. }
  216. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  217.     + sizeof(*ckp_lsn)
  218.     + sizeof(*last_ckp)
  219.     + sizeof(u_int32_t);
  220. if (CRYPTO_ON(dbenv)) {
  221. npad =
  222.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  223. logrec.size += npad;
  224. }
  225. if ((ret = __os_malloc(dbenv,
  226.     logrec.size, &logrec.data)) != 0)
  227. return (ret);
  228. if (npad > 0)
  229. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  230. bp = logrec.data;
  231. memcpy(bp, &rectype, sizeof(rectype));
  232. bp += sizeof(rectype);
  233. memcpy(bp, &txn_num, sizeof(txn_num));
  234. bp += sizeof(txn_num);
  235. memcpy(bp, lsnp, sizeof(DB_LSN));
  236. bp += sizeof(DB_LSN);
  237. if (ckp_lsn != NULL)
  238. memcpy(bp, ckp_lsn, sizeof(*ckp_lsn));
  239. else
  240. memset(bp, 0, sizeof(*ckp_lsn));
  241. bp += sizeof(*ckp_lsn);
  242. if (last_ckp != NULL)
  243. memcpy(bp, last_ckp, sizeof(*last_ckp));
  244. else
  245. memset(bp, 0, sizeof(*last_ckp));
  246. bp += sizeof(*last_ckp);
  247. uinttmp = (u_int32_t)timestamp;
  248. memcpy(bp, &uinttmp, sizeof(uinttmp));
  249. bp += sizeof(uinttmp);
  250. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  251. ret = dbenv->log_put(dbenv,
  252.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  253. if (txnid != NULL && ret == 0)
  254. txnid->last_lsn = *ret_lsnp;
  255. #ifdef LOG_DIAGNOSTIC
  256. if (ret != 0)
  257. (void)__txn_ckp_print(dbenv,
  258.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  259. #endif
  260. __os_free(dbenv, logrec.data);
  261. return (ret);
  262. }
  263. /*
  264.  * PUBLIC: int __txn_ckp_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  265.  * PUBLIC:     db_recops, void *));
  266.  */
  267. int
  268. __txn_ckp_getpgnos(dbenv, rec, lsnp, notused1, summary)
  269. DB_ENV *dbenv;
  270. DBT *rec;
  271. DB_LSN *lsnp;
  272. db_recops notused1;
  273. void *summary;
  274. {
  275. TXN_RECS *t;
  276. int ret;
  277. COMPQUIET(rec, NULL);
  278. COMPQUIET(notused1, DB_TXN_ABORT);
  279. t = (TXN_RECS *)summary;
  280. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  281. return (ret);
  282. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  283. t->array[t->npages].lsn = *lsnp;
  284. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  285. memset(&t->array[t->npages].pgdesc, 0,
  286.     sizeof(t->array[t->npages].pgdesc));
  287. t->npages++;
  288. return (0);
  289. }
  290. /*
  291.  * PUBLIC: int __txn_ckp_print __P((DB_ENV *, DBT *, DB_LSN *,
  292.  * PUBLIC:     db_recops, void *));
  293.  */
  294. int
  295. __txn_ckp_print(dbenv, dbtp, lsnp, notused2, notused3)
  296. DB_ENV *dbenv;
  297. DBT *dbtp;
  298. DB_LSN *lsnp;
  299. db_recops notused2;
  300. void *notused3;
  301. {
  302. __txn_ckp_args *argp;
  303. int ret;
  304. notused2 = DB_TXN_ABORT;
  305. notused3 = NULL;
  306. if ((ret = __txn_ckp_read(dbenv, dbtp->data, &argp)) != 0)
  307. return (ret);
  308. (void)printf(
  309.     "[%lu][%lu]__txn_ckp: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  310.     (u_long)lsnp->file,
  311.     (u_long)lsnp->offset,
  312.     (u_long)argp->type,
  313.     (u_long)argp->txnid->txnid,
  314.     (u_long)argp->prev_lsn.file,
  315.     (u_long)argp->prev_lsn.offset);
  316. (void)printf("tckp_lsn: [%lu][%lu]n",
  317.     (u_long)argp->ckp_lsn.file, (u_long)argp->ckp_lsn.offset);
  318. (void)printf("tlast_ckp: [%lu][%lu]n",
  319.     (u_long)argp->last_ckp.file, (u_long)argp->last_ckp.offset);
  320. (void)printf("ttimestamp: %ldn", (long)argp->timestamp);
  321. (void)printf("n");
  322. __os_free(dbenv, argp);
  323. return (0);
  324. }
  325. /*
  326.  * PUBLIC: int __txn_ckp_read __P((DB_ENV *, void *, __txn_ckp_args **));
  327.  */
  328. int
  329. __txn_ckp_read(dbenv, recbuf, argpp)
  330. DB_ENV *dbenv;
  331. void *recbuf;
  332. __txn_ckp_args **argpp;
  333. {
  334. __txn_ckp_args *argp;
  335. u_int32_t uinttmp;
  336. u_int8_t *bp;
  337. int ret;
  338. if ((ret = __os_malloc(dbenv,
  339.     sizeof(__txn_ckp_args) + sizeof(DB_TXN), &argp)) != 0)
  340. return (ret);
  341. argp->txnid = (DB_TXN *)&argp[1];
  342. bp = recbuf;
  343. memcpy(&argp->type, bp, sizeof(argp->type));
  344. bp += sizeof(argp->type);
  345. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  346. bp += sizeof(argp->txnid->txnid);
  347. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  348. bp += sizeof(DB_LSN);
  349. memcpy(&argp->ckp_lsn, bp,  sizeof(argp->ckp_lsn));
  350. bp += sizeof(argp->ckp_lsn);
  351. memcpy(&argp->last_ckp, bp,  sizeof(argp->last_ckp));
  352. bp += sizeof(argp->last_ckp);
  353. memcpy(&uinttmp, bp, sizeof(uinttmp));
  354. argp->timestamp = (int32_t)uinttmp;
  355. bp += sizeof(uinttmp);
  356. *argpp = argp;
  357. return (0);
  358. }
  359. /*
  360.  * PUBLIC: int __txn_child_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  361.  * PUBLIC:     u_int32_t, u_int32_t, DB_LSN *));
  362.  */
  363. int
  364. __txn_child_log(dbenv, txnid, ret_lsnp, flags,
  365.     child, c_lsn)
  366. DB_ENV *dbenv;
  367. DB_TXN *txnid;
  368. DB_LSN *ret_lsnp;
  369. u_int32_t flags;
  370. u_int32_t child;
  371. DB_LSN * c_lsn;
  372. {
  373. DBT logrec;
  374. DB_LSN *lsnp, null_lsn;
  375. u_int32_t uinttmp;
  376. u_int32_t npad, rectype, txn_num;
  377. int ret;
  378. u_int8_t *bp;
  379. rectype = DB___txn_child;
  380. npad = 0;
  381. if (txnid == NULL) {
  382. txn_num = 0;
  383. null_lsn.file = 0;
  384. null_lsn.offset = 0;
  385. lsnp = &null_lsn;
  386. } else {
  387. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  388.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  389. return (ret);
  390. txn_num = txnid->txnid;
  391. lsnp = &txnid->last_lsn;
  392. }
  393. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  394.     + sizeof(u_int32_t)
  395.     + sizeof(*c_lsn);
  396. if (CRYPTO_ON(dbenv)) {
  397. npad =
  398.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  399. logrec.size += npad;
  400. }
  401. if ((ret = __os_malloc(dbenv,
  402.     logrec.size, &logrec.data)) != 0)
  403. return (ret);
  404. if (npad > 0)
  405. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  406. bp = logrec.data;
  407. memcpy(bp, &rectype, sizeof(rectype));
  408. bp += sizeof(rectype);
  409. memcpy(bp, &txn_num, sizeof(txn_num));
  410. bp += sizeof(txn_num);
  411. memcpy(bp, lsnp, sizeof(DB_LSN));
  412. bp += sizeof(DB_LSN);
  413. uinttmp = (u_int32_t)child;
  414. memcpy(bp, &uinttmp, sizeof(uinttmp));
  415. bp += sizeof(uinttmp);
  416. if (c_lsn != NULL)
  417. memcpy(bp, c_lsn, sizeof(*c_lsn));
  418. else
  419. memset(bp, 0, sizeof(*c_lsn));
  420. bp += sizeof(*c_lsn);
  421. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  422. ret = dbenv->log_put(dbenv,
  423.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  424. if (txnid != NULL && ret == 0)
  425. txnid->last_lsn = *ret_lsnp;
  426. #ifdef LOG_DIAGNOSTIC
  427. if (ret != 0)
  428. (void)__txn_child_print(dbenv,
  429.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  430. #endif
  431. __os_free(dbenv, logrec.data);
  432. return (ret);
  433. }
  434. /*
  435.  * PUBLIC: int __txn_child_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  436.  * PUBLIC:     db_recops, void *));
  437.  */
  438. int
  439. __txn_child_getpgnos(dbenv, rec, lsnp, notused1, summary)
  440. DB_ENV *dbenv;
  441. DBT *rec;
  442. DB_LSN *lsnp;
  443. db_recops notused1;
  444. void *summary;
  445. {
  446. TXN_RECS *t;
  447. int ret;
  448. COMPQUIET(rec, NULL);
  449. COMPQUIET(notused1, DB_TXN_ABORT);
  450. t = (TXN_RECS *)summary;
  451. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  452. return (ret);
  453. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  454. t->array[t->npages].lsn = *lsnp;
  455. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  456. memset(&t->array[t->npages].pgdesc, 0,
  457.     sizeof(t->array[t->npages].pgdesc));
  458. t->npages++;
  459. return (0);
  460. }
  461. /*
  462.  * PUBLIC: int __txn_child_print __P((DB_ENV *, DBT *, DB_LSN *,
  463.  * PUBLIC:     db_recops, void *));
  464.  */
  465. int
  466. __txn_child_print(dbenv, dbtp, lsnp, notused2, notused3)
  467. DB_ENV *dbenv;
  468. DBT *dbtp;
  469. DB_LSN *lsnp;
  470. db_recops notused2;
  471. void *notused3;
  472. {
  473. __txn_child_args *argp;
  474. int ret;
  475. notused2 = DB_TXN_ABORT;
  476. notused3 = NULL;
  477. if ((ret = __txn_child_read(dbenv, dbtp->data, &argp)) != 0)
  478. return (ret);
  479. (void)printf(
  480.     "[%lu][%lu]__txn_child: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  481.     (u_long)lsnp->file,
  482.     (u_long)lsnp->offset,
  483.     (u_long)argp->type,
  484.     (u_long)argp->txnid->txnid,
  485.     (u_long)argp->prev_lsn.file,
  486.     (u_long)argp->prev_lsn.offset);
  487. (void)printf("tchild: 0x%lxn", (u_long)argp->child);
  488. (void)printf("tc_lsn: [%lu][%lu]n",
  489.     (u_long)argp->c_lsn.file, (u_long)argp->c_lsn.offset);
  490. (void)printf("n");
  491. __os_free(dbenv, argp);
  492. return (0);
  493. }
  494. /*
  495.  * PUBLIC: int __txn_child_read __P((DB_ENV *, void *, __txn_child_args **));
  496.  */
  497. int
  498. __txn_child_read(dbenv, recbuf, argpp)
  499. DB_ENV *dbenv;
  500. void *recbuf;
  501. __txn_child_args **argpp;
  502. {
  503. __txn_child_args *argp;
  504. u_int32_t uinttmp;
  505. u_int8_t *bp;
  506. int ret;
  507. if ((ret = __os_malloc(dbenv,
  508.     sizeof(__txn_child_args) + sizeof(DB_TXN), &argp)) != 0)
  509. return (ret);
  510. argp->txnid = (DB_TXN *)&argp[1];
  511. bp = recbuf;
  512. memcpy(&argp->type, bp, sizeof(argp->type));
  513. bp += sizeof(argp->type);
  514. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  515. bp += sizeof(argp->txnid->txnid);
  516. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  517. bp += sizeof(DB_LSN);
  518. memcpy(&uinttmp, bp, sizeof(uinttmp));
  519. argp->child = (u_int32_t)uinttmp;
  520. bp += sizeof(uinttmp);
  521. memcpy(&argp->c_lsn, bp,  sizeof(argp->c_lsn));
  522. bp += sizeof(argp->c_lsn);
  523. *argpp = argp;
  524. return (0);
  525. }
  526. /*
  527.  * PUBLIC: int __txn_xa_regop_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  528.  * PUBLIC:     u_int32_t, u_int32_t, const DBT *, int32_t, u_int32_t, u_int32_t,
  529.  * PUBLIC:     DB_LSN *));
  530.  */
  531. int
  532. __txn_xa_regop_log(dbenv, txnid, ret_lsnp, flags,
  533.     opcode, xid, formatID, gtrid, bqual, begin_lsn)
  534. DB_ENV *dbenv;
  535. DB_TXN *txnid;
  536. DB_LSN *ret_lsnp;
  537. u_int32_t flags;
  538. u_int32_t opcode;
  539. const DBT *xid;
  540. int32_t formatID;
  541. u_int32_t gtrid;
  542. u_int32_t bqual;
  543. DB_LSN * begin_lsn;
  544. {
  545. DBT logrec;
  546. DB_LSN *lsnp, null_lsn;
  547. u_int32_t zero;
  548. u_int32_t uinttmp;
  549. u_int32_t npad, rectype, txn_num;
  550. int ret;
  551. u_int8_t *bp;
  552. rectype = DB___txn_xa_regop;
  553. npad = 0;
  554. if (txnid == NULL) {
  555. txn_num = 0;
  556. null_lsn.file = 0;
  557. null_lsn.offset = 0;
  558. lsnp = &null_lsn;
  559. } else {
  560. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  561.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  562. return (ret);
  563. txn_num = txnid->txnid;
  564. lsnp = &txnid->last_lsn;
  565. }
  566. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  567.     + sizeof(u_int32_t)
  568.     + sizeof(u_int32_t) + (xid == NULL ? 0 : xid->size)
  569.     + sizeof(u_int32_t)
  570.     + sizeof(u_int32_t)
  571.     + sizeof(u_int32_t)
  572.     + sizeof(*begin_lsn);
  573. if (CRYPTO_ON(dbenv)) {
  574. npad =
  575.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  576. logrec.size += npad;
  577. }
  578. if ((ret = __os_malloc(dbenv,
  579.     logrec.size, &logrec.data)) != 0)
  580. return (ret);
  581. if (npad > 0)
  582. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  583. bp = logrec.data;
  584. memcpy(bp, &rectype, sizeof(rectype));
  585. bp += sizeof(rectype);
  586. memcpy(bp, &txn_num, sizeof(txn_num));
  587. bp += sizeof(txn_num);
  588. memcpy(bp, lsnp, sizeof(DB_LSN));
  589. bp += sizeof(DB_LSN);
  590. uinttmp = (u_int32_t)opcode;
  591. memcpy(bp, &uinttmp, sizeof(uinttmp));
  592. bp += sizeof(uinttmp);
  593. if (xid == NULL) {
  594. zero = 0;
  595. memcpy(bp, &zero, sizeof(u_int32_t));
  596. bp += sizeof(u_int32_t);
  597. } else {
  598. memcpy(bp, &xid->size, sizeof(xid->size));
  599. bp += sizeof(xid->size);
  600. memcpy(bp, xid->data, xid->size);
  601. bp += xid->size;
  602. }
  603. uinttmp = (u_int32_t)formatID;
  604. memcpy(bp, &uinttmp, sizeof(uinttmp));
  605. bp += sizeof(uinttmp);
  606. uinttmp = (u_int32_t)gtrid;
  607. memcpy(bp, &uinttmp, sizeof(uinttmp));
  608. bp += sizeof(uinttmp);
  609. uinttmp = (u_int32_t)bqual;
  610. memcpy(bp, &uinttmp, sizeof(uinttmp));
  611. bp += sizeof(uinttmp);
  612. if (begin_lsn != NULL)
  613. memcpy(bp, begin_lsn, sizeof(*begin_lsn));
  614. else
  615. memset(bp, 0, sizeof(*begin_lsn));
  616. bp += sizeof(*begin_lsn);
  617. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  618. ret = dbenv->log_put(dbenv,
  619.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  620. if (txnid != NULL && ret == 0)
  621. txnid->last_lsn = *ret_lsnp;
  622. #ifdef LOG_DIAGNOSTIC
  623. if (ret != 0)
  624. (void)__txn_xa_regop_print(dbenv,
  625.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  626. #endif
  627. __os_free(dbenv, logrec.data);
  628. return (ret);
  629. }
  630. /*
  631.  * PUBLIC: int __txn_xa_regop_getpgnos __P((DB_ENV *, DBT *,
  632.  * PUBLIC:     DB_LSN *, db_recops, void *));
  633.  */
  634. int
  635. __txn_xa_regop_getpgnos(dbenv, rec, lsnp, notused1, summary)
  636. DB_ENV *dbenv;
  637. DBT *rec;
  638. DB_LSN *lsnp;
  639. db_recops notused1;
  640. void *summary;
  641. {
  642. TXN_RECS *t;
  643. int ret;
  644. COMPQUIET(rec, NULL);
  645. COMPQUIET(notused1, DB_TXN_ABORT);
  646. t = (TXN_RECS *)summary;
  647. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  648. return (ret);
  649. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  650. t->array[t->npages].lsn = *lsnp;
  651. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  652. memset(&t->array[t->npages].pgdesc, 0,
  653.     sizeof(t->array[t->npages].pgdesc));
  654. t->npages++;
  655. return (0);
  656. }
  657. /*
  658.  * PUBLIC: int __txn_xa_regop_print __P((DB_ENV *, DBT *, DB_LSN *,
  659.  * PUBLIC:     db_recops, void *));
  660.  */
  661. int
  662. __txn_xa_regop_print(dbenv, dbtp, lsnp, notused2, notused3)
  663. DB_ENV *dbenv;
  664. DBT *dbtp;
  665. DB_LSN *lsnp;
  666. db_recops notused2;
  667. void *notused3;
  668. {
  669. __txn_xa_regop_args *argp;
  670. u_int32_t i;
  671. int ch;
  672. int ret;
  673. notused2 = DB_TXN_ABORT;
  674. notused3 = NULL;
  675. if ((ret = __txn_xa_regop_read(dbenv, dbtp->data, &argp)) != 0)
  676. return (ret);
  677. (void)printf(
  678.     "[%lu][%lu]__txn_xa_regop: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  679.     (u_long)lsnp->file,
  680.     (u_long)lsnp->offset,
  681.     (u_long)argp->type,
  682.     (u_long)argp->txnid->txnid,
  683.     (u_long)argp->prev_lsn.file,
  684.     (u_long)argp->prev_lsn.offset);
  685. (void)printf("topcode: %lun", (u_long)argp->opcode);
  686. (void)printf("txid: ");
  687. for (i = 0; i < argp->xid.size; i++) {
  688. ch = ((u_int8_t *)argp->xid.data)[i];
  689. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  690. }
  691. (void)printf("n");
  692. (void)printf("tformatID: %ldn", (long)argp->formatID);
  693. (void)printf("tgtrid: %un", argp->gtrid);
  694. (void)printf("tbqual: %un", argp->bqual);
  695. (void)printf("tbegin_lsn: [%lu][%lu]n",
  696.     (u_long)argp->begin_lsn.file, (u_long)argp->begin_lsn.offset);
  697. (void)printf("n");
  698. __os_free(dbenv, argp);
  699. return (0);
  700. }
  701. /*
  702.  * PUBLIC: int __txn_xa_regop_read __P((DB_ENV *, void *,
  703.  * PUBLIC:     __txn_xa_regop_args **));
  704.  */
  705. int
  706. __txn_xa_regop_read(dbenv, recbuf, argpp)
  707. DB_ENV *dbenv;
  708. void *recbuf;
  709. __txn_xa_regop_args **argpp;
  710. {
  711. __txn_xa_regop_args *argp;
  712. u_int32_t uinttmp;
  713. u_int8_t *bp;
  714. int ret;
  715. if ((ret = __os_malloc(dbenv,
  716.     sizeof(__txn_xa_regop_args) + sizeof(DB_TXN), &argp)) != 0)
  717. return (ret);
  718. argp->txnid = (DB_TXN *)&argp[1];
  719. bp = recbuf;
  720. memcpy(&argp->type, bp, sizeof(argp->type));
  721. bp += sizeof(argp->type);
  722. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  723. bp += sizeof(argp->txnid->txnid);
  724. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  725. bp += sizeof(DB_LSN);
  726. memcpy(&uinttmp, bp, sizeof(uinttmp));
  727. argp->opcode = (u_int32_t)uinttmp;
  728. bp += sizeof(uinttmp);
  729. memset(&argp->xid, 0, sizeof(argp->xid));
  730. memcpy(&argp->xid.size, bp, sizeof(u_int32_t));
  731. bp += sizeof(u_int32_t);
  732. argp->xid.data = bp;
  733. bp += argp->xid.size;
  734. memcpy(&uinttmp, bp, sizeof(uinttmp));
  735. argp->formatID = (int32_t)uinttmp;
  736. bp += sizeof(uinttmp);
  737. memcpy(&uinttmp, bp, sizeof(uinttmp));
  738. argp->gtrid = (u_int32_t)uinttmp;
  739. bp += sizeof(uinttmp);
  740. memcpy(&uinttmp, bp, sizeof(uinttmp));
  741. argp->bqual = (u_int32_t)uinttmp;
  742. bp += sizeof(uinttmp);
  743. memcpy(&argp->begin_lsn, bp,  sizeof(argp->begin_lsn));
  744. bp += sizeof(argp->begin_lsn);
  745. *argpp = argp;
  746. return (0);
  747. }
  748. /*
  749.  * PUBLIC: int __txn_recycle_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  750.  * PUBLIC:     u_int32_t, u_int32_t, u_int32_t));
  751.  */
  752. int
  753. __txn_recycle_log(dbenv, txnid, ret_lsnp, flags,
  754.     min, max)
  755. DB_ENV *dbenv;
  756. DB_TXN *txnid;
  757. DB_LSN *ret_lsnp;
  758. u_int32_t flags;
  759. u_int32_t min;
  760. u_int32_t max;
  761. {
  762. DBT logrec;
  763. DB_LSN *lsnp, null_lsn;
  764. u_int32_t uinttmp;
  765. u_int32_t npad, rectype, txn_num;
  766. int ret;
  767. u_int8_t *bp;
  768. rectype = DB___txn_recycle;
  769. npad = 0;
  770. if (txnid == NULL) {
  771. txn_num = 0;
  772. null_lsn.file = 0;
  773. null_lsn.offset = 0;
  774. lsnp = &null_lsn;
  775. } else {
  776. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  777.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  778. return (ret);
  779. txn_num = txnid->txnid;
  780. lsnp = &txnid->last_lsn;
  781. }
  782. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  783.     + sizeof(u_int32_t)
  784.     + sizeof(u_int32_t);
  785. if (CRYPTO_ON(dbenv)) {
  786. npad =
  787.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  788. logrec.size += npad;
  789. }
  790. if ((ret = __os_malloc(dbenv,
  791.     logrec.size, &logrec.data)) != 0)
  792. return (ret);
  793. if (npad > 0)
  794. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  795. bp = logrec.data;
  796. memcpy(bp, &rectype, sizeof(rectype));
  797. bp += sizeof(rectype);
  798. memcpy(bp, &txn_num, sizeof(txn_num));
  799. bp += sizeof(txn_num);
  800. memcpy(bp, lsnp, sizeof(DB_LSN));
  801. bp += sizeof(DB_LSN);
  802. uinttmp = (u_int32_t)min;
  803. memcpy(bp, &uinttmp, sizeof(uinttmp));
  804. bp += sizeof(uinttmp);
  805. uinttmp = (u_int32_t)max;
  806. memcpy(bp, &uinttmp, sizeof(uinttmp));
  807. bp += sizeof(uinttmp);
  808. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  809. ret = dbenv->log_put(dbenv,
  810.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  811. if (txnid != NULL && ret == 0)
  812. txnid->last_lsn = *ret_lsnp;
  813. #ifdef LOG_DIAGNOSTIC
  814. if (ret != 0)
  815. (void)__txn_recycle_print(dbenv,
  816.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  817. #endif
  818. __os_free(dbenv, logrec.data);
  819. return (ret);
  820. }
  821. /*
  822.  * PUBLIC: int __txn_recycle_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  823.  * PUBLIC:     db_recops, void *));
  824.  */
  825. int
  826. __txn_recycle_getpgnos(dbenv, rec, lsnp, notused1, summary)
  827. DB_ENV *dbenv;
  828. DBT *rec;
  829. DB_LSN *lsnp;
  830. db_recops notused1;
  831. void *summary;
  832. {
  833. TXN_RECS *t;
  834. int ret;
  835. COMPQUIET(rec, NULL);
  836. COMPQUIET(notused1, DB_TXN_ABORT);
  837. t = (TXN_RECS *)summary;
  838. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  839. return (ret);
  840. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  841. t->array[t->npages].lsn = *lsnp;
  842. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  843. memset(&t->array[t->npages].pgdesc, 0,
  844.     sizeof(t->array[t->npages].pgdesc));
  845. t->npages++;
  846. return (0);
  847. }
  848. /*
  849.  * PUBLIC: int __txn_recycle_print __P((DB_ENV *, DBT *, DB_LSN *,
  850.  * PUBLIC:     db_recops, void *));
  851.  */
  852. int
  853. __txn_recycle_print(dbenv, dbtp, lsnp, notused2, notused3)
  854. DB_ENV *dbenv;
  855. DBT *dbtp;
  856. DB_LSN *lsnp;
  857. db_recops notused2;
  858. void *notused3;
  859. {
  860. __txn_recycle_args *argp;
  861. int ret;
  862. notused2 = DB_TXN_ABORT;
  863. notused3 = NULL;
  864. if ((ret = __txn_recycle_read(dbenv, dbtp->data, &argp)) != 0)
  865. return (ret);
  866. (void)printf(
  867.     "[%lu][%lu]__txn_recycle: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  868.     (u_long)lsnp->file,
  869.     (u_long)lsnp->offset,
  870.     (u_long)argp->type,
  871.     (u_long)argp->txnid->txnid,
  872.     (u_long)argp->prev_lsn.file,
  873.     (u_long)argp->prev_lsn.offset);
  874. (void)printf("tmin: %un", argp->min);
  875. (void)printf("tmax: %un", argp->max);
  876. (void)printf("n");
  877. __os_free(dbenv, argp);
  878. return (0);
  879. }
  880. /*
  881.  * PUBLIC: int __txn_recycle_read __P((DB_ENV *, void *,
  882.  * PUBLIC:     __txn_recycle_args **));
  883.  */
  884. int
  885. __txn_recycle_read(dbenv, recbuf, argpp)
  886. DB_ENV *dbenv;
  887. void *recbuf;
  888. __txn_recycle_args **argpp;
  889. {
  890. __txn_recycle_args *argp;
  891. u_int32_t uinttmp;
  892. u_int8_t *bp;
  893. int ret;
  894. if ((ret = __os_malloc(dbenv,
  895.     sizeof(__txn_recycle_args) + sizeof(DB_TXN), &argp)) != 0)
  896. return (ret);
  897. argp->txnid = (DB_TXN *)&argp[1];
  898. bp = recbuf;
  899. memcpy(&argp->type, bp, sizeof(argp->type));
  900. bp += sizeof(argp->type);
  901. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  902. bp += sizeof(argp->txnid->txnid);
  903. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  904. bp += sizeof(DB_LSN);
  905. memcpy(&uinttmp, bp, sizeof(uinttmp));
  906. argp->min = (u_int32_t)uinttmp;
  907. bp += sizeof(uinttmp);
  908. memcpy(&uinttmp, bp, sizeof(uinttmp));
  909. argp->max = (u_int32_t)uinttmp;
  910. bp += sizeof(uinttmp);
  911. *argpp = argp;
  912. return (0);
  913. }
  914. /*
  915.  * PUBLIC: int __txn_init_print __P((DB_ENV *, int (***)(DB_ENV *,
  916.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  917.  */
  918. int
  919. __txn_init_print(dbenv, dtabp, dtabsizep)
  920. DB_ENV *dbenv;
  921. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  922. size_t *dtabsizep;
  923. {
  924. int ret;
  925. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  926.     __txn_regop_print, DB___txn_regop)) != 0)
  927. return (ret);
  928. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  929.     __txn_ckp_print, DB___txn_ckp)) != 0)
  930. return (ret);
  931. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  932.     __txn_child_print, DB___txn_child)) != 0)
  933. return (ret);
  934. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  935.     __txn_xa_regop_print, DB___txn_xa_regop)) != 0)
  936. return (ret);
  937. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  938.     __txn_recycle_print, DB___txn_recycle)) != 0)
  939. return (ret);
  940. return (0);
  941. }
  942. /*
  943.  * PUBLIC: int __txn_init_getpgnos __P((DB_ENV *, int (***)(DB_ENV *,
  944.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  945.  */
  946. int
  947. __txn_init_getpgnos(dbenv, dtabp, dtabsizep)
  948. DB_ENV *dbenv;
  949. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  950. size_t *dtabsizep;
  951. {
  952. int ret;
  953. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  954.     __txn_regop_getpgnos, DB___txn_regop)) != 0)
  955. return (ret);
  956. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  957.     __txn_ckp_getpgnos, DB___txn_ckp)) != 0)
  958. return (ret);
  959. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  960.     __txn_child_getpgnos, DB___txn_child)) != 0)
  961. return (ret);
  962. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  963.     __txn_xa_regop_getpgnos, DB___txn_xa_regop)) != 0)
  964. return (ret);
  965. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  966.     __txn_recycle_getpgnos, DB___txn_recycle)) != 0)
  967. return (ret);
  968. return (0);
  969. }
  970. /*
  971.  * PUBLIC: int __txn_init_recover __P((DB_ENV *, int (***)(DB_ENV *,
  972.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  973.  */
  974. int
  975. __txn_init_recover(dbenv, dtabp, dtabsizep)
  976. DB_ENV *dbenv;
  977. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  978. size_t *dtabsizep;
  979. {
  980. int ret;
  981. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  982.     __txn_regop_recover, DB___txn_regop)) != 0)
  983. return (ret);
  984. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  985.     __txn_ckp_recover, DB___txn_ckp)) != 0)
  986. return (ret);
  987. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  988.     __txn_child_recover, DB___txn_child)) != 0)
  989. return (ret);
  990. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  991.     __txn_xa_regop_recover, DB___txn_xa_regop)) != 0)
  992. return (ret);
  993. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  994.     __txn_recycle_recover, DB___txn_recycle)) != 0)
  995. return (ret);
  996. return (0);
  997. }