rec_btree
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:19k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #include "db_config.h"
  2. #ifndef NO_SYSTEM_INCLUDES
  3. #include <sys/types.h>
  4. #include <string.h>
  5. #endif
  6. #include "db_int.h"
  7. #include "db_page.h"
  8. #include "bam.h"
  9. #include "log.h"
  10. /*
  11.  * __bam_pg_alloc_recover --
  12.  * Recovery function for pg_alloc.
  13.  *
  14.  * PUBLIC: int __bam_pg_alloc_recover
  15.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  16.  */
  17. int
  18. __bam_pg_alloc_recover(dbenv, dbtp, lsnp, op, info)
  19. DB_ENV *dbenv;
  20. DBT *dbtp;
  21. DB_LSN *lsnp;
  22. db_recops op;
  23. void *info;
  24. {
  25. __bam_pg_alloc_args *argp;
  26. DB *file_dbp;
  27. DBC *dbc;
  28. DB_MPOOLFILE *mpf;
  29. PAGE *pagep;
  30. int cmp_n, cmp_p, modified, ret;
  31. REC_PRINT(__bam_pg_alloc_print);
  32. REC_INTRO(__bam_pg_alloc_read);
  33. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  34. if (DB_REDO(op)) {
  35. if ((ret = memp_fget(mpf,
  36.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  37. goto out;
  38. } else {
  39. *lsnp = argp->prev_lsn;
  40. ret = 0;
  41. goto out;
  42. }
  43. modified = 0;
  44. cmp_n = log_compare(lsnp, &LSN(pagep));
  45. /*
  46.  * Use this when there is something like "pagelsn" in the argp
  47.  * structure.  Sometimes, you might need to compare meta-data
  48.  * lsn's instead.
  49.  *
  50.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  51.  */
  52. if (cmp_p == 0 && DB_REDO(op)) {
  53. /* Need to redo update described. */
  54. modified = 1;
  55. } else if (cmp_n == 0 && !DB_REDO(op)) {
  56. /* Need to undo update described. */
  57. modified = 1;
  58. }
  59. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  60. goto out;
  61. *lsnp = argp->prev_lsn;
  62. ret = 0;
  63. out: REC_CLOSE;
  64. }
  65. /*
  66.  * __bam_pg_alloc1_recover --
  67.  * Recovery function for pg_alloc1.
  68.  *
  69.  * PUBLIC: int __bam_pg_alloc1_recover
  70.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  71.  */
  72. int
  73. __bam_pg_alloc1_recover(dbenv, dbtp, lsnp, op, info)
  74. DB_ENV *dbenv;
  75. DBT *dbtp;
  76. DB_LSN *lsnp;
  77. db_recops op;
  78. void *info;
  79. {
  80. __bam_pg_alloc1_args *argp;
  81. DB *file_dbp;
  82. DBC *dbc;
  83. DB_MPOOLFILE *mpf;
  84. PAGE *pagep;
  85. int cmp_n, cmp_p, modified, ret;
  86. REC_PRINT(__bam_pg_alloc1_print);
  87. REC_INTRO(__bam_pg_alloc1_read);
  88. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  89. if (DB_REDO(op)) {
  90. if ((ret = memp_fget(mpf,
  91.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  92. goto out;
  93. } else {
  94. *lsnp = argp->prev_lsn;
  95. ret = 0;
  96. goto out;
  97. }
  98. modified = 0;
  99. cmp_n = log_compare(lsnp, &LSN(pagep));
  100. /*
  101.  * Use this when there is something like "pagelsn" in the argp
  102.  * structure.  Sometimes, you might need to compare meta-data
  103.  * lsn's instead.
  104.  *
  105.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  106.  */
  107. if (cmp_p == 0 && DB_REDO(op)) {
  108. /* Need to redo update described. */
  109. modified = 1;
  110. } else if (cmp_n == 0 && !DB_REDO(op)) {
  111. /* Need to undo update described. */
  112. modified = 1;
  113. }
  114. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  115. goto out;
  116. *lsnp = argp->prev_lsn;
  117. ret = 0;
  118. out: REC_CLOSE;
  119. }
  120. /*
  121.  * __bam_pg_free_recover --
  122.  * Recovery function for pg_free.
  123.  *
  124.  * PUBLIC: int __bam_pg_free_recover
  125.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  126.  */
  127. int
  128. __bam_pg_free_recover(dbenv, dbtp, lsnp, op, info)
  129. DB_ENV *dbenv;
  130. DBT *dbtp;
  131. DB_LSN *lsnp;
  132. db_recops op;
  133. void *info;
  134. {
  135. __bam_pg_free_args *argp;
  136. DB *file_dbp;
  137. DBC *dbc;
  138. DB_MPOOLFILE *mpf;
  139. PAGE *pagep;
  140. int cmp_n, cmp_p, modified, ret;
  141. REC_PRINT(__bam_pg_free_print);
  142. REC_INTRO(__bam_pg_free_read);
  143. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  144. if (DB_REDO(op)) {
  145. if ((ret = memp_fget(mpf,
  146.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  147. goto out;
  148. } else {
  149. *lsnp = argp->prev_lsn;
  150. ret = 0;
  151. goto out;
  152. }
  153. modified = 0;
  154. cmp_n = log_compare(lsnp, &LSN(pagep));
  155. /*
  156.  * Use this when there is something like "pagelsn" in the argp
  157.  * structure.  Sometimes, you might need to compare meta-data
  158.  * lsn's instead.
  159.  *
  160.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  161.  */
  162. if (cmp_p == 0 && DB_REDO(op)) {
  163. /* Need to redo update described. */
  164. modified = 1;
  165. } else if (cmp_n == 0 && !DB_REDO(op)) {
  166. /* Need to undo update described. */
  167. modified = 1;
  168. }
  169. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  170. goto out;
  171. *lsnp = argp->prev_lsn;
  172. ret = 0;
  173. out: REC_CLOSE;
  174. }
  175. /*
  176.  * __bam_pg_free1_recover --
  177.  * Recovery function for pg_free1.
  178.  *
  179.  * PUBLIC: int __bam_pg_free1_recover
  180.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  181.  */
  182. int
  183. __bam_pg_free1_recover(dbenv, dbtp, lsnp, op, info)
  184. DB_ENV *dbenv;
  185. DBT *dbtp;
  186. DB_LSN *lsnp;
  187. db_recops op;
  188. void *info;
  189. {
  190. __bam_pg_free1_args *argp;
  191. DB *file_dbp;
  192. DBC *dbc;
  193. DB_MPOOLFILE *mpf;
  194. PAGE *pagep;
  195. int cmp_n, cmp_p, modified, ret;
  196. REC_PRINT(__bam_pg_free1_print);
  197. REC_INTRO(__bam_pg_free1_read);
  198. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  199. if (DB_REDO(op)) {
  200. if ((ret = memp_fget(mpf,
  201.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  202. goto out;
  203. } else {
  204. *lsnp = argp->prev_lsn;
  205. ret = 0;
  206. goto out;
  207. }
  208. modified = 0;
  209. cmp_n = log_compare(lsnp, &LSN(pagep));
  210. /*
  211.  * Use this when there is something like "pagelsn" in the argp
  212.  * structure.  Sometimes, you might need to compare meta-data
  213.  * lsn's instead.
  214.  *
  215.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  216.  */
  217. if (cmp_p == 0 && DB_REDO(op)) {
  218. /* Need to redo update described. */
  219. modified = 1;
  220. } else if (cmp_n == 0 && !DB_REDO(op)) {
  221. /* Need to undo update described. */
  222. modified = 1;
  223. }
  224. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  225. goto out;
  226. *lsnp = argp->prev_lsn;
  227. ret = 0;
  228. out: REC_CLOSE;
  229. }
  230. /*
  231.  * __bam_split1_recover --
  232.  * Recovery function for split1.
  233.  *
  234.  * PUBLIC: int __bam_split1_recover
  235.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  236.  */
  237. int
  238. __bam_split1_recover(dbenv, dbtp, lsnp, op, info)
  239. DB_ENV *dbenv;
  240. DBT *dbtp;
  241. DB_LSN *lsnp;
  242. db_recops op;
  243. void *info;
  244. {
  245. __bam_split1_args *argp;
  246. DB *file_dbp;
  247. DBC *dbc;
  248. DB_MPOOLFILE *mpf;
  249. PAGE *pagep;
  250. int cmp_n, cmp_p, modified, ret;
  251. REC_PRINT(__bam_split1_print);
  252. REC_INTRO(__bam_split1_read);
  253. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  254. if (DB_REDO(op)) {
  255. if ((ret = memp_fget(mpf,
  256.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  257. goto out;
  258. } else {
  259. *lsnp = argp->prev_lsn;
  260. ret = 0;
  261. goto out;
  262. }
  263. modified = 0;
  264. cmp_n = log_compare(lsnp, &LSN(pagep));
  265. /*
  266.  * Use this when there is something like "pagelsn" in the argp
  267.  * structure.  Sometimes, you might need to compare meta-data
  268.  * lsn's instead.
  269.  *
  270.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  271.  */
  272. if (cmp_p == 0 && DB_REDO(op)) {
  273. /* Need to redo update described. */
  274. modified = 1;
  275. } else if (cmp_n == 0 && !DB_REDO(op)) {
  276. /* Need to undo update described. */
  277. modified = 1;
  278. }
  279. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  280. goto out;
  281. *lsnp = argp->prev_lsn;
  282. ret = 0;
  283. out: REC_CLOSE;
  284. }
  285. /*
  286.  * __bam_split_recover --
  287.  * Recovery function for split.
  288.  *
  289.  * PUBLIC: int __bam_split_recover
  290.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  291.  */
  292. int
  293. __bam_split_recover(dbenv, dbtp, lsnp, op, info)
  294. DB_ENV *dbenv;
  295. DBT *dbtp;
  296. DB_LSN *lsnp;
  297. db_recops op;
  298. void *info;
  299. {
  300. __bam_split_args *argp;
  301. DB *file_dbp;
  302. DBC *dbc;
  303. DB_MPOOLFILE *mpf;
  304. PAGE *pagep;
  305. int cmp_n, cmp_p, modified, ret;
  306. REC_PRINT(__bam_split_print);
  307. REC_INTRO(__bam_split_read);
  308. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  309. if (DB_REDO(op)) {
  310. if ((ret = memp_fget(mpf,
  311.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  312. goto out;
  313. } else {
  314. *lsnp = argp->prev_lsn;
  315. ret = 0;
  316. goto out;
  317. }
  318. modified = 0;
  319. cmp_n = log_compare(lsnp, &LSN(pagep));
  320. /*
  321.  * Use this when there is something like "pagelsn" in the argp
  322.  * structure.  Sometimes, you might need to compare meta-data
  323.  * lsn's instead.
  324.  *
  325.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  326.  */
  327. if (cmp_p == 0 && DB_REDO(op)) {
  328. /* Need to redo update described. */
  329. modified = 1;
  330. } else if (cmp_n == 0 && !DB_REDO(op)) {
  331. /* Need to undo update described. */
  332. modified = 1;
  333. }
  334. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  335. goto out;
  336. *lsnp = argp->prev_lsn;
  337. ret = 0;
  338. out: REC_CLOSE;
  339. }
  340. /*
  341.  * __bam_rsplit1_recover --
  342.  * Recovery function for rsplit1.
  343.  *
  344.  * PUBLIC: int __bam_rsplit1_recover
  345.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  346.  */
  347. int
  348. __bam_rsplit1_recover(dbenv, dbtp, lsnp, op, info)
  349. DB_ENV *dbenv;
  350. DBT *dbtp;
  351. DB_LSN *lsnp;
  352. db_recops op;
  353. void *info;
  354. {
  355. __bam_rsplit1_args *argp;
  356. DB *file_dbp;
  357. DBC *dbc;
  358. DB_MPOOLFILE *mpf;
  359. PAGE *pagep;
  360. int cmp_n, cmp_p, modified, ret;
  361. REC_PRINT(__bam_rsplit1_print);
  362. REC_INTRO(__bam_rsplit1_read);
  363. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  364. if (DB_REDO(op)) {
  365. if ((ret = memp_fget(mpf,
  366.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  367. goto out;
  368. } else {
  369. *lsnp = argp->prev_lsn;
  370. ret = 0;
  371. goto out;
  372. }
  373. modified = 0;
  374. cmp_n = log_compare(lsnp, &LSN(pagep));
  375. /*
  376.  * Use this when there is something like "pagelsn" in the argp
  377.  * structure.  Sometimes, you might need to compare meta-data
  378.  * lsn's instead.
  379.  *
  380.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  381.  */
  382. if (cmp_p == 0 && DB_REDO(op)) {
  383. /* Need to redo update described. */
  384. modified = 1;
  385. } else if (cmp_n == 0 && !DB_REDO(op)) {
  386. /* Need to undo update described. */
  387. modified = 1;
  388. }
  389. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  390. goto out;
  391. *lsnp = argp->prev_lsn;
  392. ret = 0;
  393. out: REC_CLOSE;
  394. }
  395. /*
  396.  * __bam_rsplit_recover --
  397.  * Recovery function for rsplit.
  398.  *
  399.  * PUBLIC: int __bam_rsplit_recover
  400.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  401.  */
  402. int
  403. __bam_rsplit_recover(dbenv, dbtp, lsnp, op, info)
  404. DB_ENV *dbenv;
  405. DBT *dbtp;
  406. DB_LSN *lsnp;
  407. db_recops op;
  408. void *info;
  409. {
  410. __bam_rsplit_args *argp;
  411. DB *file_dbp;
  412. DBC *dbc;
  413. DB_MPOOLFILE *mpf;
  414. PAGE *pagep;
  415. int cmp_n, cmp_p, modified, ret;
  416. REC_PRINT(__bam_rsplit_print);
  417. REC_INTRO(__bam_rsplit_read);
  418. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  419. if (DB_REDO(op)) {
  420. if ((ret = memp_fget(mpf,
  421.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  422. goto out;
  423. } else {
  424. *lsnp = argp->prev_lsn;
  425. ret = 0;
  426. goto out;
  427. }
  428. modified = 0;
  429. cmp_n = log_compare(lsnp, &LSN(pagep));
  430. /*
  431.  * Use this when there is something like "pagelsn" in the argp
  432.  * structure.  Sometimes, you might need to compare meta-data
  433.  * lsn's instead.
  434.  *
  435.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  436.  */
  437. if (cmp_p == 0 && DB_REDO(op)) {
  438. /* Need to redo update described. */
  439. modified = 1;
  440. } else if (cmp_n == 0 && !DB_REDO(op)) {
  441. /* Need to undo update described. */
  442. modified = 1;
  443. }
  444. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  445. goto out;
  446. *lsnp = argp->prev_lsn;
  447. ret = 0;
  448. out: REC_CLOSE;
  449. }
  450. /*
  451.  * __bam_adj_recover --
  452.  * Recovery function for adj.
  453.  *
  454.  * PUBLIC: int __bam_adj_recover
  455.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  456.  */
  457. int
  458. __bam_adj_recover(dbenv, dbtp, lsnp, op, info)
  459. DB_ENV *dbenv;
  460. DBT *dbtp;
  461. DB_LSN *lsnp;
  462. db_recops op;
  463. void *info;
  464. {
  465. __bam_adj_args *argp;
  466. DB *file_dbp;
  467. DBC *dbc;
  468. DB_MPOOLFILE *mpf;
  469. PAGE *pagep;
  470. int cmp_n, cmp_p, modified, ret;
  471. REC_PRINT(__bam_adj_print);
  472. REC_INTRO(__bam_adj_read);
  473. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  474. if (DB_REDO(op)) {
  475. if ((ret = memp_fget(mpf,
  476.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  477. goto out;
  478. } else {
  479. *lsnp = argp->prev_lsn;
  480. ret = 0;
  481. goto out;
  482. }
  483. modified = 0;
  484. cmp_n = log_compare(lsnp, &LSN(pagep));
  485. /*
  486.  * Use this when there is something like "pagelsn" in the argp
  487.  * structure.  Sometimes, you might need to compare meta-data
  488.  * lsn's instead.
  489.  *
  490.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  491.  */
  492. if (cmp_p == 0 && DB_REDO(op)) {
  493. /* Need to redo update described. */
  494. modified = 1;
  495. } else if (cmp_n == 0 && !DB_REDO(op)) {
  496. /* Need to undo update described. */
  497. modified = 1;
  498. }
  499. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  500. goto out;
  501. *lsnp = argp->prev_lsn;
  502. ret = 0;
  503. out: REC_CLOSE;
  504. }
  505. /*
  506.  * __bam_cadjust_recover --
  507.  * Recovery function for cadjust.
  508.  *
  509.  * PUBLIC: int __bam_cadjust_recover
  510.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  511.  */
  512. int
  513. __bam_cadjust_recover(dbenv, dbtp, lsnp, op, info)
  514. DB_ENV *dbenv;
  515. DBT *dbtp;
  516. DB_LSN *lsnp;
  517. db_recops op;
  518. void *info;
  519. {
  520. __bam_cadjust_args *argp;
  521. DB *file_dbp;
  522. DBC *dbc;
  523. DB_MPOOLFILE *mpf;
  524. PAGE *pagep;
  525. int cmp_n, cmp_p, modified, ret;
  526. REC_PRINT(__bam_cadjust_print);
  527. REC_INTRO(__bam_cadjust_read);
  528. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  529. if (DB_REDO(op)) {
  530. if ((ret = memp_fget(mpf,
  531.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  532. goto out;
  533. } else {
  534. *lsnp = argp->prev_lsn;
  535. ret = 0;
  536. goto out;
  537. }
  538. modified = 0;
  539. cmp_n = log_compare(lsnp, &LSN(pagep));
  540. /*
  541.  * Use this when there is something like "pagelsn" in the argp
  542.  * structure.  Sometimes, you might need to compare meta-data
  543.  * lsn's instead.
  544.  *
  545.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  546.  */
  547. if (cmp_p == 0 && DB_REDO(op)) {
  548. /* Need to redo update described. */
  549. modified = 1;
  550. } else if (cmp_n == 0 && !DB_REDO(op)) {
  551. /* Need to undo update described. */
  552. modified = 1;
  553. }
  554. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  555. goto out;
  556. *lsnp = argp->prev_lsn;
  557. ret = 0;
  558. out: REC_CLOSE;
  559. }
  560. /*
  561.  * __bam_cdel_recover --
  562.  * Recovery function for cdel.
  563.  *
  564.  * PUBLIC: int __bam_cdel_recover
  565.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  566.  */
  567. int
  568. __bam_cdel_recover(dbenv, dbtp, lsnp, op, info)
  569. DB_ENV *dbenv;
  570. DBT *dbtp;
  571. DB_LSN *lsnp;
  572. db_recops op;
  573. void *info;
  574. {
  575. __bam_cdel_args *argp;
  576. DB *file_dbp;
  577. DBC *dbc;
  578. DB_MPOOLFILE *mpf;
  579. PAGE *pagep;
  580. int cmp_n, cmp_p, modified, ret;
  581. REC_PRINT(__bam_cdel_print);
  582. REC_INTRO(__bam_cdel_read);
  583. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  584. if (DB_REDO(op)) {
  585. if ((ret = memp_fget(mpf,
  586.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  587. goto out;
  588. } else {
  589. *lsnp = argp->prev_lsn;
  590. ret = 0;
  591. goto out;
  592. }
  593. modified = 0;
  594. cmp_n = log_compare(lsnp, &LSN(pagep));
  595. /*
  596.  * Use this when there is something like "pagelsn" in the argp
  597.  * structure.  Sometimes, you might need to compare meta-data
  598.  * lsn's instead.
  599.  *
  600.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  601.  */
  602. if (cmp_p == 0 && DB_REDO(op)) {
  603. /* Need to redo update described. */
  604. modified = 1;
  605. } else if (cmp_n == 0 && !DB_REDO(op)) {
  606. /* Need to undo update described. */
  607. modified = 1;
  608. }
  609. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  610. goto out;
  611. *lsnp = argp->prev_lsn;
  612. ret = 0;
  613. out: REC_CLOSE;
  614. }
  615. /*
  616.  * __bam_repl_recover --
  617.  * Recovery function for repl.
  618.  *
  619.  * PUBLIC: int __bam_repl_recover
  620.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  621.  */
  622. int
  623. __bam_repl_recover(dbenv, dbtp, lsnp, op, info)
  624. DB_ENV *dbenv;
  625. DBT *dbtp;
  626. DB_LSN *lsnp;
  627. db_recops op;
  628. void *info;
  629. {
  630. __bam_repl_args *argp;
  631. DB *file_dbp;
  632. DBC *dbc;
  633. DB_MPOOLFILE *mpf;
  634. PAGE *pagep;
  635. int cmp_n, cmp_p, modified, ret;
  636. REC_PRINT(__bam_repl_print);
  637. REC_INTRO(__bam_repl_read);
  638. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  639. if (DB_REDO(op)) {
  640. if ((ret = memp_fget(mpf,
  641.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  642. goto out;
  643. } else {
  644. *lsnp = argp->prev_lsn;
  645. ret = 0;
  646. goto out;
  647. }
  648. modified = 0;
  649. cmp_n = log_compare(lsnp, &LSN(pagep));
  650. /*
  651.  * Use this when there is something like "pagelsn" in the argp
  652.  * structure.  Sometimes, you might need to compare meta-data
  653.  * lsn's instead.
  654.  *
  655.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  656.  */
  657. if (cmp_p == 0 && DB_REDO(op)) {
  658. /* Need to redo update described. */
  659. modified = 1;
  660. } else if (cmp_n == 0 && !DB_REDO(op)) {
  661. /* Need to undo update described. */
  662. modified = 1;
  663. }
  664. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  665. goto out;
  666. *lsnp = argp->prev_lsn;
  667. ret = 0;
  668. out: REC_CLOSE;
  669. }
  670. /*
  671.  * __bam_root_recover --
  672.  * Recovery function for root.
  673.  *
  674.  * PUBLIC: int __bam_root_recover
  675.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  676.  */
  677. int
  678. __bam_root_recover(dbenv, dbtp, lsnp, op, info)
  679. DB_ENV *dbenv;
  680. DBT *dbtp;
  681. DB_LSN *lsnp;
  682. db_recops op;
  683. void *info;
  684. {
  685. __bam_root_args *argp;
  686. DB *file_dbp;
  687. DBC *dbc;
  688. DB_MPOOLFILE *mpf;
  689. PAGE *pagep;
  690. int cmp_n, cmp_p, modified, ret;
  691. REC_PRINT(__bam_root_print);
  692. REC_INTRO(__bam_root_read);
  693. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  694. if (DB_REDO(op)) {
  695. if ((ret = memp_fget(mpf,
  696.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  697. goto out;
  698. } else {
  699. *lsnp = argp->prev_lsn;
  700. ret = 0;
  701. goto out;
  702. }
  703. modified = 0;
  704. cmp_n = log_compare(lsnp, &LSN(pagep));
  705. /*
  706.  * Use this when there is something like "pagelsn" in the argp
  707.  * structure.  Sometimes, you might need to compare meta-data
  708.  * lsn's instead.
  709.  *
  710.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  711.  */
  712. if (cmp_p == 0 && DB_REDO(op)) {
  713. /* Need to redo update described. */
  714. modified = 1;
  715. } else if (cmp_n == 0 && !DB_REDO(op)) {
  716. /* Need to undo update described. */
  717. modified = 1;
  718. }
  719. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  720. goto out;
  721. *lsnp = argp->prev_lsn;
  722. ret = 0;
  723. out: REC_CLOSE;
  724. }
  725. /*
  726.  * __bam_curadj_recover --
  727.  * Recovery function for curadj.
  728.  *
  729.  * PUBLIC: int __bam_curadj_recover
  730.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  731.  */
  732. int
  733. __bam_curadj_recover(dbenv, dbtp, lsnp, op, info)
  734. DB_ENV *dbenv;
  735. DBT *dbtp;
  736. DB_LSN *lsnp;
  737. db_recops op;
  738. void *info;
  739. {
  740. __bam_curadj_args *argp;
  741. DB *file_dbp;
  742. DBC *dbc;
  743. DB_MPOOLFILE *mpf;
  744. PAGE *pagep;
  745. int cmp_n, cmp_p, modified, ret;
  746. REC_PRINT(__bam_curadj_print);
  747. REC_INTRO(__bam_curadj_read);
  748. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  749. if (DB_REDO(op)) {
  750. if ((ret = memp_fget(mpf,
  751.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  752. goto out;
  753. } else {
  754. *lsnp = argp->prev_lsn;
  755. ret = 0;
  756. goto out;
  757. }
  758. modified = 0;
  759. cmp_n = log_compare(lsnp, &LSN(pagep));
  760. /*
  761.  * Use this when there is something like "pagelsn" in the argp
  762.  * structure.  Sometimes, you might need to compare meta-data
  763.  * lsn's instead.
  764.  *
  765.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  766.  */
  767. if (cmp_p == 0 && DB_REDO(op)) {
  768. /* Need to redo update described. */
  769. modified = 1;
  770. } else if (cmp_n == 0 && !DB_REDO(op)) {
  771. /* Need to undo update described. */
  772. modified = 1;
  773. }
  774. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  775. goto out;
  776. *lsnp = argp->prev_lsn;
  777. ret = 0;
  778. out: REC_CLOSE;
  779. }
  780. /*
  781.  * __bam_rcuradj_recover --
  782.  * Recovery function for rcuradj.
  783.  *
  784.  * PUBLIC: int __bam_rcuradj_recover
  785.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  786.  */
  787. int
  788. __bam_rcuradj_recover(dbenv, dbtp, lsnp, op, info)
  789. DB_ENV *dbenv;
  790. DBT *dbtp;
  791. DB_LSN *lsnp;
  792. db_recops op;
  793. void *info;
  794. {
  795. __bam_rcuradj_args *argp;
  796. DB *file_dbp;
  797. DBC *dbc;
  798. DB_MPOOLFILE *mpf;
  799. PAGE *pagep;
  800. int cmp_n, cmp_p, modified, ret;
  801. REC_PRINT(__bam_rcuradj_print);
  802. REC_INTRO(__bam_rcuradj_read);
  803. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  804. if (DB_REDO(op)) {
  805. if ((ret = memp_fget(mpf,
  806.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  807. goto out;
  808. } else {
  809. *lsnp = argp->prev_lsn;
  810. ret = 0;
  811. goto out;
  812. }
  813. modified = 0;
  814. cmp_n = log_compare(lsnp, &LSN(pagep));
  815. /*
  816.  * Use this when there is something like "pagelsn" in the argp
  817.  * structure.  Sometimes, you might need to compare meta-data
  818.  * lsn's instead.
  819.  *
  820.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  821.  */
  822. if (cmp_p == 0 && DB_REDO(op)) {
  823. /* Need to redo update described. */
  824. modified = 1;
  825. } else if (cmp_n == 0 && !DB_REDO(op)) {
  826. /* Need to undo update described. */
  827. modified = 1;
  828. }
  829. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  830. goto out;
  831. *lsnp = argp->prev_lsn;
  832. ret = 0;
  833. out: REC_CLOSE;
  834. }