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

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