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

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 "db.h"
  9. #include "log.h"
  10. /*
  11.  * __db_addrem_recover --
  12.  * Recovery function for addrem.
  13.  *
  14.  * PUBLIC: int __db_addrem_recover
  15.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  16.  */
  17. int
  18. __db_addrem_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. __db_addrem_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(__db_addrem_print);
  32. REC_INTRO(__db_addrem_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.  * __db_split_recover --
  67.  * Recovery function for split.
  68.  *
  69.  * PUBLIC: int __db_split_recover
  70.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  71.  */
  72. int
  73. __db_split_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. __db_split_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(__db_split_print);
  87. REC_INTRO(__db_split_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.  * __db_big_recover --
  122.  * Recovery function for big.
  123.  *
  124.  * PUBLIC: int __db_big_recover
  125.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  126.  */
  127. int
  128. __db_big_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. __db_big_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(__db_big_print);
  142. REC_INTRO(__db_big_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.  * __db_ovref_recover --
  177.  * Recovery function for ovref.
  178.  *
  179.  * PUBLIC: int __db_ovref_recover
  180.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  181.  */
  182. int
  183. __db_ovref_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. __db_ovref_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(__db_ovref_print);
  197. REC_INTRO(__db_ovref_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.  * __db_relink_recover --
  232.  * Recovery function for relink.
  233.  *
  234.  * PUBLIC: int __db_relink_recover
  235.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  236.  */
  237. int
  238. __db_relink_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. __db_relink_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(__db_relink_print);
  252. REC_INTRO(__db_relink_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.  * __db_addpage_recover --
  287.  * Recovery function for addpage.
  288.  *
  289.  * PUBLIC: int __db_addpage_recover
  290.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  291.  */
  292. int
  293. __db_addpage_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. __db_addpage_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(__db_addpage_print);
  307. REC_INTRO(__db_addpage_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.  * __db_debug_recover --
  342.  * Recovery function for debug.
  343.  *
  344.  * PUBLIC: int __db_debug_recover
  345.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  346.  */
  347. int
  348. __db_debug_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. __db_debug_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(__db_debug_print);
  362. REC_INTRO(__db_debug_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.  * __db_noop_recover --
  397.  * Recovery function for noop.
  398.  *
  399.  * PUBLIC: int __db_noop_recover
  400.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  401.  */
  402. int
  403. __db_noop_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. __db_noop_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(__db_noop_print);
  417. REC_INTRO(__db_noop_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. }