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

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/qam.h"
  15. #include "dbinc/rep.h"
  16. #include "dbinc/txn.h"
  17. /*
  18.  * PUBLIC: int __qam_incfirst_log __P((DB *, DB_TXN *, DB_LSN *,
  19.  * PUBLIC:     u_int32_t, db_recno_t, db_pgno_t));
  20.  */
  21. int
  22. __qam_incfirst_log(dbp, txnid, ret_lsnp, flags, recno, meta_pgno)
  23. DB *dbp;
  24. DB_TXN *txnid;
  25. DB_LSN *ret_lsnp;
  26. u_int32_t flags;
  27. db_recno_t recno;
  28. db_pgno_t meta_pgno;
  29. {
  30. DBT logrec;
  31. DB_ENV *dbenv;
  32. DB_LSN *lsnp, null_lsn;
  33. u_int32_t uinttmp;
  34. u_int32_t npad, rectype, txn_num;
  35. int ret;
  36. u_int8_t *bp;
  37. dbenv = dbp->dbenv;
  38. rectype = DB___qam_incfirst;
  39. npad = 0;
  40. if (txnid == NULL) {
  41. txn_num = 0;
  42. null_lsn.file = 0;
  43. null_lsn.offset = 0;
  44. lsnp = &null_lsn;
  45. } else {
  46. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  47.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  48. return (ret);
  49. txn_num = txnid->txnid;
  50. lsnp = &txnid->last_lsn;
  51. }
  52. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  53.     + sizeof(u_int32_t)
  54.     + sizeof(u_int32_t)
  55.     + sizeof(u_int32_t);
  56. if (CRYPTO_ON(dbenv)) {
  57. npad =
  58.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  59. logrec.size += npad;
  60. }
  61. if ((ret = __os_malloc(dbenv,
  62.     logrec.size, &logrec.data)) != 0)
  63. return (ret);
  64. if (npad > 0)
  65. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  66. bp = logrec.data;
  67. memcpy(bp, &rectype, sizeof(rectype));
  68. bp += sizeof(rectype);
  69. memcpy(bp, &txn_num, sizeof(txn_num));
  70. bp += sizeof(txn_num);
  71. memcpy(bp, lsnp, sizeof(DB_LSN));
  72. bp += sizeof(DB_LSN);
  73. DB_ASSERT(dbp->log_filename != NULL);
  74. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  75.     (ret = __dbreg_lazy_id(dbp)) != 0)
  76. return (ret);
  77. uinttmp = (u_int32_t)dbp->log_filename->id;
  78. memcpy(bp, &uinttmp, sizeof(uinttmp));
  79. bp += sizeof(uinttmp);
  80. uinttmp = (u_int32_t)recno;
  81. memcpy(bp, &uinttmp, sizeof(uinttmp));
  82. bp += sizeof(uinttmp);
  83. uinttmp = (u_int32_t)meta_pgno;
  84. memcpy(bp, &uinttmp, sizeof(uinttmp));
  85. bp += sizeof(uinttmp);
  86. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  87. ret = dbenv->log_put(dbenv,
  88.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  89. if (txnid != NULL && ret == 0)
  90. txnid->last_lsn = *ret_lsnp;
  91. #ifdef LOG_DIAGNOSTIC
  92. if (ret != 0)
  93. (void)__qam_incfirst_print(dbenv,
  94.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  95. #endif
  96. __os_free(dbenv, logrec.data);
  97. return (ret);
  98. }
  99. /*
  100.  * PUBLIC: int __qam_incfirst_getpgnos __P((DB_ENV *, DBT *,
  101.  * PUBLIC:     DB_LSN *, db_recops, void *));
  102.  */
  103. int
  104. __qam_incfirst_getpgnos(dbenv, rec, lsnp, notused1, summary)
  105. DB_ENV *dbenv;
  106. DBT *rec;
  107. DB_LSN *lsnp;
  108. db_recops notused1;
  109. void *summary;
  110. {
  111. DB *dbp;
  112. TXN_RECS *t;
  113. __qam_incfirst_args *argp;
  114. u_int32_t ret;
  115. COMPQUIET(notused1, DB_TXN_ABORT);
  116. argp = NULL;
  117. t = (TXN_RECS *)summary;
  118. if ((ret = __qam_incfirst_read(dbenv, rec->data, &argp)) != 0)
  119. return (ret);
  120. if ((ret = __dbreg_id_to_db(dbenv,
  121.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  122. goto err;
  123. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  124. goto err;
  125. t->array[t->npages].flags = 0;
  126. t->array[t->npages].fid = argp->fileid;
  127. t->array[t->npages].lsn = *lsnp;
  128. t->array[t->npages].pgdesc.pgno = argp->meta_pgno;
  129. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  130. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  131.     DB_FILE_ID_LEN);
  132. t->npages++;
  133. err: if (argp != NULL)
  134. __os_free(dbenv, argp);
  135. return (ret);
  136. }
  137. /*
  138.  * PUBLIC: int __qam_incfirst_print __P((DB_ENV *, DBT *, DB_LSN *,
  139.  * PUBLIC:     db_recops, void *));
  140.  */
  141. int
  142. __qam_incfirst_print(dbenv, dbtp, lsnp, notused2, notused3)
  143. DB_ENV *dbenv;
  144. DBT *dbtp;
  145. DB_LSN *lsnp;
  146. db_recops notused2;
  147. void *notused3;
  148. {
  149. __qam_incfirst_args *argp;
  150. int ret;
  151. notused2 = DB_TXN_ABORT;
  152. notused3 = NULL;
  153. if ((ret = __qam_incfirst_read(dbenv, dbtp->data, &argp)) != 0)
  154. return (ret);
  155. (void)printf(
  156.     "[%lu][%lu]__qam_incfirst: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  157.     (u_long)lsnp->file,
  158.     (u_long)lsnp->offset,
  159.     (u_long)argp->type,
  160.     (u_long)argp->txnid->txnid,
  161.     (u_long)argp->prev_lsn.file,
  162.     (u_long)argp->prev_lsn.offset);
  163. (void)printf("tfileid: %ldn", (long)argp->fileid);
  164. (void)printf("trecno: %lun", (u_long)argp->recno);
  165. (void)printf("tmeta_pgno: %lun", (u_long)argp->meta_pgno);
  166. (void)printf("n");
  167. __os_free(dbenv, argp);
  168. return (0);
  169. }
  170. /*
  171.  * PUBLIC: int __qam_incfirst_read __P((DB_ENV *, void *,
  172.  * PUBLIC:     __qam_incfirst_args **));
  173.  */
  174. int
  175. __qam_incfirst_read(dbenv, recbuf, argpp)
  176. DB_ENV *dbenv;
  177. void *recbuf;
  178. __qam_incfirst_args **argpp;
  179. {
  180. __qam_incfirst_args *argp;
  181. u_int32_t uinttmp;
  182. u_int8_t *bp;
  183. int ret;
  184. if ((ret = __os_malloc(dbenv,
  185.     sizeof(__qam_incfirst_args) + sizeof(DB_TXN), &argp)) != 0)
  186. return (ret);
  187. argp->txnid = (DB_TXN *)&argp[1];
  188. bp = recbuf;
  189. memcpy(&argp->type, bp, sizeof(argp->type));
  190. bp += sizeof(argp->type);
  191. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  192. bp += sizeof(argp->txnid->txnid);
  193. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  194. bp += sizeof(DB_LSN);
  195. memcpy(&uinttmp, bp, sizeof(uinttmp));
  196. argp->fileid = (int32_t)uinttmp;
  197. bp += sizeof(uinttmp);
  198. memcpy(&uinttmp, bp, sizeof(uinttmp));
  199. argp->recno = (db_recno_t)uinttmp;
  200. bp += sizeof(uinttmp);
  201. memcpy(&uinttmp, bp, sizeof(uinttmp));
  202. argp->meta_pgno = (db_pgno_t)uinttmp;
  203. bp += sizeof(uinttmp);
  204. *argpp = argp;
  205. return (0);
  206. }
  207. /*
  208.  * PUBLIC: int __qam_mvptr_log __P((DB *, DB_TXN *, DB_LSN *,
  209.  * PUBLIC:     u_int32_t, u_int32_t, db_recno_t, db_recno_t, db_recno_t,
  210.  * PUBLIC:     db_recno_t, DB_LSN *, db_pgno_t));
  211.  */
  212. int
  213. __qam_mvptr_log(dbp, txnid, ret_lsnp, flags,
  214.     opcode, old_first, new_first, old_cur, new_cur,
  215.     metalsn, meta_pgno)
  216. DB *dbp;
  217. DB_TXN *txnid;
  218. DB_LSN *ret_lsnp;
  219. u_int32_t flags;
  220. u_int32_t opcode;
  221. db_recno_t old_first;
  222. db_recno_t new_first;
  223. db_recno_t old_cur;
  224. db_recno_t new_cur;
  225. DB_LSN * metalsn;
  226. db_pgno_t meta_pgno;
  227. {
  228. DBT logrec;
  229. DB_ENV *dbenv;
  230. DB_LSN *lsnp, null_lsn;
  231. u_int32_t uinttmp;
  232. u_int32_t npad, rectype, txn_num;
  233. int ret;
  234. u_int8_t *bp;
  235. dbenv = dbp->dbenv;
  236. rectype = DB___qam_mvptr;
  237. npad = 0;
  238. if (txnid == NULL) {
  239. txn_num = 0;
  240. null_lsn.file = 0;
  241. null_lsn.offset = 0;
  242. lsnp = &null_lsn;
  243. } else {
  244. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  245.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  246. return (ret);
  247. txn_num = txnid->txnid;
  248. lsnp = &txnid->last_lsn;
  249. }
  250. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  251.     + sizeof(u_int32_t)
  252.     + sizeof(u_int32_t)
  253.     + sizeof(u_int32_t)
  254.     + sizeof(u_int32_t)
  255.     + sizeof(u_int32_t)
  256.     + sizeof(u_int32_t)
  257.     + sizeof(*metalsn)
  258.     + sizeof(u_int32_t);
  259. if (CRYPTO_ON(dbenv)) {
  260. npad =
  261.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  262. logrec.size += npad;
  263. }
  264. if ((ret = __os_malloc(dbenv,
  265.     logrec.size, &logrec.data)) != 0)
  266. return (ret);
  267. if (npad > 0)
  268. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  269. bp = logrec.data;
  270. memcpy(bp, &rectype, sizeof(rectype));
  271. bp += sizeof(rectype);
  272. memcpy(bp, &txn_num, sizeof(txn_num));
  273. bp += sizeof(txn_num);
  274. memcpy(bp, lsnp, sizeof(DB_LSN));
  275. bp += sizeof(DB_LSN);
  276. uinttmp = (u_int32_t)opcode;
  277. memcpy(bp, &uinttmp, sizeof(uinttmp));
  278. bp += sizeof(uinttmp);
  279. DB_ASSERT(dbp->log_filename != NULL);
  280. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  281.     (ret = __dbreg_lazy_id(dbp)) != 0)
  282. return (ret);
  283. uinttmp = (u_int32_t)dbp->log_filename->id;
  284. memcpy(bp, &uinttmp, sizeof(uinttmp));
  285. bp += sizeof(uinttmp);
  286. uinttmp = (u_int32_t)old_first;
  287. memcpy(bp, &uinttmp, sizeof(uinttmp));
  288. bp += sizeof(uinttmp);
  289. uinttmp = (u_int32_t)new_first;
  290. memcpy(bp, &uinttmp, sizeof(uinttmp));
  291. bp += sizeof(uinttmp);
  292. uinttmp = (u_int32_t)old_cur;
  293. memcpy(bp, &uinttmp, sizeof(uinttmp));
  294. bp += sizeof(uinttmp);
  295. uinttmp = (u_int32_t)new_cur;
  296. memcpy(bp, &uinttmp, sizeof(uinttmp));
  297. bp += sizeof(uinttmp);
  298. if (metalsn != NULL)
  299. memcpy(bp, metalsn, sizeof(*metalsn));
  300. else
  301. memset(bp, 0, sizeof(*metalsn));
  302. bp += sizeof(*metalsn);
  303. uinttmp = (u_int32_t)meta_pgno;
  304. memcpy(bp, &uinttmp, sizeof(uinttmp));
  305. bp += sizeof(uinttmp);
  306. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  307. ret = dbenv->log_put(dbenv,
  308.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  309. if (txnid != NULL && ret == 0)
  310. txnid->last_lsn = *ret_lsnp;
  311. #ifdef LOG_DIAGNOSTIC
  312. if (ret != 0)
  313. (void)__qam_mvptr_print(dbenv,
  314.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  315. #endif
  316. __os_free(dbenv, logrec.data);
  317. return (ret);
  318. }
  319. /*
  320.  * PUBLIC: int __qam_mvptr_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  321.  * PUBLIC:     db_recops, void *));
  322.  */
  323. int
  324. __qam_mvptr_getpgnos(dbenv, rec, lsnp, notused1, summary)
  325. DB_ENV *dbenv;
  326. DBT *rec;
  327. DB_LSN *lsnp;
  328. db_recops notused1;
  329. void *summary;
  330. {
  331. DB *dbp;
  332. TXN_RECS *t;
  333. __qam_mvptr_args *argp;
  334. u_int32_t ret;
  335. COMPQUIET(notused1, DB_TXN_ABORT);
  336. argp = NULL;
  337. t = (TXN_RECS *)summary;
  338. if ((ret = __qam_mvptr_read(dbenv, rec->data, &argp)) != 0)
  339. return (ret);
  340. if ((ret = __dbreg_id_to_db(dbenv,
  341.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  342. goto err;
  343. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  344. goto err;
  345. t->array[t->npages].flags = 0;
  346. t->array[t->npages].fid = argp->fileid;
  347. t->array[t->npages].lsn = *lsnp;
  348. t->array[t->npages].pgdesc.pgno = argp->meta_pgno;
  349. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  350. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  351.     DB_FILE_ID_LEN);
  352. t->npages++;
  353. err: if (argp != NULL)
  354. __os_free(dbenv, argp);
  355. return (ret);
  356. }
  357. /*
  358.  * PUBLIC: int __qam_mvptr_print __P((DB_ENV *, DBT *, DB_LSN *,
  359.  * PUBLIC:     db_recops, void *));
  360.  */
  361. int
  362. __qam_mvptr_print(dbenv, dbtp, lsnp, notused2, notused3)
  363. DB_ENV *dbenv;
  364. DBT *dbtp;
  365. DB_LSN *lsnp;
  366. db_recops notused2;
  367. void *notused3;
  368. {
  369. __qam_mvptr_args *argp;
  370. int ret;
  371. notused2 = DB_TXN_ABORT;
  372. notused3 = NULL;
  373. if ((ret = __qam_mvptr_read(dbenv, dbtp->data, &argp)) != 0)
  374. return (ret);
  375. (void)printf(
  376.     "[%lu][%lu]__qam_mvptr: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  377.     (u_long)lsnp->file,
  378.     (u_long)lsnp->offset,
  379.     (u_long)argp->type,
  380.     (u_long)argp->txnid->txnid,
  381.     (u_long)argp->prev_lsn.file,
  382.     (u_long)argp->prev_lsn.offset);
  383. (void)printf("topcode: %lun", (u_long)argp->opcode);
  384. (void)printf("tfileid: %ldn", (long)argp->fileid);
  385. (void)printf("told_first: %lun", (u_long)argp->old_first);
  386. (void)printf("tnew_first: %lun", (u_long)argp->new_first);
  387. (void)printf("told_cur: %lun", (u_long)argp->old_cur);
  388. (void)printf("tnew_cur: %lun", (u_long)argp->new_cur);
  389. (void)printf("tmetalsn: [%lu][%lu]n",
  390.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  391. (void)printf("tmeta_pgno: %lun", (u_long)argp->meta_pgno);
  392. (void)printf("n");
  393. __os_free(dbenv, argp);
  394. return (0);
  395. }
  396. /*
  397.  * PUBLIC: int __qam_mvptr_read __P((DB_ENV *, void *, __qam_mvptr_args **));
  398.  */
  399. int
  400. __qam_mvptr_read(dbenv, recbuf, argpp)
  401. DB_ENV *dbenv;
  402. void *recbuf;
  403. __qam_mvptr_args **argpp;
  404. {
  405. __qam_mvptr_args *argp;
  406. u_int32_t uinttmp;
  407. u_int8_t *bp;
  408. int ret;
  409. if ((ret = __os_malloc(dbenv,
  410.     sizeof(__qam_mvptr_args) + sizeof(DB_TXN), &argp)) != 0)
  411. return (ret);
  412. argp->txnid = (DB_TXN *)&argp[1];
  413. bp = recbuf;
  414. memcpy(&argp->type, bp, sizeof(argp->type));
  415. bp += sizeof(argp->type);
  416. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  417. bp += sizeof(argp->txnid->txnid);
  418. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  419. bp += sizeof(DB_LSN);
  420. memcpy(&uinttmp, bp, sizeof(uinttmp));
  421. argp->opcode = (u_int32_t)uinttmp;
  422. bp += sizeof(uinttmp);
  423. memcpy(&uinttmp, bp, sizeof(uinttmp));
  424. argp->fileid = (int32_t)uinttmp;
  425. bp += sizeof(uinttmp);
  426. memcpy(&uinttmp, bp, sizeof(uinttmp));
  427. argp->old_first = (db_recno_t)uinttmp;
  428. bp += sizeof(uinttmp);
  429. memcpy(&uinttmp, bp, sizeof(uinttmp));
  430. argp->new_first = (db_recno_t)uinttmp;
  431. bp += sizeof(uinttmp);
  432. memcpy(&uinttmp, bp, sizeof(uinttmp));
  433. argp->old_cur = (db_recno_t)uinttmp;
  434. bp += sizeof(uinttmp);
  435. memcpy(&uinttmp, bp, sizeof(uinttmp));
  436. argp->new_cur = (db_recno_t)uinttmp;
  437. bp += sizeof(uinttmp);
  438. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  439. bp += sizeof(argp->metalsn);
  440. memcpy(&uinttmp, bp, sizeof(uinttmp));
  441. argp->meta_pgno = (db_pgno_t)uinttmp;
  442. bp += sizeof(uinttmp);
  443. *argpp = argp;
  444. return (0);
  445. }
  446. /*
  447.  * PUBLIC: int __qam_del_log __P((DB *, DB_TXN *, DB_LSN *,
  448.  * PUBLIC:     u_int32_t, DB_LSN *, db_pgno_t, u_int32_t, db_recno_t));
  449.  */
  450. int
  451. __qam_del_log(dbp, txnid, ret_lsnp, flags, lsn, pgno, indx, recno)
  452. DB *dbp;
  453. DB_TXN *txnid;
  454. DB_LSN *ret_lsnp;
  455. u_int32_t flags;
  456. DB_LSN * lsn;
  457. db_pgno_t pgno;
  458. u_int32_t indx;
  459. db_recno_t recno;
  460. {
  461. DBT logrec;
  462. DB_ENV *dbenv;
  463. DB_LSN *lsnp, null_lsn;
  464. u_int32_t uinttmp;
  465. u_int32_t npad, rectype, txn_num;
  466. int ret;
  467. u_int8_t *bp;
  468. dbenv = dbp->dbenv;
  469. rectype = DB___qam_del;
  470. npad = 0;
  471. if (txnid == NULL) {
  472. txn_num = 0;
  473. null_lsn.file = 0;
  474. null_lsn.offset = 0;
  475. lsnp = &null_lsn;
  476. } else {
  477. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  478.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  479. return (ret);
  480. txn_num = txnid->txnid;
  481. lsnp = &txnid->last_lsn;
  482. }
  483. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  484.     + sizeof(u_int32_t)
  485.     + sizeof(*lsn)
  486.     + sizeof(u_int32_t)
  487.     + sizeof(u_int32_t)
  488.     + sizeof(u_int32_t);
  489. if (CRYPTO_ON(dbenv)) {
  490. npad =
  491.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  492. logrec.size += npad;
  493. }
  494. if ((ret = __os_malloc(dbenv,
  495.     logrec.size, &logrec.data)) != 0)
  496. return (ret);
  497. if (npad > 0)
  498. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  499. bp = logrec.data;
  500. memcpy(bp, &rectype, sizeof(rectype));
  501. bp += sizeof(rectype);
  502. memcpy(bp, &txn_num, sizeof(txn_num));
  503. bp += sizeof(txn_num);
  504. memcpy(bp, lsnp, sizeof(DB_LSN));
  505. bp += sizeof(DB_LSN);
  506. DB_ASSERT(dbp->log_filename != NULL);
  507. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  508.     (ret = __dbreg_lazy_id(dbp)) != 0)
  509. return (ret);
  510. uinttmp = (u_int32_t)dbp->log_filename->id;
  511. memcpy(bp, &uinttmp, sizeof(uinttmp));
  512. bp += sizeof(uinttmp);
  513. if (lsn != NULL)
  514. memcpy(bp, lsn, sizeof(*lsn));
  515. else
  516. memset(bp, 0, sizeof(*lsn));
  517. bp += sizeof(*lsn);
  518. uinttmp = (u_int32_t)pgno;
  519. memcpy(bp, &uinttmp, sizeof(uinttmp));
  520. bp += sizeof(uinttmp);
  521. uinttmp = (u_int32_t)indx;
  522. memcpy(bp, &uinttmp, sizeof(uinttmp));
  523. bp += sizeof(uinttmp);
  524. uinttmp = (u_int32_t)recno;
  525. memcpy(bp, &uinttmp, sizeof(uinttmp));
  526. bp += sizeof(uinttmp);
  527. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  528. ret = dbenv->log_put(dbenv,
  529.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  530. if (txnid != NULL && ret == 0)
  531. txnid->last_lsn = *ret_lsnp;
  532. #ifdef LOG_DIAGNOSTIC
  533. if (ret != 0)
  534. (void)__qam_del_print(dbenv,
  535.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  536. #endif
  537. __os_free(dbenv, logrec.data);
  538. return (ret);
  539. }
  540. /*
  541.  * PUBLIC: int __qam_del_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  542.  * PUBLIC:     db_recops, void *));
  543.  */
  544. int
  545. __qam_del_getpgnos(dbenv, rec, lsnp, notused1, summary)
  546. DB_ENV *dbenv;
  547. DBT *rec;
  548. DB_LSN *lsnp;
  549. db_recops notused1;
  550. void *summary;
  551. {
  552. DB *dbp;
  553. TXN_RECS *t;
  554. __qam_del_args *argp;
  555. u_int32_t ret;
  556. COMPQUIET(notused1, DB_TXN_ABORT);
  557. argp = NULL;
  558. t = (TXN_RECS *)summary;
  559. if ((ret = __qam_del_read(dbenv, rec->data, &argp)) != 0)
  560. return (ret);
  561. if ((ret = __dbreg_id_to_db(dbenv,
  562.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  563. goto err;
  564. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  565. goto err;
  566. t->array[t->npages].flags = 0;
  567. t->array[t->npages].fid = argp->fileid;
  568. t->array[t->npages].lsn = *lsnp;
  569. t->array[t->npages].pgdesc.pgno = argp->pgno;
  570. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  571. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  572.     DB_FILE_ID_LEN);
  573. t->npages++;
  574. err: if (argp != NULL)
  575. __os_free(dbenv, argp);
  576. return (ret);
  577. }
  578. /*
  579.  * PUBLIC: int __qam_del_print __P((DB_ENV *, DBT *, DB_LSN *,
  580.  * PUBLIC:     db_recops, void *));
  581.  */
  582. int
  583. __qam_del_print(dbenv, dbtp, lsnp, notused2, notused3)
  584. DB_ENV *dbenv;
  585. DBT *dbtp;
  586. DB_LSN *lsnp;
  587. db_recops notused2;
  588. void *notused3;
  589. {
  590. __qam_del_args *argp;
  591. int ret;
  592. notused2 = DB_TXN_ABORT;
  593. notused3 = NULL;
  594. if ((ret = __qam_del_read(dbenv, dbtp->data, &argp)) != 0)
  595. return (ret);
  596. (void)printf(
  597.     "[%lu][%lu]__qam_del: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  598.     (u_long)lsnp->file,
  599.     (u_long)lsnp->offset,
  600.     (u_long)argp->type,
  601.     (u_long)argp->txnid->txnid,
  602.     (u_long)argp->prev_lsn.file,
  603.     (u_long)argp->prev_lsn.offset);
  604. (void)printf("tfileid: %ldn", (long)argp->fileid);
  605. (void)printf("tlsn: [%lu][%lu]n",
  606.     (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
  607. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  608. (void)printf("tindx: %lun", (u_long)argp->indx);
  609. (void)printf("trecno: %lun", (u_long)argp->recno);
  610. (void)printf("n");
  611. __os_free(dbenv, argp);
  612. return (0);
  613. }
  614. /*
  615.  * PUBLIC: int __qam_del_read __P((DB_ENV *, void *, __qam_del_args **));
  616.  */
  617. int
  618. __qam_del_read(dbenv, recbuf, argpp)
  619. DB_ENV *dbenv;
  620. void *recbuf;
  621. __qam_del_args **argpp;
  622. {
  623. __qam_del_args *argp;
  624. u_int32_t uinttmp;
  625. u_int8_t *bp;
  626. int ret;
  627. if ((ret = __os_malloc(dbenv,
  628.     sizeof(__qam_del_args) + sizeof(DB_TXN), &argp)) != 0)
  629. return (ret);
  630. argp->txnid = (DB_TXN *)&argp[1];
  631. bp = recbuf;
  632. memcpy(&argp->type, bp, sizeof(argp->type));
  633. bp += sizeof(argp->type);
  634. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  635. bp += sizeof(argp->txnid->txnid);
  636. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  637. bp += sizeof(DB_LSN);
  638. memcpy(&uinttmp, bp, sizeof(uinttmp));
  639. argp->fileid = (int32_t)uinttmp;
  640. bp += sizeof(uinttmp);
  641. memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
  642. bp += sizeof(argp->lsn);
  643. memcpy(&uinttmp, bp, sizeof(uinttmp));
  644. argp->pgno = (db_pgno_t)uinttmp;
  645. bp += sizeof(uinttmp);
  646. memcpy(&uinttmp, bp, sizeof(uinttmp));
  647. argp->indx = (u_int32_t)uinttmp;
  648. bp += sizeof(uinttmp);
  649. memcpy(&uinttmp, bp, sizeof(uinttmp));
  650. argp->recno = (db_recno_t)uinttmp;
  651. bp += sizeof(uinttmp);
  652. *argpp = argp;
  653. return (0);
  654. }
  655. /*
  656.  * PUBLIC: int __qam_add_log __P((DB *, DB_TXN *, DB_LSN *,
  657.  * PUBLIC:     u_int32_t, DB_LSN *, db_pgno_t, u_int32_t, db_recno_t,
  658.  * PUBLIC:     const DBT *, u_int32_t, const DBT *));
  659.  */
  660. int
  661. __qam_add_log(dbp, txnid, ret_lsnp, flags, lsn, pgno, indx, recno, data,
  662.     vflag, olddata)
  663. DB *dbp;
  664. DB_TXN *txnid;
  665. DB_LSN *ret_lsnp;
  666. u_int32_t flags;
  667. DB_LSN * lsn;
  668. db_pgno_t pgno;
  669. u_int32_t indx;
  670. db_recno_t recno;
  671. const DBT *data;
  672. u_int32_t vflag;
  673. const DBT *olddata;
  674. {
  675. DBT logrec;
  676. DB_ENV *dbenv;
  677. DB_LSN *lsnp, null_lsn;
  678. u_int32_t zero;
  679. u_int32_t uinttmp;
  680. u_int32_t npad, rectype, txn_num;
  681. int ret;
  682. u_int8_t *bp;
  683. dbenv = dbp->dbenv;
  684. rectype = DB___qam_add;
  685. npad = 0;
  686. if (txnid == NULL) {
  687. txn_num = 0;
  688. null_lsn.file = 0;
  689. null_lsn.offset = 0;
  690. lsnp = &null_lsn;
  691. } else {
  692. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  693.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  694. return (ret);
  695. txn_num = txnid->txnid;
  696. lsnp = &txnid->last_lsn;
  697. }
  698. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  699.     + sizeof(u_int32_t)
  700.     + sizeof(*lsn)
  701.     + sizeof(u_int32_t)
  702.     + sizeof(u_int32_t)
  703.     + sizeof(u_int32_t)
  704.     + sizeof(u_int32_t) + (data == NULL ? 0 : data->size)
  705.     + sizeof(u_int32_t)
  706.     + sizeof(u_int32_t) + (olddata == NULL ? 0 : olddata->size);
  707. if (CRYPTO_ON(dbenv)) {
  708. npad =
  709.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  710. logrec.size += npad;
  711. }
  712. if ((ret = __os_malloc(dbenv,
  713.     logrec.size, &logrec.data)) != 0)
  714. return (ret);
  715. if (npad > 0)
  716. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  717. bp = logrec.data;
  718. memcpy(bp, &rectype, sizeof(rectype));
  719. bp += sizeof(rectype);
  720. memcpy(bp, &txn_num, sizeof(txn_num));
  721. bp += sizeof(txn_num);
  722. memcpy(bp, lsnp, sizeof(DB_LSN));
  723. bp += sizeof(DB_LSN);
  724. DB_ASSERT(dbp->log_filename != NULL);
  725. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  726.     (ret = __dbreg_lazy_id(dbp)) != 0)
  727. return (ret);
  728. uinttmp = (u_int32_t)dbp->log_filename->id;
  729. memcpy(bp, &uinttmp, sizeof(uinttmp));
  730. bp += sizeof(uinttmp);
  731. if (lsn != NULL)
  732. memcpy(bp, lsn, sizeof(*lsn));
  733. else
  734. memset(bp, 0, sizeof(*lsn));
  735. bp += sizeof(*lsn);
  736. uinttmp = (u_int32_t)pgno;
  737. memcpy(bp, &uinttmp, sizeof(uinttmp));
  738. bp += sizeof(uinttmp);
  739. uinttmp = (u_int32_t)indx;
  740. memcpy(bp, &uinttmp, sizeof(uinttmp));
  741. bp += sizeof(uinttmp);
  742. uinttmp = (u_int32_t)recno;
  743. memcpy(bp, &uinttmp, sizeof(uinttmp));
  744. bp += sizeof(uinttmp);
  745. if (data == NULL) {
  746. zero = 0;
  747. memcpy(bp, &zero, sizeof(u_int32_t));
  748. bp += sizeof(u_int32_t);
  749. } else {
  750. memcpy(bp, &data->size, sizeof(data->size));
  751. bp += sizeof(data->size);
  752. memcpy(bp, data->data, data->size);
  753. bp += data->size;
  754. }
  755. uinttmp = (u_int32_t)vflag;
  756. memcpy(bp, &uinttmp, sizeof(uinttmp));
  757. bp += sizeof(uinttmp);
  758. if (olddata == NULL) {
  759. zero = 0;
  760. memcpy(bp, &zero, sizeof(u_int32_t));
  761. bp += sizeof(u_int32_t);
  762. } else {
  763. memcpy(bp, &olddata->size, sizeof(olddata->size));
  764. bp += sizeof(olddata->size);
  765. memcpy(bp, olddata->data, olddata->size);
  766. bp += olddata->size;
  767. }
  768. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  769. ret = dbenv->log_put(dbenv,
  770.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  771. if (txnid != NULL && ret == 0)
  772. txnid->last_lsn = *ret_lsnp;
  773. #ifdef LOG_DIAGNOSTIC
  774. if (ret != 0)
  775. (void)__qam_add_print(dbenv,
  776.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  777. #endif
  778. __os_free(dbenv, logrec.data);
  779. return (ret);
  780. }
  781. /*
  782.  * PUBLIC: int __qam_add_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  783.  * PUBLIC:     db_recops, void *));
  784.  */
  785. int
  786. __qam_add_getpgnos(dbenv, rec, lsnp, notused1, summary)
  787. DB_ENV *dbenv;
  788. DBT *rec;
  789. DB_LSN *lsnp;
  790. db_recops notused1;
  791. void *summary;
  792. {
  793. DB *dbp;
  794. TXN_RECS *t;
  795. __qam_add_args *argp;
  796. u_int32_t ret;
  797. COMPQUIET(notused1, DB_TXN_ABORT);
  798. argp = NULL;
  799. t = (TXN_RECS *)summary;
  800. if ((ret = __qam_add_read(dbenv, rec->data, &argp)) != 0)
  801. return (ret);
  802. if ((ret = __dbreg_id_to_db(dbenv,
  803.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  804. goto err;
  805. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  806. goto err;
  807. t->array[t->npages].flags = 0;
  808. t->array[t->npages].fid = argp->fileid;
  809. t->array[t->npages].lsn = *lsnp;
  810. t->array[t->npages].pgdesc.pgno = argp->pgno;
  811. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  812. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  813.     DB_FILE_ID_LEN);
  814. t->npages++;
  815. err: if (argp != NULL)
  816. __os_free(dbenv, argp);
  817. return (ret);
  818. }
  819. /*
  820.  * PUBLIC: int __qam_add_print __P((DB_ENV *, DBT *, DB_LSN *,
  821.  * PUBLIC:     db_recops, void *));
  822.  */
  823. int
  824. __qam_add_print(dbenv, dbtp, lsnp, notused2, notused3)
  825. DB_ENV *dbenv;
  826. DBT *dbtp;
  827. DB_LSN *lsnp;
  828. db_recops notused2;
  829. void *notused3;
  830. {
  831. __qam_add_args *argp;
  832. u_int32_t i;
  833. int ch;
  834. int ret;
  835. notused2 = DB_TXN_ABORT;
  836. notused3 = NULL;
  837. if ((ret = __qam_add_read(dbenv, dbtp->data, &argp)) != 0)
  838. return (ret);
  839. (void)printf(
  840.     "[%lu][%lu]__qam_add: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  841.     (u_long)lsnp->file,
  842.     (u_long)lsnp->offset,
  843.     (u_long)argp->type,
  844.     (u_long)argp->txnid->txnid,
  845.     (u_long)argp->prev_lsn.file,
  846.     (u_long)argp->prev_lsn.offset);
  847. (void)printf("tfileid: %ldn", (long)argp->fileid);
  848. (void)printf("tlsn: [%lu][%lu]n",
  849.     (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
  850. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  851. (void)printf("tindx: %lun", (u_long)argp->indx);
  852. (void)printf("trecno: %lun", (u_long)argp->recno);
  853. (void)printf("tdata: ");
  854. for (i = 0; i < argp->data.size; i++) {
  855. ch = ((u_int8_t *)argp->data.data)[i];
  856. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  857. }
  858. (void)printf("n");
  859. (void)printf("tvflag: %lun", (u_long)argp->vflag);
  860. (void)printf("tolddata: ");
  861. for (i = 0; i < argp->olddata.size; i++) {
  862. ch = ((u_int8_t *)argp->olddata.data)[i];
  863. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  864. }
  865. (void)printf("n");
  866. (void)printf("n");
  867. __os_free(dbenv, argp);
  868. return (0);
  869. }
  870. /*
  871.  * PUBLIC: int __qam_add_read __P((DB_ENV *, void *, __qam_add_args **));
  872.  */
  873. int
  874. __qam_add_read(dbenv, recbuf, argpp)
  875. DB_ENV *dbenv;
  876. void *recbuf;
  877. __qam_add_args **argpp;
  878. {
  879. __qam_add_args *argp;
  880. u_int32_t uinttmp;
  881. u_int8_t *bp;
  882. int ret;
  883. if ((ret = __os_malloc(dbenv,
  884.     sizeof(__qam_add_args) + sizeof(DB_TXN), &argp)) != 0)
  885. return (ret);
  886. argp->txnid = (DB_TXN *)&argp[1];
  887. bp = recbuf;
  888. memcpy(&argp->type, bp, sizeof(argp->type));
  889. bp += sizeof(argp->type);
  890. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  891. bp += sizeof(argp->txnid->txnid);
  892. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  893. bp += sizeof(DB_LSN);
  894. memcpy(&uinttmp, bp, sizeof(uinttmp));
  895. argp->fileid = (int32_t)uinttmp;
  896. bp += sizeof(uinttmp);
  897. memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
  898. bp += sizeof(argp->lsn);
  899. memcpy(&uinttmp, bp, sizeof(uinttmp));
  900. argp->pgno = (db_pgno_t)uinttmp;
  901. bp += sizeof(uinttmp);
  902. memcpy(&uinttmp, bp, sizeof(uinttmp));
  903. argp->indx = (u_int32_t)uinttmp;
  904. bp += sizeof(uinttmp);
  905. memcpy(&uinttmp, bp, sizeof(uinttmp));
  906. argp->recno = (db_recno_t)uinttmp;
  907. bp += sizeof(uinttmp);
  908. memset(&argp->data, 0, sizeof(argp->data));
  909. memcpy(&argp->data.size, bp, sizeof(u_int32_t));
  910. bp += sizeof(u_int32_t);
  911. argp->data.data = bp;
  912. bp += argp->data.size;
  913. memcpy(&uinttmp, bp, sizeof(uinttmp));
  914. argp->vflag = (u_int32_t)uinttmp;
  915. bp += sizeof(uinttmp);
  916. memset(&argp->olddata, 0, sizeof(argp->olddata));
  917. memcpy(&argp->olddata.size, bp, sizeof(u_int32_t));
  918. bp += sizeof(u_int32_t);
  919. argp->olddata.data = bp;
  920. bp += argp->olddata.size;
  921. *argpp = argp;
  922. return (0);
  923. }
  924. /*
  925.  * PUBLIC: int __qam_delext_log __P((DB *, DB_TXN *, DB_LSN *,
  926.  * PUBLIC:     u_int32_t, DB_LSN *, db_pgno_t, u_int32_t, db_recno_t,
  927.  * PUBLIC:     const DBT *));
  928.  */
  929. int
  930. __qam_delext_log(dbp, txnid, ret_lsnp, flags, lsn, pgno, indx, recno, data)
  931. DB *dbp;
  932. DB_TXN *txnid;
  933. DB_LSN *ret_lsnp;
  934. u_int32_t flags;
  935. DB_LSN * lsn;
  936. db_pgno_t pgno;
  937. u_int32_t indx;
  938. db_recno_t recno;
  939. const DBT *data;
  940. {
  941. DBT logrec;
  942. DB_ENV *dbenv;
  943. DB_LSN *lsnp, null_lsn;
  944. u_int32_t zero;
  945. u_int32_t uinttmp;
  946. u_int32_t npad, rectype, txn_num;
  947. int ret;
  948. u_int8_t *bp;
  949. dbenv = dbp->dbenv;
  950. rectype = DB___qam_delext;
  951. npad = 0;
  952. if (txnid == NULL) {
  953. txn_num = 0;
  954. null_lsn.file = 0;
  955. null_lsn.offset = 0;
  956. lsnp = &null_lsn;
  957. } else {
  958. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  959.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  960. return (ret);
  961. txn_num = txnid->txnid;
  962. lsnp = &txnid->last_lsn;
  963. }
  964. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  965.     + sizeof(u_int32_t)
  966.     + sizeof(*lsn)
  967.     + sizeof(u_int32_t)
  968.     + sizeof(u_int32_t)
  969.     + sizeof(u_int32_t)
  970.     + sizeof(u_int32_t) + (data == NULL ? 0 : data->size);
  971. if (CRYPTO_ON(dbenv)) {
  972. npad =
  973.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  974. logrec.size += npad;
  975. }
  976. if ((ret = __os_malloc(dbenv,
  977.     logrec.size, &logrec.data)) != 0)
  978. return (ret);
  979. if (npad > 0)
  980. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  981. bp = logrec.data;
  982. memcpy(bp, &rectype, sizeof(rectype));
  983. bp += sizeof(rectype);
  984. memcpy(bp, &txn_num, sizeof(txn_num));
  985. bp += sizeof(txn_num);
  986. memcpy(bp, lsnp, sizeof(DB_LSN));
  987. bp += sizeof(DB_LSN);
  988. DB_ASSERT(dbp->log_filename != NULL);
  989. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  990.     (ret = __dbreg_lazy_id(dbp)) != 0)
  991. return (ret);
  992. uinttmp = (u_int32_t)dbp->log_filename->id;
  993. memcpy(bp, &uinttmp, sizeof(uinttmp));
  994. bp += sizeof(uinttmp);
  995. if (lsn != NULL)
  996. memcpy(bp, lsn, sizeof(*lsn));
  997. else
  998. memset(bp, 0, sizeof(*lsn));
  999. bp += sizeof(*lsn);
  1000. uinttmp = (u_int32_t)pgno;
  1001. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1002. bp += sizeof(uinttmp);
  1003. uinttmp = (u_int32_t)indx;
  1004. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1005. bp += sizeof(uinttmp);
  1006. uinttmp = (u_int32_t)recno;
  1007. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1008. bp += sizeof(uinttmp);
  1009. if (data == NULL) {
  1010. zero = 0;
  1011. memcpy(bp, &zero, sizeof(u_int32_t));
  1012. bp += sizeof(u_int32_t);
  1013. } else {
  1014. memcpy(bp, &data->size, sizeof(data->size));
  1015. bp += sizeof(data->size);
  1016. memcpy(bp, data->data, data->size);
  1017. bp += data->size;
  1018. }
  1019. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1020. ret = dbenv->log_put(dbenv,
  1021.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1022. if (txnid != NULL && ret == 0)
  1023. txnid->last_lsn = *ret_lsnp;
  1024. #ifdef LOG_DIAGNOSTIC
  1025. if (ret != 0)
  1026. (void)__qam_delext_print(dbenv,
  1027.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  1028. #endif
  1029. __os_free(dbenv, logrec.data);
  1030. return (ret);
  1031. }
  1032. /*
  1033.  * PUBLIC: int __qam_delext_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  1034.  * PUBLIC:     db_recops, void *));
  1035.  */
  1036. int
  1037. __qam_delext_getpgnos(dbenv, rec, lsnp, notused1, summary)
  1038. DB_ENV *dbenv;
  1039. DBT *rec;
  1040. DB_LSN *lsnp;
  1041. db_recops notused1;
  1042. void *summary;
  1043. {
  1044. TXN_RECS *t;
  1045. int ret;
  1046. COMPQUIET(rec, NULL);
  1047. COMPQUIET(notused1, DB_TXN_ABORT);
  1048. t = (TXN_RECS *)summary;
  1049. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  1050. return (ret);
  1051. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  1052. t->array[t->npages].lsn = *lsnp;
  1053. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  1054. memset(&t->array[t->npages].pgdesc, 0,
  1055.     sizeof(t->array[t->npages].pgdesc));
  1056. t->npages++;
  1057. return (0);
  1058. }
  1059. /*
  1060.  * PUBLIC: int __qam_delext_print __P((DB_ENV *, DBT *, DB_LSN *,
  1061.  * PUBLIC:     db_recops, void *));
  1062.  */
  1063. int
  1064. __qam_delext_print(dbenv, dbtp, lsnp, notused2, notused3)
  1065. DB_ENV *dbenv;
  1066. DBT *dbtp;
  1067. DB_LSN *lsnp;
  1068. db_recops notused2;
  1069. void *notused3;
  1070. {
  1071. __qam_delext_args *argp;
  1072. u_int32_t i;
  1073. int ch;
  1074. int ret;
  1075. notused2 = DB_TXN_ABORT;
  1076. notused3 = NULL;
  1077. if ((ret = __qam_delext_read(dbenv, dbtp->data, &argp)) != 0)
  1078. return (ret);
  1079. (void)printf(
  1080.     "[%lu][%lu]__qam_delext: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1081.     (u_long)lsnp->file,
  1082.     (u_long)lsnp->offset,
  1083.     (u_long)argp->type,
  1084.     (u_long)argp->txnid->txnid,
  1085.     (u_long)argp->prev_lsn.file,
  1086.     (u_long)argp->prev_lsn.offset);
  1087. (void)printf("tfileid: %ldn", (long)argp->fileid);
  1088. (void)printf("tlsn: [%lu][%lu]n",
  1089.     (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
  1090. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  1091. (void)printf("tindx: %lun", (u_long)argp->indx);
  1092. (void)printf("trecno: %lun", (u_long)argp->recno);
  1093. (void)printf("tdata: ");
  1094. for (i = 0; i < argp->data.size; i++) {
  1095. ch = ((u_int8_t *)argp->data.data)[i];
  1096. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  1097. }
  1098. (void)printf("n");
  1099. (void)printf("n");
  1100. __os_free(dbenv, argp);
  1101. return (0);
  1102. }
  1103. /*
  1104.  * PUBLIC: int __qam_delext_read __P((DB_ENV *, void *, __qam_delext_args **));
  1105.  */
  1106. int
  1107. __qam_delext_read(dbenv, recbuf, argpp)
  1108. DB_ENV *dbenv;
  1109. void *recbuf;
  1110. __qam_delext_args **argpp;
  1111. {
  1112. __qam_delext_args *argp;
  1113. u_int32_t uinttmp;
  1114. u_int8_t *bp;
  1115. int ret;
  1116. if ((ret = __os_malloc(dbenv,
  1117.     sizeof(__qam_delext_args) + sizeof(DB_TXN), &argp)) != 0)
  1118. return (ret);
  1119. argp->txnid = (DB_TXN *)&argp[1];
  1120. bp = recbuf;
  1121. memcpy(&argp->type, bp, sizeof(argp->type));
  1122. bp += sizeof(argp->type);
  1123. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1124. bp += sizeof(argp->txnid->txnid);
  1125. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1126. bp += sizeof(DB_LSN);
  1127. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1128. argp->fileid = (int32_t)uinttmp;
  1129. bp += sizeof(uinttmp);
  1130. memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
  1131. bp += sizeof(argp->lsn);
  1132. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1133. argp->pgno = (db_pgno_t)uinttmp;
  1134. bp += sizeof(uinttmp);
  1135. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1136. argp->indx = (u_int32_t)uinttmp;
  1137. bp += sizeof(uinttmp);
  1138. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1139. argp->recno = (db_recno_t)uinttmp;
  1140. bp += sizeof(uinttmp);
  1141. memset(&argp->data, 0, sizeof(argp->data));
  1142. memcpy(&argp->data.size, bp, sizeof(u_int32_t));
  1143. bp += sizeof(u_int32_t);
  1144. argp->data.data = bp;
  1145. bp += argp->data.size;
  1146. *argpp = argp;
  1147. return (0);
  1148. }
  1149. /*
  1150.  * PUBLIC: int __qam_init_print __P((DB_ENV *, int (***)(DB_ENV *,
  1151.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  1152.  */
  1153. int
  1154. __qam_init_print(dbenv, dtabp, dtabsizep)
  1155. DB_ENV *dbenv;
  1156. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  1157. size_t *dtabsizep;
  1158. {
  1159. int ret;
  1160. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1161.     __qam_incfirst_print, DB___qam_incfirst)) != 0)
  1162. return (ret);
  1163. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1164.     __qam_mvptr_print, DB___qam_mvptr)) != 0)
  1165. return (ret);
  1166. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1167.     __qam_del_print, DB___qam_del)) != 0)
  1168. return (ret);
  1169. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1170.     __qam_add_print, DB___qam_add)) != 0)
  1171. return (ret);
  1172. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1173.     __qam_delext_print, DB___qam_delext)) != 0)
  1174. return (ret);
  1175. return (0);
  1176. }
  1177. /*
  1178.  * PUBLIC: int __qam_init_getpgnos __P((DB_ENV *, int (***)(DB_ENV *,
  1179.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  1180.  */
  1181. int
  1182. __qam_init_getpgnos(dbenv, dtabp, dtabsizep)
  1183. DB_ENV *dbenv;
  1184. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  1185. size_t *dtabsizep;
  1186. {
  1187. int ret;
  1188. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1189.     __qam_incfirst_getpgnos, DB___qam_incfirst)) != 0)
  1190. return (ret);
  1191. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1192.     __qam_mvptr_getpgnos, DB___qam_mvptr)) != 0)
  1193. return (ret);
  1194. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1195.     __qam_del_getpgnos, DB___qam_del)) != 0)
  1196. return (ret);
  1197. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1198.     __qam_add_getpgnos, DB___qam_add)) != 0)
  1199. return (ret);
  1200. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1201.     __qam_delext_getpgnos, DB___qam_delext)) != 0)
  1202. return (ret);
  1203. return (0);
  1204. }
  1205. /*
  1206.  * PUBLIC: int __qam_init_recover __P((DB_ENV *, int (***)(DB_ENV *,
  1207.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  1208.  */
  1209. int
  1210. __qam_init_recover(dbenv, dtabp, dtabsizep)
  1211. DB_ENV *dbenv;
  1212. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  1213. size_t *dtabsizep;
  1214. {
  1215. int ret;
  1216. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1217.     __qam_incfirst_recover, DB___qam_incfirst)) != 0)
  1218. return (ret);
  1219. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1220.     __qam_mvptr_recover, DB___qam_mvptr)) != 0)
  1221. return (ret);
  1222. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1223.     __qam_del_recover, DB___qam_del)) != 0)
  1224. return (ret);
  1225. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1226.     __qam_add_recover, DB___qam_add)) != 0)
  1227. return (ret);
  1228. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  1229.     __qam_delext_recover, DB___qam_delext)) != 0)
  1230. return (ret);
  1231. return (0);
  1232. }