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

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 __db_addrem_log __P((DB *, DB_TXN *, DB_LSN *,
  18.  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, u_int32_t, u_int32_t,
  19.  * PUBLIC:     const DBT *, const DBT *, DB_LSN *));
  20.  */
  21. int
  22. __db_addrem_log(dbp, txnid, ret_lsnp, flags,
  23.     opcode, pgno, indx, nbytes, hdr,
  24.     dbt, pagelsn)
  25. DB *dbp;
  26. DB_TXN *txnid;
  27. DB_LSN *ret_lsnp;
  28. u_int32_t flags;
  29. u_int32_t opcode;
  30. db_pgno_t pgno;
  31. u_int32_t indx;
  32. u_int32_t nbytes;
  33. const DBT *hdr;
  34. const DBT *dbt;
  35. DB_LSN * pagelsn;
  36. {
  37. DBT logrec;
  38. DB_ENV *dbenv;
  39. DB_LSN *lsnp, null_lsn;
  40. u_int32_t zero;
  41. u_int32_t uinttmp;
  42. u_int32_t npad, rectype, txn_num;
  43. int ret;
  44. u_int8_t *bp;
  45. dbenv = dbp->dbenv;
  46. rectype = DB___db_addrem;
  47. npad = 0;
  48. if (txnid == NULL) {
  49. txn_num = 0;
  50. null_lsn.file = 0;
  51. null_lsn.offset = 0;
  52. lsnp = &null_lsn;
  53. } else {
  54. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  55.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  56. return (ret);
  57. txn_num = txnid->txnid;
  58. lsnp = &txnid->last_lsn;
  59. }
  60. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  61.     + sizeof(u_int32_t)
  62.     + sizeof(u_int32_t)
  63.     + sizeof(u_int32_t)
  64.     + sizeof(u_int32_t)
  65.     + sizeof(u_int32_t)
  66.     + sizeof(u_int32_t) + (hdr == NULL ? 0 : hdr->size)
  67.     + sizeof(u_int32_t) + (dbt == NULL ? 0 : dbt->size)
  68.     + sizeof(*pagelsn);
  69. if (CRYPTO_ON(dbenv)) {
  70. npad =
  71.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  72. logrec.size += npad;
  73. }
  74. if ((ret = __os_malloc(dbenv,
  75.     logrec.size, &logrec.data)) != 0)
  76. return (ret);
  77. if (npad > 0)
  78. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  79. bp = logrec.data;
  80. memcpy(bp, &rectype, sizeof(rectype));
  81. bp += sizeof(rectype);
  82. memcpy(bp, &txn_num, sizeof(txn_num));
  83. bp += sizeof(txn_num);
  84. memcpy(bp, lsnp, sizeof(DB_LSN));
  85. bp += sizeof(DB_LSN);
  86. uinttmp = (u_int32_t)opcode;
  87. memcpy(bp, &uinttmp, sizeof(uinttmp));
  88. bp += sizeof(uinttmp);
  89. DB_ASSERT(dbp->log_filename != NULL);
  90. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  91.     (ret = __dbreg_lazy_id(dbp)) != 0)
  92. return (ret);
  93. uinttmp = (u_int32_t)dbp->log_filename->id;
  94. memcpy(bp, &uinttmp, sizeof(uinttmp));
  95. bp += sizeof(uinttmp);
  96. uinttmp = (u_int32_t)pgno;
  97. memcpy(bp, &uinttmp, sizeof(uinttmp));
  98. bp += sizeof(uinttmp);
  99. uinttmp = (u_int32_t)indx;
  100. memcpy(bp, &uinttmp, sizeof(uinttmp));
  101. bp += sizeof(uinttmp);
  102. uinttmp = (u_int32_t)nbytes;
  103. memcpy(bp, &uinttmp, sizeof(uinttmp));
  104. bp += sizeof(uinttmp);
  105. if (hdr == NULL) {
  106. zero = 0;
  107. memcpy(bp, &zero, sizeof(u_int32_t));
  108. bp += sizeof(u_int32_t);
  109. } else {
  110. memcpy(bp, &hdr->size, sizeof(hdr->size));
  111. bp += sizeof(hdr->size);
  112. memcpy(bp, hdr->data, hdr->size);
  113. bp += hdr->size;
  114. }
  115. if (dbt == NULL) {
  116. zero = 0;
  117. memcpy(bp, &zero, sizeof(u_int32_t));
  118. bp += sizeof(u_int32_t);
  119. } else {
  120. memcpy(bp, &dbt->size, sizeof(dbt->size));
  121. bp += sizeof(dbt->size);
  122. memcpy(bp, dbt->data, dbt->size);
  123. bp += dbt->size;
  124. }
  125. if (pagelsn != NULL)
  126. memcpy(bp, pagelsn, sizeof(*pagelsn));
  127. else
  128. memset(bp, 0, sizeof(*pagelsn));
  129. bp += sizeof(*pagelsn);
  130. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  131. ret = dbenv->log_put(dbenv,
  132.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  133. if (txnid != NULL && ret == 0)
  134. txnid->last_lsn = *ret_lsnp;
  135. #ifdef LOG_DIAGNOSTIC
  136. if (ret != 0)
  137. (void)__db_addrem_print(dbenv,
  138.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  139. #endif
  140. __os_free(dbenv, logrec.data);
  141. return (ret);
  142. }
  143. /*
  144.  * PUBLIC: int __db_addrem_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  145.  * PUBLIC:     db_recops, void *));
  146.  */
  147. int
  148. __db_addrem_getpgnos(dbenv, rec, lsnp, notused1, summary)
  149. DB_ENV *dbenv;
  150. DBT *rec;
  151. DB_LSN *lsnp;
  152. db_recops notused1;
  153. void *summary;
  154. {
  155. DB *dbp;
  156. TXN_RECS *t;
  157. __db_addrem_args *argp;
  158. u_int32_t ret;
  159. COMPQUIET(notused1, DB_TXN_ABORT);
  160. argp = NULL;
  161. t = (TXN_RECS *)summary;
  162. if ((ret = __db_addrem_read(dbenv, rec->data, &argp)) != 0)
  163. return (ret);
  164. if ((ret = __dbreg_id_to_db(dbenv,
  165.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  166. goto err;
  167. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  168. goto err;
  169. t->array[t->npages].flags = 0;
  170. t->array[t->npages].fid = argp->fileid;
  171. t->array[t->npages].lsn = *lsnp;
  172. t->array[t->npages].pgdesc.pgno = argp->pgno;
  173. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  174. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  175.     DB_FILE_ID_LEN);
  176. t->npages++;
  177. err: if (argp != NULL)
  178. __os_free(dbenv, argp);
  179. return (ret);
  180. }
  181. /*
  182.  * PUBLIC: int __db_addrem_print __P((DB_ENV *, DBT *, DB_LSN *,
  183.  * PUBLIC:     db_recops, void *));
  184.  */
  185. int
  186. __db_addrem_print(dbenv, dbtp, lsnp, notused2, notused3)
  187. DB_ENV *dbenv;
  188. DBT *dbtp;
  189. DB_LSN *lsnp;
  190. db_recops notused2;
  191. void *notused3;
  192. {
  193. __db_addrem_args *argp;
  194. u_int32_t i;
  195. int ch;
  196. int ret;
  197. notused2 = DB_TXN_ABORT;
  198. notused3 = NULL;
  199. if ((ret = __db_addrem_read(dbenv, dbtp->data, &argp)) != 0)
  200. return (ret);
  201. (void)printf(
  202.     "[%lu][%lu]__db_addrem: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  203.     (u_long)lsnp->file,
  204.     (u_long)lsnp->offset,
  205.     (u_long)argp->type,
  206.     (u_long)argp->txnid->txnid,
  207.     (u_long)argp->prev_lsn.file,
  208.     (u_long)argp->prev_lsn.offset);
  209. (void)printf("topcode: %lun", (u_long)argp->opcode);
  210. (void)printf("tfileid: %ldn", (long)argp->fileid);
  211. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  212. (void)printf("tindx: %lun", (u_long)argp->indx);
  213. (void)printf("tnbytes: %lun", (u_long)argp->nbytes);
  214. (void)printf("thdr: ");
  215. for (i = 0; i < argp->hdr.size; i++) {
  216. ch = ((u_int8_t *)argp->hdr.data)[i];
  217. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  218. }
  219. (void)printf("n");
  220. (void)printf("tdbt: ");
  221. for (i = 0; i < argp->dbt.size; i++) {
  222. ch = ((u_int8_t *)argp->dbt.data)[i];
  223. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  224. }
  225. (void)printf("n");
  226. (void)printf("tpagelsn: [%lu][%lu]n",
  227.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  228. (void)printf("n");
  229. __os_free(dbenv, argp);
  230. return (0);
  231. }
  232. /*
  233.  * PUBLIC: int __db_addrem_read __P((DB_ENV *, void *, __db_addrem_args **));
  234.  */
  235. int
  236. __db_addrem_read(dbenv, recbuf, argpp)
  237. DB_ENV *dbenv;
  238. void *recbuf;
  239. __db_addrem_args **argpp;
  240. {
  241. __db_addrem_args *argp;
  242. u_int32_t uinttmp;
  243. u_int8_t *bp;
  244. int ret;
  245. if ((ret = __os_malloc(dbenv,
  246.     sizeof(__db_addrem_args) + sizeof(DB_TXN), &argp)) != 0)
  247. return (ret);
  248. argp->txnid = (DB_TXN *)&argp[1];
  249. bp = recbuf;
  250. memcpy(&argp->type, bp, sizeof(argp->type));
  251. bp += sizeof(argp->type);
  252. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  253. bp += sizeof(argp->txnid->txnid);
  254. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  255. bp += sizeof(DB_LSN);
  256. memcpy(&uinttmp, bp, sizeof(uinttmp));
  257. argp->opcode = (u_int32_t)uinttmp;
  258. bp += sizeof(uinttmp);
  259. memcpy(&uinttmp, bp, sizeof(uinttmp));
  260. argp->fileid = (int32_t)uinttmp;
  261. bp += sizeof(uinttmp);
  262. memcpy(&uinttmp, bp, sizeof(uinttmp));
  263. argp->pgno = (db_pgno_t)uinttmp;
  264. bp += sizeof(uinttmp);
  265. memcpy(&uinttmp, bp, sizeof(uinttmp));
  266. argp->indx = (u_int32_t)uinttmp;
  267. bp += sizeof(uinttmp);
  268. memcpy(&uinttmp, bp, sizeof(uinttmp));
  269. argp->nbytes = (u_int32_t)uinttmp;
  270. bp += sizeof(uinttmp);
  271. memset(&argp->hdr, 0, sizeof(argp->hdr));
  272. memcpy(&argp->hdr.size, bp, sizeof(u_int32_t));
  273. bp += sizeof(u_int32_t);
  274. argp->hdr.data = bp;
  275. bp += argp->hdr.size;
  276. memset(&argp->dbt, 0, sizeof(argp->dbt));
  277. memcpy(&argp->dbt.size, bp, sizeof(u_int32_t));
  278. bp += sizeof(u_int32_t);
  279. argp->dbt.data = bp;
  280. bp += argp->dbt.size;
  281. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  282. bp += sizeof(argp->pagelsn);
  283. *argpp = argp;
  284. return (0);
  285. }
  286. /*
  287.  * PUBLIC: int __db_big_log __P((DB *, DB_TXN *, DB_LSN *,
  288.  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, db_pgno_t, db_pgno_t,
  289.  * PUBLIC:     const DBT *, DB_LSN *, DB_LSN *, DB_LSN *));
  290.  */
  291. int
  292. __db_big_log(dbp, txnid, ret_lsnp, flags,
  293.     opcode, pgno, prev_pgno, next_pgno, dbt,
  294.     pagelsn, prevlsn, nextlsn)
  295. DB *dbp;
  296. DB_TXN *txnid;
  297. DB_LSN *ret_lsnp;
  298. u_int32_t flags;
  299. u_int32_t opcode;
  300. db_pgno_t pgno;
  301. db_pgno_t prev_pgno;
  302. db_pgno_t next_pgno;
  303. const DBT *dbt;
  304. DB_LSN * pagelsn;
  305. DB_LSN * prevlsn;
  306. DB_LSN * nextlsn;
  307. {
  308. DBT logrec;
  309. DB_ENV *dbenv;
  310. DB_LSN *lsnp, null_lsn;
  311. u_int32_t zero;
  312. u_int32_t uinttmp;
  313. u_int32_t npad, rectype, txn_num;
  314. int ret;
  315. u_int8_t *bp;
  316. dbenv = dbp->dbenv;
  317. rectype = DB___db_big;
  318. npad = 0;
  319. if (txnid == NULL) {
  320. txn_num = 0;
  321. null_lsn.file = 0;
  322. null_lsn.offset = 0;
  323. lsnp = &null_lsn;
  324. } else {
  325. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  326.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  327. return (ret);
  328. txn_num = txnid->txnid;
  329. lsnp = &txnid->last_lsn;
  330. }
  331. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  332.     + sizeof(u_int32_t)
  333.     + sizeof(u_int32_t)
  334.     + sizeof(u_int32_t)
  335.     + sizeof(u_int32_t)
  336.     + sizeof(u_int32_t)
  337.     + sizeof(u_int32_t) + (dbt == NULL ? 0 : dbt->size)
  338.     + sizeof(*pagelsn)
  339.     + sizeof(*prevlsn)
  340.     + sizeof(*nextlsn);
  341. if (CRYPTO_ON(dbenv)) {
  342. npad =
  343.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  344. logrec.size += npad;
  345. }
  346. if ((ret = __os_malloc(dbenv,
  347.     logrec.size, &logrec.data)) != 0)
  348. return (ret);
  349. if (npad > 0)
  350. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  351. bp = logrec.data;
  352. memcpy(bp, &rectype, sizeof(rectype));
  353. bp += sizeof(rectype);
  354. memcpy(bp, &txn_num, sizeof(txn_num));
  355. bp += sizeof(txn_num);
  356. memcpy(bp, lsnp, sizeof(DB_LSN));
  357. bp += sizeof(DB_LSN);
  358. uinttmp = (u_int32_t)opcode;
  359. memcpy(bp, &uinttmp, sizeof(uinttmp));
  360. bp += sizeof(uinttmp);
  361. DB_ASSERT(dbp->log_filename != NULL);
  362. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  363.     (ret = __dbreg_lazy_id(dbp)) != 0)
  364. return (ret);
  365. uinttmp = (u_int32_t)dbp->log_filename->id;
  366. memcpy(bp, &uinttmp, sizeof(uinttmp));
  367. bp += sizeof(uinttmp);
  368. uinttmp = (u_int32_t)pgno;
  369. memcpy(bp, &uinttmp, sizeof(uinttmp));
  370. bp += sizeof(uinttmp);
  371. uinttmp = (u_int32_t)prev_pgno;
  372. memcpy(bp, &uinttmp, sizeof(uinttmp));
  373. bp += sizeof(uinttmp);
  374. uinttmp = (u_int32_t)next_pgno;
  375. memcpy(bp, &uinttmp, sizeof(uinttmp));
  376. bp += sizeof(uinttmp);
  377. if (dbt == NULL) {
  378. zero = 0;
  379. memcpy(bp, &zero, sizeof(u_int32_t));
  380. bp += sizeof(u_int32_t);
  381. } else {
  382. memcpy(bp, &dbt->size, sizeof(dbt->size));
  383. bp += sizeof(dbt->size);
  384. memcpy(bp, dbt->data, dbt->size);
  385. bp += dbt->size;
  386. }
  387. if (pagelsn != NULL)
  388. memcpy(bp, pagelsn, sizeof(*pagelsn));
  389. else
  390. memset(bp, 0, sizeof(*pagelsn));
  391. bp += sizeof(*pagelsn);
  392. if (prevlsn != NULL)
  393. memcpy(bp, prevlsn, sizeof(*prevlsn));
  394. else
  395. memset(bp, 0, sizeof(*prevlsn));
  396. bp += sizeof(*prevlsn);
  397. if (nextlsn != NULL)
  398. memcpy(bp, nextlsn, sizeof(*nextlsn));
  399. else
  400. memset(bp, 0, sizeof(*nextlsn));
  401. bp += sizeof(*nextlsn);
  402. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  403. ret = dbenv->log_put(dbenv,
  404.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  405. if (txnid != NULL && ret == 0)
  406. txnid->last_lsn = *ret_lsnp;
  407. #ifdef LOG_DIAGNOSTIC
  408. if (ret != 0)
  409. (void)__db_big_print(dbenv,
  410.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  411. #endif
  412. __os_free(dbenv, logrec.data);
  413. return (ret);
  414. }
  415. /*
  416.  * PUBLIC: int __db_big_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  417.  * PUBLIC:     db_recops, void *));
  418.  */
  419. int
  420. __db_big_getpgnos(dbenv, rec, lsnp, notused1, summary)
  421. DB_ENV *dbenv;
  422. DBT *rec;
  423. DB_LSN *lsnp;
  424. db_recops notused1;
  425. void *summary;
  426. {
  427. DB *dbp;
  428. TXN_RECS *t;
  429. __db_big_args *argp;
  430. u_int32_t ret;
  431. COMPQUIET(notused1, DB_TXN_ABORT);
  432. argp = NULL;
  433. t = (TXN_RECS *)summary;
  434. if ((ret = __db_big_read(dbenv, rec->data, &argp)) != 0)
  435. return (ret);
  436. if ((ret = __dbreg_id_to_db(dbenv,
  437.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  438. goto err;
  439. if ((ret = __rep_check_alloc(dbenv, t, 3)) != 0)
  440. goto err;
  441. t->array[t->npages].flags = 0;
  442. t->array[t->npages].fid = argp->fileid;
  443. t->array[t->npages].lsn = *lsnp;
  444. t->array[t->npages].pgdesc.pgno = argp->pgno;
  445. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  446. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  447.     DB_FILE_ID_LEN);
  448. t->npages++;
  449. if (argp->prev_pgno != PGNO_INVALID) {
  450. t->array[t->npages].flags = 0;
  451. t->array[t->npages].fid = argp->fileid;
  452. t->array[t->npages].lsn = *lsnp;
  453. t->array[t->npages].pgdesc.pgno = argp->prev_pgno;
  454. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  455. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  456.     DB_FILE_ID_LEN);
  457. t->npages++;
  458. }
  459. if (argp->next_pgno != PGNO_INVALID) {
  460. t->array[t->npages].flags = 0;
  461. t->array[t->npages].fid = argp->fileid;
  462. t->array[t->npages].lsn = *lsnp;
  463. t->array[t->npages].pgdesc.pgno = argp->next_pgno;
  464. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  465. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  466.     DB_FILE_ID_LEN);
  467. t->npages++;
  468. }
  469. err: if (argp != NULL)
  470. __os_free(dbenv, argp);
  471. return (ret);
  472. }
  473. /*
  474.  * PUBLIC: int __db_big_print __P((DB_ENV *, DBT *, DB_LSN *,
  475.  * PUBLIC:     db_recops, void *));
  476.  */
  477. int
  478. __db_big_print(dbenv, dbtp, lsnp, notused2, notused3)
  479. DB_ENV *dbenv;
  480. DBT *dbtp;
  481. DB_LSN *lsnp;
  482. db_recops notused2;
  483. void *notused3;
  484. {
  485. __db_big_args *argp;
  486. u_int32_t i;
  487. int ch;
  488. int ret;
  489. notused2 = DB_TXN_ABORT;
  490. notused3 = NULL;
  491. if ((ret = __db_big_read(dbenv, dbtp->data, &argp)) != 0)
  492. return (ret);
  493. (void)printf(
  494.     "[%lu][%lu]__db_big: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  495.     (u_long)lsnp->file,
  496.     (u_long)lsnp->offset,
  497.     (u_long)argp->type,
  498.     (u_long)argp->txnid->txnid,
  499.     (u_long)argp->prev_lsn.file,
  500.     (u_long)argp->prev_lsn.offset);
  501. (void)printf("topcode: %lun", (u_long)argp->opcode);
  502. (void)printf("tfileid: %ldn", (long)argp->fileid);
  503. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  504. (void)printf("tprev_pgno: %lun", (u_long)argp->prev_pgno);
  505. (void)printf("tnext_pgno: %lun", (u_long)argp->next_pgno);
  506. (void)printf("tdbt: ");
  507. for (i = 0; i < argp->dbt.size; i++) {
  508. ch = ((u_int8_t *)argp->dbt.data)[i];
  509. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  510. }
  511. (void)printf("n");
  512. (void)printf("tpagelsn: [%lu][%lu]n",
  513.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  514. (void)printf("tprevlsn: [%lu][%lu]n",
  515.     (u_long)argp->prevlsn.file, (u_long)argp->prevlsn.offset);
  516. (void)printf("tnextlsn: [%lu][%lu]n",
  517.     (u_long)argp->nextlsn.file, (u_long)argp->nextlsn.offset);
  518. (void)printf("n");
  519. __os_free(dbenv, argp);
  520. return (0);
  521. }
  522. /*
  523.  * PUBLIC: int __db_big_read __P((DB_ENV *, void *, __db_big_args **));
  524.  */
  525. int
  526. __db_big_read(dbenv, recbuf, argpp)
  527. DB_ENV *dbenv;
  528. void *recbuf;
  529. __db_big_args **argpp;
  530. {
  531. __db_big_args *argp;
  532. u_int32_t uinttmp;
  533. u_int8_t *bp;
  534. int ret;
  535. if ((ret = __os_malloc(dbenv,
  536.     sizeof(__db_big_args) + sizeof(DB_TXN), &argp)) != 0)
  537. return (ret);
  538. argp->txnid = (DB_TXN *)&argp[1];
  539. bp = recbuf;
  540. memcpy(&argp->type, bp, sizeof(argp->type));
  541. bp += sizeof(argp->type);
  542. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  543. bp += sizeof(argp->txnid->txnid);
  544. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  545. bp += sizeof(DB_LSN);
  546. memcpy(&uinttmp, bp, sizeof(uinttmp));
  547. argp->opcode = (u_int32_t)uinttmp;
  548. bp += sizeof(uinttmp);
  549. memcpy(&uinttmp, bp, sizeof(uinttmp));
  550. argp->fileid = (int32_t)uinttmp;
  551. bp += sizeof(uinttmp);
  552. memcpy(&uinttmp, bp, sizeof(uinttmp));
  553. argp->pgno = (db_pgno_t)uinttmp;
  554. bp += sizeof(uinttmp);
  555. memcpy(&uinttmp, bp, sizeof(uinttmp));
  556. argp->prev_pgno = (db_pgno_t)uinttmp;
  557. bp += sizeof(uinttmp);
  558. memcpy(&uinttmp, bp, sizeof(uinttmp));
  559. argp->next_pgno = (db_pgno_t)uinttmp;
  560. bp += sizeof(uinttmp);
  561. memset(&argp->dbt, 0, sizeof(argp->dbt));
  562. memcpy(&argp->dbt.size, bp, sizeof(u_int32_t));
  563. bp += sizeof(u_int32_t);
  564. argp->dbt.data = bp;
  565. bp += argp->dbt.size;
  566. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  567. bp += sizeof(argp->pagelsn);
  568. memcpy(&argp->prevlsn, bp,  sizeof(argp->prevlsn));
  569. bp += sizeof(argp->prevlsn);
  570. memcpy(&argp->nextlsn, bp,  sizeof(argp->nextlsn));
  571. bp += sizeof(argp->nextlsn);
  572. *argpp = argp;
  573. return (0);
  574. }
  575. /*
  576.  * PUBLIC: int __db_ovref_log __P((DB *, DB_TXN *, DB_LSN *,
  577.  * PUBLIC:     u_int32_t, db_pgno_t, int32_t, DB_LSN *));
  578.  */
  579. int
  580. __db_ovref_log(dbp, txnid, ret_lsnp, flags, pgno, adjust, lsn)
  581. DB *dbp;
  582. DB_TXN *txnid;
  583. DB_LSN *ret_lsnp;
  584. u_int32_t flags;
  585. db_pgno_t pgno;
  586. int32_t adjust;
  587. DB_LSN * lsn;
  588. {
  589. DBT logrec;
  590. DB_ENV *dbenv;
  591. DB_LSN *lsnp, null_lsn;
  592. u_int32_t uinttmp;
  593. u_int32_t npad, rectype, txn_num;
  594. int ret;
  595. u_int8_t *bp;
  596. dbenv = dbp->dbenv;
  597. rectype = DB___db_ovref;
  598. npad = 0;
  599. if (txnid == NULL) {
  600. txn_num = 0;
  601. null_lsn.file = 0;
  602. null_lsn.offset = 0;
  603. lsnp = &null_lsn;
  604. } else {
  605. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  606.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  607. return (ret);
  608. txn_num = txnid->txnid;
  609. lsnp = &txnid->last_lsn;
  610. }
  611. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  612.     + sizeof(u_int32_t)
  613.     + sizeof(u_int32_t)
  614.     + sizeof(u_int32_t)
  615.     + sizeof(*lsn);
  616. if (CRYPTO_ON(dbenv)) {
  617. npad =
  618.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  619. logrec.size += npad;
  620. }
  621. if ((ret = __os_malloc(dbenv,
  622.     logrec.size, &logrec.data)) != 0)
  623. return (ret);
  624. if (npad > 0)
  625. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  626. bp = logrec.data;
  627. memcpy(bp, &rectype, sizeof(rectype));
  628. bp += sizeof(rectype);
  629. memcpy(bp, &txn_num, sizeof(txn_num));
  630. bp += sizeof(txn_num);
  631. memcpy(bp, lsnp, sizeof(DB_LSN));
  632. bp += sizeof(DB_LSN);
  633. DB_ASSERT(dbp->log_filename != NULL);
  634. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  635.     (ret = __dbreg_lazy_id(dbp)) != 0)
  636. return (ret);
  637. uinttmp = (u_int32_t)dbp->log_filename->id;
  638. memcpy(bp, &uinttmp, sizeof(uinttmp));
  639. bp += sizeof(uinttmp);
  640. uinttmp = (u_int32_t)pgno;
  641. memcpy(bp, &uinttmp, sizeof(uinttmp));
  642. bp += sizeof(uinttmp);
  643. uinttmp = (u_int32_t)adjust;
  644. memcpy(bp, &uinttmp, sizeof(uinttmp));
  645. bp += sizeof(uinttmp);
  646. if (lsn != NULL)
  647. memcpy(bp, lsn, sizeof(*lsn));
  648. else
  649. memset(bp, 0, sizeof(*lsn));
  650. bp += sizeof(*lsn);
  651. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  652. ret = dbenv->log_put(dbenv,
  653.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  654. if (txnid != NULL && ret == 0)
  655. txnid->last_lsn = *ret_lsnp;
  656. #ifdef LOG_DIAGNOSTIC
  657. if (ret != 0)
  658. (void)__db_ovref_print(dbenv,
  659.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  660. #endif
  661. __os_free(dbenv, logrec.data);
  662. return (ret);
  663. }
  664. /*
  665.  * PUBLIC: int __db_ovref_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  666.  * PUBLIC:     db_recops, void *));
  667.  */
  668. int
  669. __db_ovref_getpgnos(dbenv, rec, lsnp, notused1, summary)
  670. DB_ENV *dbenv;
  671. DBT *rec;
  672. DB_LSN *lsnp;
  673. db_recops notused1;
  674. void *summary;
  675. {
  676. DB *dbp;
  677. TXN_RECS *t;
  678. __db_ovref_args *argp;
  679. u_int32_t ret;
  680. COMPQUIET(notused1, DB_TXN_ABORT);
  681. argp = NULL;
  682. t = (TXN_RECS *)summary;
  683. if ((ret = __db_ovref_read(dbenv, rec->data, &argp)) != 0)
  684. return (ret);
  685. if ((ret = __dbreg_id_to_db(dbenv,
  686.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  687. goto err;
  688. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  689. goto err;
  690. t->array[t->npages].flags = 0;
  691. t->array[t->npages].fid = argp->fileid;
  692. t->array[t->npages].lsn = *lsnp;
  693. t->array[t->npages].pgdesc.pgno = argp->pgno;
  694. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  695. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  696.     DB_FILE_ID_LEN);
  697. t->npages++;
  698. err: if (argp != NULL)
  699. __os_free(dbenv, argp);
  700. return (ret);
  701. }
  702. /*
  703.  * PUBLIC: int __db_ovref_print __P((DB_ENV *, DBT *, DB_LSN *,
  704.  * PUBLIC:     db_recops, void *));
  705.  */
  706. int
  707. __db_ovref_print(dbenv, dbtp, lsnp, notused2, notused3)
  708. DB_ENV *dbenv;
  709. DBT *dbtp;
  710. DB_LSN *lsnp;
  711. db_recops notused2;
  712. void *notused3;
  713. {
  714. __db_ovref_args *argp;
  715. int ret;
  716. notused2 = DB_TXN_ABORT;
  717. notused3 = NULL;
  718. if ((ret = __db_ovref_read(dbenv, dbtp->data, &argp)) != 0)
  719. return (ret);
  720. (void)printf(
  721.     "[%lu][%lu]__db_ovref: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  722.     (u_long)lsnp->file,
  723.     (u_long)lsnp->offset,
  724.     (u_long)argp->type,
  725.     (u_long)argp->txnid->txnid,
  726.     (u_long)argp->prev_lsn.file,
  727.     (u_long)argp->prev_lsn.offset);
  728. (void)printf("tfileid: %ldn", (long)argp->fileid);
  729. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  730. (void)printf("tadjust: %ldn", (long)argp->adjust);
  731. (void)printf("tlsn: [%lu][%lu]n",
  732.     (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
  733. (void)printf("n");
  734. __os_free(dbenv, argp);
  735. return (0);
  736. }
  737. /*
  738.  * PUBLIC: int __db_ovref_read __P((DB_ENV *, void *, __db_ovref_args **));
  739.  */
  740. int
  741. __db_ovref_read(dbenv, recbuf, argpp)
  742. DB_ENV *dbenv;
  743. void *recbuf;
  744. __db_ovref_args **argpp;
  745. {
  746. __db_ovref_args *argp;
  747. u_int32_t uinttmp;
  748. u_int8_t *bp;
  749. int ret;
  750. if ((ret = __os_malloc(dbenv,
  751.     sizeof(__db_ovref_args) + sizeof(DB_TXN), &argp)) != 0)
  752. return (ret);
  753. argp->txnid = (DB_TXN *)&argp[1];
  754. bp = recbuf;
  755. memcpy(&argp->type, bp, sizeof(argp->type));
  756. bp += sizeof(argp->type);
  757. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  758. bp += sizeof(argp->txnid->txnid);
  759. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  760. bp += sizeof(DB_LSN);
  761. memcpy(&uinttmp, bp, sizeof(uinttmp));
  762. argp->fileid = (int32_t)uinttmp;
  763. bp += sizeof(uinttmp);
  764. memcpy(&uinttmp, bp, sizeof(uinttmp));
  765. argp->pgno = (db_pgno_t)uinttmp;
  766. bp += sizeof(uinttmp);
  767. memcpy(&uinttmp, bp, sizeof(uinttmp));
  768. argp->adjust = (int32_t)uinttmp;
  769. bp += sizeof(uinttmp);
  770. memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
  771. bp += sizeof(argp->lsn);
  772. *argpp = argp;
  773. return (0);
  774. }
  775. /*
  776.  * PUBLIC: int __db_relink_log __P((DB *, DB_TXN *, DB_LSN *,
  777.  * PUBLIC:     u_int32_t, u_int32_t, db_pgno_t, DB_LSN *, db_pgno_t, DB_LSN *,
  778.  * PUBLIC:     db_pgno_t, DB_LSN *));
  779.  */
  780. int
  781. __db_relink_log(dbp, txnid, ret_lsnp, flags,
  782.     opcode, pgno, lsn, prev, lsn_prev,
  783.     next, lsn_next)
  784. DB *dbp;
  785. DB_TXN *txnid;
  786. DB_LSN *ret_lsnp;
  787. u_int32_t flags;
  788. u_int32_t opcode;
  789. db_pgno_t pgno;
  790. DB_LSN * lsn;
  791. db_pgno_t prev;
  792. DB_LSN * lsn_prev;
  793. db_pgno_t next;
  794. DB_LSN * lsn_next;
  795. {
  796. DBT logrec;
  797. DB_ENV *dbenv;
  798. DB_LSN *lsnp, null_lsn;
  799. u_int32_t uinttmp;
  800. u_int32_t npad, rectype, txn_num;
  801. int ret;
  802. u_int8_t *bp;
  803. dbenv = dbp->dbenv;
  804. rectype = DB___db_relink;
  805. npad = 0;
  806. if (txnid == NULL) {
  807. txn_num = 0;
  808. null_lsn.file = 0;
  809. null_lsn.offset = 0;
  810. lsnp = &null_lsn;
  811. } else {
  812. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  813.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  814. return (ret);
  815. txn_num = txnid->txnid;
  816. lsnp = &txnid->last_lsn;
  817. }
  818. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  819.     + sizeof(u_int32_t)
  820.     + sizeof(u_int32_t)
  821.     + sizeof(u_int32_t)
  822.     + sizeof(*lsn)
  823.     + sizeof(u_int32_t)
  824.     + sizeof(*lsn_prev)
  825.     + sizeof(u_int32_t)
  826.     + sizeof(*lsn_next);
  827. if (CRYPTO_ON(dbenv)) {
  828. npad =
  829.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  830. logrec.size += npad;
  831. }
  832. if ((ret = __os_malloc(dbenv,
  833.     logrec.size, &logrec.data)) != 0)
  834. return (ret);
  835. if (npad > 0)
  836. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  837. bp = logrec.data;
  838. memcpy(bp, &rectype, sizeof(rectype));
  839. bp += sizeof(rectype);
  840. memcpy(bp, &txn_num, sizeof(txn_num));
  841. bp += sizeof(txn_num);
  842. memcpy(bp, lsnp, sizeof(DB_LSN));
  843. bp += sizeof(DB_LSN);
  844. uinttmp = (u_int32_t)opcode;
  845. memcpy(bp, &uinttmp, sizeof(uinttmp));
  846. bp += sizeof(uinttmp);
  847. DB_ASSERT(dbp->log_filename != NULL);
  848. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  849.     (ret = __dbreg_lazy_id(dbp)) != 0)
  850. return (ret);
  851. uinttmp = (u_int32_t)dbp->log_filename->id;
  852. memcpy(bp, &uinttmp, sizeof(uinttmp));
  853. bp += sizeof(uinttmp);
  854. uinttmp = (u_int32_t)pgno;
  855. memcpy(bp, &uinttmp, sizeof(uinttmp));
  856. bp += sizeof(uinttmp);
  857. if (lsn != NULL)
  858. memcpy(bp, lsn, sizeof(*lsn));
  859. else
  860. memset(bp, 0, sizeof(*lsn));
  861. bp += sizeof(*lsn);
  862. uinttmp = (u_int32_t)prev;
  863. memcpy(bp, &uinttmp, sizeof(uinttmp));
  864. bp += sizeof(uinttmp);
  865. if (lsn_prev != NULL)
  866. memcpy(bp, lsn_prev, sizeof(*lsn_prev));
  867. else
  868. memset(bp, 0, sizeof(*lsn_prev));
  869. bp += sizeof(*lsn_prev);
  870. uinttmp = (u_int32_t)next;
  871. memcpy(bp, &uinttmp, sizeof(uinttmp));
  872. bp += sizeof(uinttmp);
  873. if (lsn_next != NULL)
  874. memcpy(bp, lsn_next, sizeof(*lsn_next));
  875. else
  876. memset(bp, 0, sizeof(*lsn_next));
  877. bp += sizeof(*lsn_next);
  878. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  879. ret = dbenv->log_put(dbenv,
  880.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  881. if (txnid != NULL && ret == 0)
  882. txnid->last_lsn = *ret_lsnp;
  883. #ifdef LOG_DIAGNOSTIC
  884. if (ret != 0)
  885. (void)__db_relink_print(dbenv,
  886.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  887. #endif
  888. __os_free(dbenv, logrec.data);
  889. return (ret);
  890. }
  891. /*
  892.  * PUBLIC: int __db_relink_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  893.  * PUBLIC:     db_recops, void *));
  894.  */
  895. int
  896. __db_relink_getpgnos(dbenv, rec, lsnp, notused1, summary)
  897. DB_ENV *dbenv;
  898. DBT *rec;
  899. DB_LSN *lsnp;
  900. db_recops notused1;
  901. void *summary;
  902. {
  903. DB *dbp;
  904. TXN_RECS *t;
  905. __db_relink_args *argp;
  906. u_int32_t ret;
  907. COMPQUIET(notused1, DB_TXN_ABORT);
  908. argp = NULL;
  909. t = (TXN_RECS *)summary;
  910. if ((ret = __db_relink_read(dbenv, rec->data, &argp)) != 0)
  911. return (ret);
  912. if ((ret = __dbreg_id_to_db(dbenv,
  913.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  914. goto err;
  915. if ((ret = __rep_check_alloc(dbenv, t, 3)) != 0)
  916. goto err;
  917. t->array[t->npages].flags = 0;
  918. t->array[t->npages].fid = argp->fileid;
  919. t->array[t->npages].lsn = *lsnp;
  920. t->array[t->npages].pgdesc.pgno = argp->pgno;
  921. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  922. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  923.     DB_FILE_ID_LEN);
  924. t->npages++;
  925. if (argp->prev != PGNO_INVALID) {
  926. t->array[t->npages].flags = 0;
  927. t->array[t->npages].fid = argp->fileid;
  928. t->array[t->npages].lsn = *lsnp;
  929. t->array[t->npages].pgdesc.pgno = argp->prev;
  930. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  931. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  932.     DB_FILE_ID_LEN);
  933. t->npages++;
  934. }
  935. if (argp->next != PGNO_INVALID) {
  936. t->array[t->npages].flags = 0;
  937. t->array[t->npages].fid = argp->fileid;
  938. t->array[t->npages].lsn = *lsnp;
  939. t->array[t->npages].pgdesc.pgno = argp->next;
  940. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  941. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  942.     DB_FILE_ID_LEN);
  943. t->npages++;
  944. }
  945. err: if (argp != NULL)
  946. __os_free(dbenv, argp);
  947. return (ret);
  948. }
  949. /*
  950.  * PUBLIC: int __db_relink_print __P((DB_ENV *, DBT *, DB_LSN *,
  951.  * PUBLIC:     db_recops, void *));
  952.  */
  953. int
  954. __db_relink_print(dbenv, dbtp, lsnp, notused2, notused3)
  955. DB_ENV *dbenv;
  956. DBT *dbtp;
  957. DB_LSN *lsnp;
  958. db_recops notused2;
  959. void *notused3;
  960. {
  961. __db_relink_args *argp;
  962. int ret;
  963. notused2 = DB_TXN_ABORT;
  964. notused3 = NULL;
  965. if ((ret = __db_relink_read(dbenv, dbtp->data, &argp)) != 0)
  966. return (ret);
  967. (void)printf(
  968.     "[%lu][%lu]__db_relink: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  969.     (u_long)lsnp->file,
  970.     (u_long)lsnp->offset,
  971.     (u_long)argp->type,
  972.     (u_long)argp->txnid->txnid,
  973.     (u_long)argp->prev_lsn.file,
  974.     (u_long)argp->prev_lsn.offset);
  975. (void)printf("topcode: %lun", (u_long)argp->opcode);
  976. (void)printf("tfileid: %ldn", (long)argp->fileid);
  977. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  978. (void)printf("tlsn: [%lu][%lu]n",
  979.     (u_long)argp->lsn.file, (u_long)argp->lsn.offset);
  980. (void)printf("tprev: %lun", (u_long)argp->prev);
  981. (void)printf("tlsn_prev: [%lu][%lu]n",
  982.     (u_long)argp->lsn_prev.file, (u_long)argp->lsn_prev.offset);
  983. (void)printf("tnext: %lun", (u_long)argp->next);
  984. (void)printf("tlsn_next: [%lu][%lu]n",
  985.     (u_long)argp->lsn_next.file, (u_long)argp->lsn_next.offset);
  986. (void)printf("n");
  987. __os_free(dbenv, argp);
  988. return (0);
  989. }
  990. /*
  991.  * PUBLIC: int __db_relink_read __P((DB_ENV *, void *, __db_relink_args **));
  992.  */
  993. int
  994. __db_relink_read(dbenv, recbuf, argpp)
  995. DB_ENV *dbenv;
  996. void *recbuf;
  997. __db_relink_args **argpp;
  998. {
  999. __db_relink_args *argp;
  1000. u_int32_t uinttmp;
  1001. u_int8_t *bp;
  1002. int ret;
  1003. if ((ret = __os_malloc(dbenv,
  1004.     sizeof(__db_relink_args) + sizeof(DB_TXN), &argp)) != 0)
  1005. return (ret);
  1006. argp->txnid = (DB_TXN *)&argp[1];
  1007. bp = recbuf;
  1008. memcpy(&argp->type, bp, sizeof(argp->type));
  1009. bp += sizeof(argp->type);
  1010. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1011. bp += sizeof(argp->txnid->txnid);
  1012. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1013. bp += sizeof(DB_LSN);
  1014. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1015. argp->opcode = (u_int32_t)uinttmp;
  1016. bp += sizeof(uinttmp);
  1017. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1018. argp->fileid = (int32_t)uinttmp;
  1019. bp += sizeof(uinttmp);
  1020. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1021. argp->pgno = (db_pgno_t)uinttmp;
  1022. bp += sizeof(uinttmp);
  1023. memcpy(&argp->lsn, bp,  sizeof(argp->lsn));
  1024. bp += sizeof(argp->lsn);
  1025. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1026. argp->prev = (db_pgno_t)uinttmp;
  1027. bp += sizeof(uinttmp);
  1028. memcpy(&argp->lsn_prev, bp,  sizeof(argp->lsn_prev));
  1029. bp += sizeof(argp->lsn_prev);
  1030. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1031. argp->next = (db_pgno_t)uinttmp;
  1032. bp += sizeof(uinttmp);
  1033. memcpy(&argp->lsn_next, bp,  sizeof(argp->lsn_next));
  1034. bp += sizeof(argp->lsn_next);
  1035. *argpp = argp;
  1036. return (0);
  1037. }
  1038. /*
  1039.  * PUBLIC: int __db_debug_log __P((DB_ENV *, DB_TXN *, DB_LSN *,
  1040.  * PUBLIC:     u_int32_t, const DBT *, int32_t, const DBT *, const DBT *,
  1041.  * PUBLIC:     u_int32_t));
  1042.  */
  1043. int
  1044. __db_debug_log(dbenv, txnid, ret_lsnp, flags,
  1045.     op, fileid, key, data, arg_flags)
  1046. DB_ENV *dbenv;
  1047. DB_TXN *txnid;
  1048. DB_LSN *ret_lsnp;
  1049. u_int32_t flags;
  1050. const DBT *op;
  1051. int32_t fileid;
  1052. const DBT *key;
  1053. const DBT *data;
  1054. u_int32_t arg_flags;
  1055. {
  1056. DBT logrec;
  1057. DB_LSN *lsnp, null_lsn;
  1058. u_int32_t zero;
  1059. u_int32_t uinttmp;
  1060. u_int32_t npad, rectype, txn_num;
  1061. int ret;
  1062. u_int8_t *bp;
  1063. rectype = DB___db_debug;
  1064. npad = 0;
  1065. if (txnid == NULL) {
  1066. txn_num = 0;
  1067. null_lsn.file = 0;
  1068. null_lsn.offset = 0;
  1069. lsnp = &null_lsn;
  1070. } else {
  1071. txn_num = txnid->txnid;
  1072. lsnp = &txnid->last_lsn;
  1073. }
  1074. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1075.     + sizeof(u_int32_t) + (op == NULL ? 0 : op->size)
  1076.     + sizeof(u_int32_t)
  1077.     + sizeof(u_int32_t) + (key == NULL ? 0 : key->size)
  1078.     + sizeof(u_int32_t) + (data == NULL ? 0 : data->size)
  1079.     + sizeof(u_int32_t);
  1080. if (CRYPTO_ON(dbenv)) {
  1081. npad =
  1082.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  1083. logrec.size += npad;
  1084. }
  1085. if ((ret = __os_malloc(dbenv,
  1086.     logrec.size, &logrec.data)) != 0)
  1087. return (ret);
  1088. if (npad > 0)
  1089. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  1090. bp = logrec.data;
  1091. memcpy(bp, &rectype, sizeof(rectype));
  1092. bp += sizeof(rectype);
  1093. memcpy(bp, &txn_num, sizeof(txn_num));
  1094. bp += sizeof(txn_num);
  1095. memcpy(bp, lsnp, sizeof(DB_LSN));
  1096. bp += sizeof(DB_LSN);
  1097. if (op == NULL) {
  1098. zero = 0;
  1099. memcpy(bp, &zero, sizeof(u_int32_t));
  1100. bp += sizeof(u_int32_t);
  1101. } else {
  1102. memcpy(bp, &op->size, sizeof(op->size));
  1103. bp += sizeof(op->size);
  1104. memcpy(bp, op->data, op->size);
  1105. bp += op->size;
  1106. }
  1107. uinttmp = (u_int32_t)fileid;
  1108. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1109. bp += sizeof(uinttmp);
  1110. if (key == NULL) {
  1111. zero = 0;
  1112. memcpy(bp, &zero, sizeof(u_int32_t));
  1113. bp += sizeof(u_int32_t);
  1114. } else {
  1115. memcpy(bp, &key->size, sizeof(key->size));
  1116. bp += sizeof(key->size);
  1117. memcpy(bp, key->data, key->size);
  1118. bp += key->size;
  1119. }
  1120. if (data == NULL) {
  1121. zero = 0;
  1122. memcpy(bp, &zero, sizeof(u_int32_t));
  1123. bp += sizeof(u_int32_t);
  1124. } else {
  1125. memcpy(bp, &data->size, sizeof(data->size));
  1126. bp += sizeof(data->size);
  1127. memcpy(bp, data->data, data->size);
  1128. bp += data->size;
  1129. }
  1130. uinttmp = (u_int32_t)arg_flags;
  1131. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1132. bp += sizeof(uinttmp);
  1133. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1134. ret = dbenv->log_put(dbenv,
  1135.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1136. if (txnid != NULL && ret == 0)
  1137. txnid->last_lsn = *ret_lsnp;
  1138. #ifdef LOG_DIAGNOSTIC
  1139. if (ret != 0)
  1140. (void)__db_debug_print(dbenv,
  1141.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  1142. #endif
  1143. __os_free(dbenv, logrec.data);
  1144. return (ret);
  1145. }
  1146. /*
  1147.  * PUBLIC: int __db_debug_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  1148.  * PUBLIC:     db_recops, void *));
  1149.  */
  1150. int
  1151. __db_debug_getpgnos(dbenv, rec, lsnp, notused1, summary)
  1152. DB_ENV *dbenv;
  1153. DBT *rec;
  1154. DB_LSN *lsnp;
  1155. db_recops notused1;
  1156. void *summary;
  1157. {
  1158. TXN_RECS *t;
  1159. int ret;
  1160. COMPQUIET(rec, NULL);
  1161. COMPQUIET(notused1, DB_TXN_ABORT);
  1162. t = (TXN_RECS *)summary;
  1163. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  1164. return (ret);
  1165. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  1166. t->array[t->npages].lsn = *lsnp;
  1167. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  1168. memset(&t->array[t->npages].pgdesc, 0,
  1169.     sizeof(t->array[t->npages].pgdesc));
  1170. t->npages++;
  1171. return (0);
  1172. }
  1173. /*
  1174.  * PUBLIC: int __db_debug_print __P((DB_ENV *, DBT *, DB_LSN *,
  1175.  * PUBLIC:     db_recops, void *));
  1176.  */
  1177. int
  1178. __db_debug_print(dbenv, dbtp, lsnp, notused2, notused3)
  1179. DB_ENV *dbenv;
  1180. DBT *dbtp;
  1181. DB_LSN *lsnp;
  1182. db_recops notused2;
  1183. void *notused3;
  1184. {
  1185. __db_debug_args *argp;
  1186. u_int32_t i;
  1187. int ch;
  1188. int ret;
  1189. notused2 = DB_TXN_ABORT;
  1190. notused3 = NULL;
  1191. if ((ret = __db_debug_read(dbenv, dbtp->data, &argp)) != 0)
  1192. return (ret);
  1193. (void)printf(
  1194.     "[%lu][%lu]__db_debug: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1195.     (u_long)lsnp->file,
  1196.     (u_long)lsnp->offset,
  1197.     (u_long)argp->type,
  1198.     (u_long)argp->txnid->txnid,
  1199.     (u_long)argp->prev_lsn.file,
  1200.     (u_long)argp->prev_lsn.offset);
  1201. (void)printf("top: ");
  1202. for (i = 0; i < argp->op.size; i++) {
  1203. ch = ((u_int8_t *)argp->op.data)[i];
  1204. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  1205. }
  1206. (void)printf("n");
  1207. (void)printf("tfileid: %ldn", (long)argp->fileid);
  1208. (void)printf("tkey: ");
  1209. for (i = 0; i < argp->key.size; i++) {
  1210. ch = ((u_int8_t *)argp->key.data)[i];
  1211. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  1212. }
  1213. (void)printf("n");
  1214. (void)printf("tdata: ");
  1215. for (i = 0; i < argp->data.size; i++) {
  1216. ch = ((u_int8_t *)argp->data.data)[i];
  1217. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  1218. }
  1219. (void)printf("n");
  1220. (void)printf("targ_flags: %lun", (u_long)argp->arg_flags);
  1221. (void)printf("n");
  1222. __os_free(dbenv, argp);
  1223. return (0);
  1224. }
  1225. /*
  1226.  * PUBLIC: int __db_debug_read __P((DB_ENV *, void *, __db_debug_args **));
  1227.  */
  1228. int
  1229. __db_debug_read(dbenv, recbuf, argpp)
  1230. DB_ENV *dbenv;
  1231. void *recbuf;
  1232. __db_debug_args **argpp;
  1233. {
  1234. __db_debug_args *argp;
  1235. u_int32_t uinttmp;
  1236. u_int8_t *bp;
  1237. int ret;
  1238. if ((ret = __os_malloc(dbenv,
  1239.     sizeof(__db_debug_args) + sizeof(DB_TXN), &argp)) != 0)
  1240. return (ret);
  1241. argp->txnid = (DB_TXN *)&argp[1];
  1242. bp = recbuf;
  1243. memcpy(&argp->type, bp, sizeof(argp->type));
  1244. bp += sizeof(argp->type);
  1245. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1246. bp += sizeof(argp->txnid->txnid);
  1247. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1248. bp += sizeof(DB_LSN);
  1249. memset(&argp->op, 0, sizeof(argp->op));
  1250. memcpy(&argp->op.size, bp, sizeof(u_int32_t));
  1251. bp += sizeof(u_int32_t);
  1252. argp->op.data = bp;
  1253. bp += argp->op.size;
  1254. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1255. argp->fileid = (int32_t)uinttmp;
  1256. bp += sizeof(uinttmp);
  1257. memset(&argp->key, 0, sizeof(argp->key));
  1258. memcpy(&argp->key.size, bp, sizeof(u_int32_t));
  1259. bp += sizeof(u_int32_t);
  1260. argp->key.data = bp;
  1261. bp += argp->key.size;
  1262. memset(&argp->data, 0, sizeof(argp->data));
  1263. memcpy(&argp->data.size, bp, sizeof(u_int32_t));
  1264. bp += sizeof(u_int32_t);
  1265. argp->data.data = bp;
  1266. bp += argp->data.size;
  1267. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1268. argp->arg_flags = (u_int32_t)uinttmp;
  1269. bp += sizeof(uinttmp);
  1270. *argpp = argp;
  1271. return (0);
  1272. }
  1273. /*
  1274.  * PUBLIC: int __db_noop_log __P((DB *, DB_TXN *, DB_LSN *,
  1275.  * PUBLIC:     u_int32_t, db_pgno_t, DB_LSN *));
  1276.  */
  1277. int
  1278. __db_noop_log(dbp, txnid, ret_lsnp, flags, pgno, prevlsn)
  1279. DB *dbp;
  1280. DB_TXN *txnid;
  1281. DB_LSN *ret_lsnp;
  1282. u_int32_t flags;
  1283. db_pgno_t pgno;
  1284. DB_LSN * prevlsn;
  1285. {
  1286. DBT logrec;
  1287. DB_ENV *dbenv;
  1288. DB_LSN *lsnp, null_lsn;
  1289. u_int32_t uinttmp;
  1290. u_int32_t npad, rectype, txn_num;
  1291. int ret;
  1292. u_int8_t *bp;
  1293. dbenv = dbp->dbenv;
  1294. rectype = DB___db_noop;
  1295. npad = 0;
  1296. if (txnid == NULL) {
  1297. txn_num = 0;
  1298. null_lsn.file = 0;
  1299. null_lsn.offset = 0;
  1300. lsnp = &null_lsn;
  1301. } else {
  1302. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  1303.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1304. return (ret);
  1305. txn_num = txnid->txnid;
  1306. lsnp = &txnid->last_lsn;
  1307. }
  1308. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1309.     + sizeof(u_int32_t)
  1310.     + sizeof(u_int32_t)
  1311.     + sizeof(*prevlsn);
  1312. if (CRYPTO_ON(dbenv)) {
  1313. npad =
  1314.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  1315. logrec.size += npad;
  1316. }
  1317. if ((ret = __os_malloc(dbenv,
  1318.     logrec.size, &logrec.data)) != 0)
  1319. return (ret);
  1320. if (npad > 0)
  1321. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  1322. bp = logrec.data;
  1323. memcpy(bp, &rectype, sizeof(rectype));
  1324. bp += sizeof(rectype);
  1325. memcpy(bp, &txn_num, sizeof(txn_num));
  1326. bp += sizeof(txn_num);
  1327. memcpy(bp, lsnp, sizeof(DB_LSN));
  1328. bp += sizeof(DB_LSN);
  1329. DB_ASSERT(dbp->log_filename != NULL);
  1330. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  1331.     (ret = __dbreg_lazy_id(dbp)) != 0)
  1332. return (ret);
  1333. uinttmp = (u_int32_t)dbp->log_filename->id;
  1334. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1335. bp += sizeof(uinttmp);
  1336. uinttmp = (u_int32_t)pgno;
  1337. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1338. bp += sizeof(uinttmp);
  1339. if (prevlsn != NULL)
  1340. memcpy(bp, prevlsn, sizeof(*prevlsn));
  1341. else
  1342. memset(bp, 0, sizeof(*prevlsn));
  1343. bp += sizeof(*prevlsn);
  1344. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1345. ret = dbenv->log_put(dbenv,
  1346.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1347. if (txnid != NULL && ret == 0)
  1348. txnid->last_lsn = *ret_lsnp;
  1349. #ifdef LOG_DIAGNOSTIC
  1350. if (ret != 0)
  1351. (void)__db_noop_print(dbenv,
  1352.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  1353. #endif
  1354. __os_free(dbenv, logrec.data);
  1355. return (ret);
  1356. }
  1357. /*
  1358.  * PUBLIC: int __db_noop_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  1359.  * PUBLIC:     db_recops, void *));
  1360.  */
  1361. int
  1362. __db_noop_getpgnos(dbenv, rec, lsnp, notused1, summary)
  1363. DB_ENV *dbenv;
  1364. DBT *rec;
  1365. DB_LSN *lsnp;
  1366. db_recops notused1;
  1367. void *summary;
  1368. {
  1369. DB *dbp;
  1370. TXN_RECS *t;
  1371. __db_noop_args *argp;
  1372. u_int32_t ret;
  1373. COMPQUIET(notused1, DB_TXN_ABORT);
  1374. argp = NULL;
  1375. t = (TXN_RECS *)summary;
  1376. if ((ret = __db_noop_read(dbenv, rec->data, &argp)) != 0)
  1377. return (ret);
  1378. if ((ret = __dbreg_id_to_db(dbenv,
  1379.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  1380. goto err;
  1381. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  1382. goto err;
  1383. t->array[t->npages].flags = 0;
  1384. t->array[t->npages].fid = argp->fileid;
  1385. t->array[t->npages].lsn = *lsnp;
  1386. t->array[t->npages].pgdesc.pgno = argp->pgno;
  1387. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  1388. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  1389.     DB_FILE_ID_LEN);
  1390. t->npages++;
  1391. err: if (argp != NULL)
  1392. __os_free(dbenv, argp);
  1393. return (ret);
  1394. }
  1395. /*
  1396.  * PUBLIC: int __db_noop_print __P((DB_ENV *, DBT *, DB_LSN *,
  1397.  * PUBLIC:     db_recops, void *));
  1398.  */
  1399. int
  1400. __db_noop_print(dbenv, dbtp, lsnp, notused2, notused3)
  1401. DB_ENV *dbenv;
  1402. DBT *dbtp;
  1403. DB_LSN *lsnp;
  1404. db_recops notused2;
  1405. void *notused3;
  1406. {
  1407. __db_noop_args *argp;
  1408. int ret;
  1409. notused2 = DB_TXN_ABORT;
  1410. notused3 = NULL;
  1411. if ((ret = __db_noop_read(dbenv, dbtp->data, &argp)) != 0)
  1412. return (ret);
  1413. (void)printf(
  1414.     "[%lu][%lu]__db_noop: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1415.     (u_long)lsnp->file,
  1416.     (u_long)lsnp->offset,
  1417.     (u_long)argp->type,
  1418.     (u_long)argp->txnid->txnid,
  1419.     (u_long)argp->prev_lsn.file,
  1420.     (u_long)argp->prev_lsn.offset);
  1421. (void)printf("tfileid: %ldn", (long)argp->fileid);
  1422. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  1423. (void)printf("tprevlsn: [%lu][%lu]n",
  1424.     (u_long)argp->prevlsn.file, (u_long)argp->prevlsn.offset);
  1425. (void)printf("n");
  1426. __os_free(dbenv, argp);
  1427. return (0);
  1428. }
  1429. /*
  1430.  * PUBLIC: int __db_noop_read __P((DB_ENV *, void *, __db_noop_args **));
  1431.  */
  1432. int
  1433. __db_noop_read(dbenv, recbuf, argpp)
  1434. DB_ENV *dbenv;
  1435. void *recbuf;
  1436. __db_noop_args **argpp;
  1437. {
  1438. __db_noop_args *argp;
  1439. u_int32_t uinttmp;
  1440. u_int8_t *bp;
  1441. int ret;
  1442. if ((ret = __os_malloc(dbenv,
  1443.     sizeof(__db_noop_args) + sizeof(DB_TXN), &argp)) != 0)
  1444. return (ret);
  1445. argp->txnid = (DB_TXN *)&argp[1];
  1446. bp = recbuf;
  1447. memcpy(&argp->type, bp, sizeof(argp->type));
  1448. bp += sizeof(argp->type);
  1449. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1450. bp += sizeof(argp->txnid->txnid);
  1451. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1452. bp += sizeof(DB_LSN);
  1453. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1454. argp->fileid = (int32_t)uinttmp;
  1455. bp += sizeof(uinttmp);
  1456. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1457. argp->pgno = (db_pgno_t)uinttmp;
  1458. bp += sizeof(uinttmp);
  1459. memcpy(&argp->prevlsn, bp,  sizeof(argp->prevlsn));
  1460. bp += sizeof(argp->prevlsn);
  1461. *argpp = argp;
  1462. return (0);
  1463. }
  1464. /*
  1465.  * PUBLIC: int __db_pg_alloc_log __P((DB *, DB_TXN *, DB_LSN *,
  1466.  * PUBLIC:     u_int32_t, DB_LSN *, db_pgno_t, DB_LSN *, db_pgno_t, u_int32_t,
  1467.  * PUBLIC:     db_pgno_t));
  1468.  */
  1469. int
  1470. __db_pg_alloc_log(dbp, txnid, ret_lsnp, flags, meta_lsn, meta_pgno, page_lsn, pgno, ptype,
  1471.     next)
  1472. DB *dbp;
  1473. DB_TXN *txnid;
  1474. DB_LSN *ret_lsnp;
  1475. u_int32_t flags;
  1476. DB_LSN * meta_lsn;
  1477. db_pgno_t meta_pgno;
  1478. DB_LSN * page_lsn;
  1479. db_pgno_t pgno;
  1480. u_int32_t ptype;
  1481. db_pgno_t next;
  1482. {
  1483. DBT logrec;
  1484. DB_ENV *dbenv;
  1485. DB_LSN *lsnp, null_lsn;
  1486. u_int32_t uinttmp;
  1487. u_int32_t npad, rectype, txn_num;
  1488. int ret;
  1489. u_int8_t *bp;
  1490. dbenv = dbp->dbenv;
  1491. rectype = DB___db_pg_alloc;
  1492. npad = 0;
  1493. if (txnid == NULL) {
  1494. txn_num = 0;
  1495. null_lsn.file = 0;
  1496. null_lsn.offset = 0;
  1497. lsnp = &null_lsn;
  1498. } else {
  1499. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  1500.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1501. return (ret);
  1502. txn_num = txnid->txnid;
  1503. lsnp = &txnid->last_lsn;
  1504. }
  1505. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1506.     + sizeof(u_int32_t)
  1507.     + sizeof(*meta_lsn)
  1508.     + sizeof(u_int32_t)
  1509.     + sizeof(*page_lsn)
  1510.     + sizeof(u_int32_t)
  1511.     + sizeof(u_int32_t)
  1512.     + sizeof(u_int32_t);
  1513. if (CRYPTO_ON(dbenv)) {
  1514. npad =
  1515.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  1516. logrec.size += npad;
  1517. }
  1518. if ((ret = __os_malloc(dbenv,
  1519.     logrec.size, &logrec.data)) != 0)
  1520. return (ret);
  1521. if (npad > 0)
  1522. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  1523. bp = logrec.data;
  1524. memcpy(bp, &rectype, sizeof(rectype));
  1525. bp += sizeof(rectype);
  1526. memcpy(bp, &txn_num, sizeof(txn_num));
  1527. bp += sizeof(txn_num);
  1528. memcpy(bp, lsnp, sizeof(DB_LSN));
  1529. bp += sizeof(DB_LSN);
  1530. DB_ASSERT(dbp->log_filename != NULL);
  1531. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  1532.     (ret = __dbreg_lazy_id(dbp)) != 0)
  1533. return (ret);
  1534. uinttmp = (u_int32_t)dbp->log_filename->id;
  1535. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1536. bp += sizeof(uinttmp);
  1537. if (meta_lsn != NULL)
  1538. memcpy(bp, meta_lsn, sizeof(*meta_lsn));
  1539. else
  1540. memset(bp, 0, sizeof(*meta_lsn));
  1541. bp += sizeof(*meta_lsn);
  1542. uinttmp = (u_int32_t)meta_pgno;
  1543. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1544. bp += sizeof(uinttmp);
  1545. if (page_lsn != NULL)
  1546. memcpy(bp, page_lsn, sizeof(*page_lsn));
  1547. else
  1548. memset(bp, 0, sizeof(*page_lsn));
  1549. bp += sizeof(*page_lsn);
  1550. uinttmp = (u_int32_t)pgno;
  1551. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1552. bp += sizeof(uinttmp);
  1553. uinttmp = (u_int32_t)ptype;
  1554. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1555. bp += sizeof(uinttmp);
  1556. uinttmp = (u_int32_t)next;
  1557. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1558. bp += sizeof(uinttmp);
  1559. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1560. ret = dbenv->log_put(dbenv,
  1561.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1562. if (txnid != NULL && ret == 0)
  1563. txnid->last_lsn = *ret_lsnp;
  1564. #ifdef LOG_DIAGNOSTIC
  1565. if (ret != 0)
  1566. (void)__db_pg_alloc_print(dbenv,
  1567.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  1568. #endif
  1569. __os_free(dbenv, logrec.data);
  1570. return (ret);
  1571. }
  1572. /*
  1573.  * PUBLIC: int __db_pg_alloc_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  1574.  * PUBLIC:     db_recops, void *));
  1575.  */
  1576. int
  1577. __db_pg_alloc_getpgnos(dbenv, rec, lsnp, notused1, summary)
  1578. DB_ENV *dbenv;
  1579. DBT *rec;
  1580. DB_LSN *lsnp;
  1581. db_recops notused1;
  1582. void *summary;
  1583. {
  1584. DB *dbp;
  1585. TXN_RECS *t;
  1586. __db_pg_alloc_args *argp;
  1587. u_int32_t ret;
  1588. COMPQUIET(notused1, DB_TXN_ABORT);
  1589. argp = NULL;
  1590. t = (TXN_RECS *)summary;
  1591. if ((ret = __db_pg_alloc_read(dbenv, rec->data, &argp)) != 0)
  1592. return (ret);
  1593. if ((ret = __dbreg_id_to_db(dbenv,
  1594.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  1595. goto err;
  1596. if ((ret = __rep_check_alloc(dbenv, t, 2)) != 0)
  1597. goto err;
  1598. t->array[t->npages].flags = 0;
  1599. t->array[t->npages].fid = argp->fileid;
  1600. t->array[t->npages].lsn = *lsnp;
  1601. t->array[t->npages].pgdesc.pgno = argp->meta_pgno;
  1602. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  1603. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  1604.     DB_FILE_ID_LEN);
  1605. t->npages++;
  1606. t->array[t->npages].flags = 0;
  1607. t->array[t->npages].fid = argp->fileid;
  1608. t->array[t->npages].lsn = *lsnp;
  1609. t->array[t->npages].pgdesc.pgno = argp->pgno;
  1610. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  1611. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  1612.     DB_FILE_ID_LEN);
  1613. t->npages++;
  1614. err: if (argp != NULL)
  1615. __os_free(dbenv, argp);
  1616. return (ret);
  1617. }
  1618. /*
  1619.  * PUBLIC: int __db_pg_alloc_print __P((DB_ENV *, DBT *, DB_LSN *,
  1620.  * PUBLIC:     db_recops, void *));
  1621.  */
  1622. int
  1623. __db_pg_alloc_print(dbenv, dbtp, lsnp, notused2, notused3)
  1624. DB_ENV *dbenv;
  1625. DBT *dbtp;
  1626. DB_LSN *lsnp;
  1627. db_recops notused2;
  1628. void *notused3;
  1629. {
  1630. __db_pg_alloc_args *argp;
  1631. int ret;
  1632. notused2 = DB_TXN_ABORT;
  1633. notused3 = NULL;
  1634. if ((ret = __db_pg_alloc_read(dbenv, dbtp->data, &argp)) != 0)
  1635. return (ret);
  1636. (void)printf(
  1637.     "[%lu][%lu]__db_pg_alloc: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1638.     (u_long)lsnp->file,
  1639.     (u_long)lsnp->offset,
  1640.     (u_long)argp->type,
  1641.     (u_long)argp->txnid->txnid,
  1642.     (u_long)argp->prev_lsn.file,
  1643.     (u_long)argp->prev_lsn.offset);
  1644. (void)printf("tfileid: %ldn", (long)argp->fileid);
  1645. (void)printf("tmeta_lsn: [%lu][%lu]n",
  1646.     (u_long)argp->meta_lsn.file, (u_long)argp->meta_lsn.offset);
  1647. (void)printf("tmeta_pgno: %lun", (u_long)argp->meta_pgno);
  1648. (void)printf("tpage_lsn: [%lu][%lu]n",
  1649.     (u_long)argp->page_lsn.file, (u_long)argp->page_lsn.offset);
  1650. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  1651. (void)printf("tptype: %lun", (u_long)argp->ptype);
  1652. (void)printf("tnext: %lun", (u_long)argp->next);
  1653. (void)printf("n");
  1654. __os_free(dbenv, argp);
  1655. return (0);
  1656. }
  1657. /*
  1658.  * PUBLIC: int __db_pg_alloc_read __P((DB_ENV *, void *,
  1659.  * PUBLIC:     __db_pg_alloc_args **));
  1660.  */
  1661. int
  1662. __db_pg_alloc_read(dbenv, recbuf, argpp)
  1663. DB_ENV *dbenv;
  1664. void *recbuf;
  1665. __db_pg_alloc_args **argpp;
  1666. {
  1667. __db_pg_alloc_args *argp;
  1668. u_int32_t uinttmp;
  1669. u_int8_t *bp;
  1670. int ret;
  1671. if ((ret = __os_malloc(dbenv,
  1672.     sizeof(__db_pg_alloc_args) + sizeof(DB_TXN), &argp)) != 0)
  1673. return (ret);
  1674. argp->txnid = (DB_TXN *)&argp[1];
  1675. bp = recbuf;
  1676. memcpy(&argp->type, bp, sizeof(argp->type));
  1677. bp += sizeof(argp->type);
  1678. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1679. bp += sizeof(argp->txnid->txnid);
  1680. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1681. bp += sizeof(DB_LSN);
  1682. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1683. argp->fileid = (int32_t)uinttmp;
  1684. bp += sizeof(uinttmp);
  1685. memcpy(&argp->meta_lsn, bp,  sizeof(argp->meta_lsn));
  1686. bp += sizeof(argp->meta_lsn);
  1687. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1688. argp->meta_pgno = (db_pgno_t)uinttmp;
  1689. bp += sizeof(uinttmp);
  1690. memcpy(&argp->page_lsn, bp,  sizeof(argp->page_lsn));
  1691. bp += sizeof(argp->page_lsn);
  1692. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1693. argp->pgno = (db_pgno_t)uinttmp;
  1694. bp += sizeof(uinttmp);
  1695. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1696. argp->ptype = (u_int32_t)uinttmp;
  1697. bp += sizeof(uinttmp);
  1698. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1699. argp->next = (db_pgno_t)uinttmp;
  1700. bp += sizeof(uinttmp);
  1701. *argpp = argp;
  1702. return (0);
  1703. }
  1704. /*
  1705.  * PUBLIC: int __db_pg_free_log __P((DB *, DB_TXN *, DB_LSN *,
  1706.  * PUBLIC:     u_int32_t, db_pgno_t, DB_LSN *, db_pgno_t, const DBT *,
  1707.  * PUBLIC:     db_pgno_t));
  1708.  */
  1709. int
  1710. __db_pg_free_log(dbp, txnid, ret_lsnp, flags, pgno, meta_lsn, meta_pgno, header, next)
  1711. DB *dbp;
  1712. DB_TXN *txnid;
  1713. DB_LSN *ret_lsnp;
  1714. u_int32_t flags;
  1715. db_pgno_t pgno;
  1716. DB_LSN * meta_lsn;
  1717. db_pgno_t meta_pgno;
  1718. const DBT *header;
  1719. db_pgno_t next;
  1720. {
  1721. DBT logrec;
  1722. DB_ENV *dbenv;
  1723. DB_LSN *lsnp, null_lsn;
  1724. u_int32_t zero;
  1725. u_int32_t uinttmp;
  1726. u_int32_t npad, rectype, txn_num;
  1727. int ret;
  1728. u_int8_t *bp;
  1729. dbenv = dbp->dbenv;
  1730. rectype = DB___db_pg_free;
  1731. npad = 0;
  1732. if (txnid == NULL) {
  1733. txn_num = 0;
  1734. null_lsn.file = 0;
  1735. null_lsn.offset = 0;
  1736. lsnp = &null_lsn;
  1737. } else {
  1738. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  1739.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1740. return (ret);
  1741. txn_num = txnid->txnid;
  1742. lsnp = &txnid->last_lsn;
  1743. }
  1744. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1745.     + sizeof(u_int32_t)
  1746.     + sizeof(u_int32_t)
  1747.     + sizeof(*meta_lsn)
  1748.     + sizeof(u_int32_t)
  1749.     + sizeof(u_int32_t) + (header == NULL ? 0 : header->size)
  1750.     + sizeof(u_int32_t);
  1751. if (CRYPTO_ON(dbenv)) {
  1752. npad =
  1753.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  1754. logrec.size += npad;
  1755. }
  1756. if ((ret = __os_malloc(dbenv,
  1757.     logrec.size, &logrec.data)) != 0)
  1758. return (ret);
  1759. if (npad > 0)
  1760. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  1761. bp = logrec.data;
  1762. memcpy(bp, &rectype, sizeof(rectype));
  1763. bp += sizeof(rectype);
  1764. memcpy(bp, &txn_num, sizeof(txn_num));
  1765. bp += sizeof(txn_num);
  1766. memcpy(bp, lsnp, sizeof(DB_LSN));
  1767. bp += sizeof(DB_LSN);
  1768. DB_ASSERT(dbp->log_filename != NULL);
  1769. if (dbp->log_filename->id == DB_LOGFILEID_INVALID &&
  1770.     (ret = __dbreg_lazy_id(dbp)) != 0)
  1771. return (ret);
  1772. uinttmp = (u_int32_t)dbp->log_filename->id;
  1773. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1774. bp += sizeof(uinttmp);
  1775. uinttmp = (u_int32_t)pgno;
  1776. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1777. bp += sizeof(uinttmp);
  1778. if (meta_lsn != NULL)
  1779. memcpy(bp, meta_lsn, sizeof(*meta_lsn));
  1780. else
  1781. memset(bp, 0, sizeof(*meta_lsn));
  1782. bp += sizeof(*meta_lsn);
  1783. uinttmp = (u_int32_t)meta_pgno;
  1784. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1785. bp += sizeof(uinttmp);
  1786. if (header == NULL) {
  1787. zero = 0;
  1788. memcpy(bp, &zero, sizeof(u_int32_t));
  1789. bp += sizeof(u_int32_t);
  1790. } else {
  1791. memcpy(bp, &header->size, sizeof(header->size));
  1792. bp += sizeof(header->size);
  1793. memcpy(bp, header->data, header->size);
  1794. bp += header->size;
  1795. }
  1796. uinttmp = (u_int32_t)next;
  1797. memcpy(bp, &uinttmp, sizeof(uinttmp));
  1798. bp += sizeof(uinttmp);
  1799. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1800. ret = dbenv->log_put(dbenv,
  1801.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1802. if (txnid != NULL && ret == 0)
  1803. txnid->last_lsn = *ret_lsnp;
  1804. #ifdef LOG_DIAGNOSTIC
  1805. if (ret != 0)
  1806. (void)__db_pg_free_print(dbenv,
  1807.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  1808. #endif
  1809. __os_free(dbenv, logrec.data);
  1810. return (ret);
  1811. }
  1812. /*
  1813.  * PUBLIC: int __db_pg_free_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  1814.  * PUBLIC:     db_recops, void *));
  1815.  */
  1816. int
  1817. __db_pg_free_getpgnos(dbenv, rec, lsnp, notused1, summary)
  1818. DB_ENV *dbenv;
  1819. DBT *rec;
  1820. DB_LSN *lsnp;
  1821. db_recops notused1;
  1822. void *summary;
  1823. {
  1824. DB *dbp;
  1825. TXN_RECS *t;
  1826. __db_pg_free_args *argp;
  1827. u_int32_t ret;
  1828. COMPQUIET(notused1, DB_TXN_ABORT);
  1829. argp = NULL;
  1830. t = (TXN_RECS *)summary;
  1831. if ((ret = __db_pg_free_read(dbenv, rec->data, &argp)) != 0)
  1832. return (ret);
  1833. if ((ret = __dbreg_id_to_db(dbenv,
  1834.     argp->txnid, &dbp, argp->fileid, 0)) != 0)
  1835. goto err;
  1836. if ((ret = __rep_check_alloc(dbenv, t, 2)) != 0)
  1837. goto err;
  1838. t->array[t->npages].flags = 0;
  1839. t->array[t->npages].fid = argp->fileid;
  1840. t->array[t->npages].lsn = *lsnp;
  1841. t->array[t->npages].pgdesc.pgno = argp->pgno;
  1842. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  1843. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  1844.     DB_FILE_ID_LEN);
  1845. t->npages++;
  1846. t->array[t->npages].flags = 0;
  1847. t->array[t->npages].fid = argp->fileid;
  1848. t->array[t->npages].lsn = *lsnp;
  1849. t->array[t->npages].pgdesc.pgno = argp->meta_pgno;
  1850. t->array[t->npages].pgdesc.type = DB_PAGE_LOCK;
  1851. memcpy(t->array[t->npages].pgdesc.fileid, dbp->fileid,
  1852.     DB_FILE_ID_LEN);
  1853. t->npages++;
  1854. err: if (argp != NULL)
  1855. __os_free(dbenv, argp);
  1856. return (ret);
  1857. }
  1858. /*
  1859.  * PUBLIC: int __db_pg_free_print __P((DB_ENV *, DBT *, DB_LSN *,
  1860.  * PUBLIC:     db_recops, void *));
  1861.  */
  1862. int
  1863. __db_pg_free_print(dbenv, dbtp, lsnp, notused2, notused3)
  1864. DB_ENV *dbenv;
  1865. DBT *dbtp;
  1866. DB_LSN *lsnp;
  1867. db_recops notused2;
  1868. void *notused3;
  1869. {
  1870. __db_pg_free_args *argp;
  1871. u_int32_t i;
  1872. int ch;
  1873. int ret;
  1874. notused2 = DB_TXN_ABORT;
  1875. notused3 = NULL;
  1876. if ((ret = __db_pg_free_read(dbenv, dbtp->data, &argp)) != 0)
  1877. return (ret);
  1878. (void)printf(
  1879.     "[%lu][%lu]__db_pg_free: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1880.     (u_long)lsnp->file,
  1881.     (u_long)lsnp->offset,
  1882.     (u_long)argp->type,
  1883.     (u_long)argp->txnid->txnid,
  1884.     (u_long)argp->prev_lsn.file,
  1885.     (u_long)argp->prev_lsn.offset);
  1886. (void)printf("tfileid: %ldn", (long)argp->fileid);
  1887. (void)printf("tpgno: %lun", (u_long)argp->pgno);
  1888. (void)printf("tmeta_lsn: [%lu][%lu]n",
  1889.     (u_long)argp->meta_lsn.file, (u_long)argp->meta_lsn.offset);
  1890. (void)printf("tmeta_pgno: %lun", (u_long)argp->meta_pgno);
  1891. (void)printf("theader: ");
  1892. for (i = 0; i < argp->header.size; i++) {
  1893. ch = ((u_int8_t *)argp->header.data)[i];
  1894. printf(isprint(ch) || ch == 0x0a ? "%c" : "%#x ", ch);
  1895. }
  1896. (void)printf("n");
  1897. (void)printf("tnext: %lun", (u_long)argp->next);
  1898. (void)printf("n");
  1899. __os_free(dbenv, argp);
  1900. return (0);
  1901. }
  1902. /*
  1903.  * PUBLIC: int __db_pg_free_read __P((DB_ENV *, void *, __db_pg_free_args **));
  1904.  */
  1905. int
  1906. __db_pg_free_read(dbenv, recbuf, argpp)
  1907. DB_ENV *dbenv;
  1908. void *recbuf;
  1909. __db_pg_free_args **argpp;
  1910. {
  1911. __db_pg_free_args *argp;
  1912. u_int32_t uinttmp;
  1913. u_int8_t *bp;
  1914. int ret;
  1915. if ((ret = __os_malloc(dbenv,
  1916.     sizeof(__db_pg_free_args) + sizeof(DB_TXN), &argp)) != 0)
  1917. return (ret);
  1918. argp->txnid = (DB_TXN *)&argp[1];
  1919. bp = recbuf;
  1920. memcpy(&argp->type, bp, sizeof(argp->type));
  1921. bp += sizeof(argp->type);
  1922. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1923. bp += sizeof(argp->txnid->txnid);
  1924. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1925. bp += sizeof(DB_LSN);
  1926. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1927. argp->fileid = (int32_t)uinttmp;
  1928. bp += sizeof(uinttmp);
  1929. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1930. argp->pgno = (db_pgno_t)uinttmp;
  1931. bp += sizeof(uinttmp);
  1932. memcpy(&argp->meta_lsn, bp,  sizeof(argp->meta_lsn));
  1933. bp += sizeof(argp->meta_lsn);
  1934. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1935. argp->meta_pgno = (db_pgno_t)uinttmp;
  1936. bp += sizeof(uinttmp);
  1937. memset(&argp->header, 0, sizeof(argp->header));
  1938. memcpy(&argp->header.size, bp, sizeof(u_int32_t));
  1939. bp += sizeof(u_int32_t);
  1940. argp->header.data = bp;
  1941. bp += argp->header.size;
  1942. memcpy(&uinttmp, bp, sizeof(uinttmp));
  1943. argp->next = (db_pgno_t)uinttmp;
  1944. bp += sizeof(uinttmp);
  1945. *argpp = argp;
  1946. return (0);
  1947. }
  1948. /*
  1949.  * PUBLIC: int __db_cksum_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t));
  1950.  */
  1951. int
  1952. __db_cksum_log(dbenv, txnid, ret_lsnp, flags)
  1953. DB_ENV *dbenv;
  1954. DB_TXN *txnid;
  1955. DB_LSN *ret_lsnp;
  1956. u_int32_t flags;
  1957. {
  1958. DBT logrec;
  1959. DB_LSN *lsnp, null_lsn;
  1960. u_int32_t npad, rectype, txn_num;
  1961. int ret;
  1962. u_int8_t *bp;
  1963. rectype = DB___db_cksum;
  1964. npad = 0;
  1965. if (txnid == NULL) {
  1966. txn_num = 0;
  1967. null_lsn.file = 0;
  1968. null_lsn.offset = 0;
  1969. lsnp = &null_lsn;
  1970. } else {
  1971. if (TAILQ_FIRST(&txnid->kids) != NULL &&
  1972.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1973. return (ret);
  1974. txn_num = txnid->txnid;
  1975. lsnp = &txnid->last_lsn;
  1976. }
  1977. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN);
  1978. if (CRYPTO_ON(dbenv)) {
  1979. npad =
  1980.     ((DB_CIPHER *)dbenv->crypto_handle)->adj_size(logrec.size);
  1981. logrec.size += npad;
  1982. }
  1983. if ((ret = __os_malloc(dbenv,
  1984.     logrec.size, &logrec.data)) != 0)
  1985. return (ret);
  1986. if (npad > 0)
  1987. memset((u_int8_t *)logrec.data + logrec.size - npad, 0, npad);
  1988. bp = logrec.data;
  1989. memcpy(bp, &rectype, sizeof(rectype));
  1990. bp += sizeof(rectype);
  1991. memcpy(bp, &txn_num, sizeof(txn_num));
  1992. bp += sizeof(txn_num);
  1993. memcpy(bp, lsnp, sizeof(DB_LSN));
  1994. bp += sizeof(DB_LSN);
  1995. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) <= logrec.size);
  1996. ret = dbenv->log_put(dbenv,
  1997.    ret_lsnp, (DBT *)&logrec, flags | DB_NOCOPY);
  1998. if (txnid != NULL && ret == 0)
  1999. txnid->last_lsn = *ret_lsnp;
  2000. #ifdef LOG_DIAGNOSTIC
  2001. if (ret != 0)
  2002. (void)__db_cksum_print(dbenv,
  2003.     (DBT *)&logrec, ret_lsnp, NULL, NULL);
  2004. #endif
  2005. __os_free(dbenv, logrec.data);
  2006. return (ret);
  2007. }
  2008. /*
  2009.  * PUBLIC: int __db_cksum_getpgnos __P((DB_ENV *, DBT *, DB_LSN *,
  2010.  * PUBLIC:     db_recops, void *));
  2011.  */
  2012. int
  2013. __db_cksum_getpgnos(dbenv, rec, lsnp, notused1, summary)
  2014. DB_ENV *dbenv;
  2015. DBT *rec;
  2016. DB_LSN *lsnp;
  2017. db_recops notused1;
  2018. void *summary;
  2019. {
  2020. TXN_RECS *t;
  2021. int ret;
  2022. COMPQUIET(rec, NULL);
  2023. COMPQUIET(notused1, DB_TXN_ABORT);
  2024. t = (TXN_RECS *)summary;
  2025. if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
  2026. return (ret);
  2027. t->array[t->npages].flags = LSN_PAGE_NOLOCK;
  2028. t->array[t->npages].lsn = *lsnp;
  2029. t->array[t->npages].fid = DB_LOGFILEID_INVALID;
  2030. memset(&t->array[t->npages].pgdesc, 0,
  2031.     sizeof(t->array[t->npages].pgdesc));
  2032. t->npages++;
  2033. return (0);
  2034. }
  2035. /*
  2036.  * PUBLIC: int __db_cksum_print __P((DB_ENV *, DBT *, DB_LSN *,
  2037.  * PUBLIC:     db_recops, void *));
  2038.  */
  2039. int
  2040. __db_cksum_print(dbenv, dbtp, lsnp, notused2, notused3)
  2041. DB_ENV *dbenv;
  2042. DBT *dbtp;
  2043. DB_LSN *lsnp;
  2044. db_recops notused2;
  2045. void *notused3;
  2046. {
  2047. __db_cksum_args *argp;
  2048. int ret;
  2049. notused2 = DB_TXN_ABORT;
  2050. notused3 = NULL;
  2051. if ((ret = __db_cksum_read(dbenv, dbtp->data, &argp)) != 0)
  2052. return (ret);
  2053. (void)printf(
  2054.     "[%lu][%lu]__db_cksum: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  2055.     (u_long)lsnp->file,
  2056.     (u_long)lsnp->offset,
  2057.     (u_long)argp->type,
  2058.     (u_long)argp->txnid->txnid,
  2059.     (u_long)argp->prev_lsn.file,
  2060.     (u_long)argp->prev_lsn.offset);
  2061. (void)printf("n");
  2062. __os_free(dbenv, argp);
  2063. return (0);
  2064. }
  2065. /*
  2066.  * PUBLIC: int __db_cksum_read __P((DB_ENV *, void *, __db_cksum_args **));
  2067.  */
  2068. int
  2069. __db_cksum_read(dbenv, recbuf, argpp)
  2070. DB_ENV *dbenv;
  2071. void *recbuf;
  2072. __db_cksum_args **argpp;
  2073. {
  2074. __db_cksum_args *argp;
  2075. u_int8_t *bp;
  2076. int ret;
  2077. if ((ret = __os_malloc(dbenv,
  2078.     sizeof(__db_cksum_args) + sizeof(DB_TXN), &argp)) != 0)
  2079. return (ret);
  2080. argp->txnid = (DB_TXN *)&argp[1];
  2081. bp = recbuf;
  2082. memcpy(&argp->type, bp, sizeof(argp->type));
  2083. bp += sizeof(argp->type);
  2084. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  2085. bp += sizeof(argp->txnid->txnid);
  2086. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  2087. bp += sizeof(DB_LSN);
  2088. *argpp = argp;
  2089. return (0);
  2090. }
  2091. /*
  2092.  * PUBLIC: int __db_init_print __P((DB_ENV *, int (***)(DB_ENV *,
  2093.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  2094.  */
  2095. int
  2096. __db_init_print(dbenv, dtabp, dtabsizep)
  2097. DB_ENV *dbenv;
  2098. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  2099. size_t *dtabsizep;
  2100. {
  2101. int ret;
  2102. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2103.     __db_addrem_print, DB___db_addrem)) != 0)
  2104. return (ret);
  2105. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2106.     __db_big_print, DB___db_big)) != 0)
  2107. return (ret);
  2108. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2109.     __db_ovref_print, DB___db_ovref)) != 0)
  2110. return (ret);
  2111. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2112.     __db_relink_print, DB___db_relink)) != 0)
  2113. return (ret);
  2114. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2115.     __db_debug_print, DB___db_debug)) != 0)
  2116. return (ret);
  2117. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2118.     __db_noop_print, DB___db_noop)) != 0)
  2119. return (ret);
  2120. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2121.     __db_pg_alloc_print, DB___db_pg_alloc)) != 0)
  2122. return (ret);
  2123. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2124.     __db_pg_free_print, DB___db_pg_free)) != 0)
  2125. return (ret);
  2126. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2127.     __db_cksum_print, DB___db_cksum)) != 0)
  2128. return (ret);
  2129. return (0);
  2130. }
  2131. /*
  2132.  * PUBLIC: int __db_init_getpgnos __P((DB_ENV *, int (***)(DB_ENV *,
  2133.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  2134.  */
  2135. int
  2136. __db_init_getpgnos(dbenv, dtabp, dtabsizep)
  2137. DB_ENV *dbenv;
  2138. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  2139. size_t *dtabsizep;
  2140. {
  2141. int ret;
  2142. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2143.     __db_addrem_getpgnos, DB___db_addrem)) != 0)
  2144. return (ret);
  2145. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2146.     __db_big_getpgnos, DB___db_big)) != 0)
  2147. return (ret);
  2148. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2149.     __db_ovref_getpgnos, DB___db_ovref)) != 0)
  2150. return (ret);
  2151. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2152.     __db_relink_getpgnos, DB___db_relink)) != 0)
  2153. return (ret);
  2154. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2155.     __db_debug_getpgnos, DB___db_debug)) != 0)
  2156. return (ret);
  2157. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2158.     __db_noop_getpgnos, DB___db_noop)) != 0)
  2159. return (ret);
  2160. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2161.     __db_pg_alloc_getpgnos, DB___db_pg_alloc)) != 0)
  2162. return (ret);
  2163. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2164.     __db_pg_free_getpgnos, DB___db_pg_free)) != 0)
  2165. return (ret);
  2166. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2167.     __db_cksum_getpgnos, DB___db_cksum)) != 0)
  2168. return (ret);
  2169. return (0);
  2170. }
  2171. /*
  2172.  * PUBLIC: int __db_init_recover __P((DB_ENV *, int (***)(DB_ENV *,
  2173.  * PUBLIC:     DBT *, DB_LSN *, db_recops, void *), size_t *));
  2174.  */
  2175. int
  2176. __db_init_recover(dbenv, dtabp, dtabsizep)
  2177. DB_ENV *dbenv;
  2178. int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  2179. size_t *dtabsizep;
  2180. {
  2181. int ret;
  2182. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2183.     __db_addrem_recover, DB___db_addrem)) != 0)
  2184. return (ret);
  2185. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2186.     __db_big_recover, DB___db_big)) != 0)
  2187. return (ret);
  2188. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2189.     __db_ovref_recover, DB___db_ovref)) != 0)
  2190. return (ret);
  2191. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2192.     __db_relink_recover, DB___db_relink)) != 0)
  2193. return (ret);
  2194. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2195.     __db_debug_recover, DB___db_debug)) != 0)
  2196. return (ret);
  2197. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2198.     __db_noop_recover, DB___db_noop)) != 0)
  2199. return (ret);
  2200. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2201.     __db_pg_alloc_recover, DB___db_pg_alloc)) != 0)
  2202. return (ret);
  2203. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2204.     __db_pg_free_recover, DB___db_pg_free)) != 0)
  2205. return (ret);
  2206. if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
  2207.     __db_cksum_recover, DB___db_cksum)) != 0)
  2208. return (ret);
  2209. return (0);
  2210. }