hash_auto.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:53k
源码类别:

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 <errno.h>
  7. #include <string.h>
  8. #endif
  9. #include "db_int.h"
  10. #include "db_page.h"
  11. #include "db_dispatch.h"
  12. #include "db_am.h"
  13. #include "hash.h"
  14. #include "txn.h"
  15. int
  16. __ham_insdel_log(dbenv, txnid, ret_lsnp, flags,
  17. opcode, fileid, pgno, ndx, pagelsn, key,
  18. data)
  19. DB_ENV *dbenv;
  20. DB_TXN *txnid;
  21. DB_LSN *ret_lsnp;
  22. u_int32_t flags;
  23. u_int32_t opcode;
  24. int32_t fileid;
  25. db_pgno_t pgno;
  26. u_int32_t ndx;
  27. DB_LSN * pagelsn;
  28. const DBT *key;
  29. const DBT *data;
  30. {
  31. DBT logrec;
  32. DB_LSN *lsnp, null_lsn;
  33. u_int32_t zero;
  34. u_int32_t rectype, txn_num;
  35. int ret;
  36. u_int8_t *bp;
  37. rectype = DB_ham_insdel;
  38. if (txnid != NULL &&
  39.     TAILQ_FIRST(&txnid->kids) != NULL &&
  40.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  41. return (ret);
  42. txn_num = txnid == NULL ? 0 : txnid->txnid;
  43. if (txnid == NULL) {
  44. ZERO_LSN(null_lsn);
  45. lsnp = &null_lsn;
  46. } else
  47. lsnp = &txnid->last_lsn;
  48. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  49.     + sizeof(opcode)
  50.     + sizeof(fileid)
  51.     + sizeof(pgno)
  52.     + sizeof(ndx)
  53.     + sizeof(*pagelsn)
  54.     + sizeof(u_int32_t) + (key == NULL ? 0 : key->size)
  55.     + sizeof(u_int32_t) + (data == NULL ? 0 : data->size);
  56. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  57. return (ret);
  58. bp = logrec.data;
  59. memcpy(bp, &rectype, sizeof(rectype));
  60. bp += sizeof(rectype);
  61. memcpy(bp, &txn_num, sizeof(txn_num));
  62. bp += sizeof(txn_num);
  63. memcpy(bp, lsnp, sizeof(DB_LSN));
  64. bp += sizeof(DB_LSN);
  65. memcpy(bp, &opcode, sizeof(opcode));
  66. bp += sizeof(opcode);
  67. memcpy(bp, &fileid, sizeof(fileid));
  68. bp += sizeof(fileid);
  69. memcpy(bp, &pgno, sizeof(pgno));
  70. bp += sizeof(pgno);
  71. memcpy(bp, &ndx, sizeof(ndx));
  72. bp += sizeof(ndx);
  73. if (pagelsn != NULL)
  74. memcpy(bp, pagelsn, sizeof(*pagelsn));
  75. else
  76. memset(bp, 0, sizeof(*pagelsn));
  77. bp += sizeof(*pagelsn);
  78. if (key == NULL) {
  79. zero = 0;
  80. memcpy(bp, &zero, sizeof(u_int32_t));
  81. bp += sizeof(u_int32_t);
  82. } else {
  83. memcpy(bp, &key->size, sizeof(key->size));
  84. bp += sizeof(key->size);
  85. memcpy(bp, key->data, key->size);
  86. bp += key->size;
  87. }
  88. if (data == NULL) {
  89. zero = 0;
  90. memcpy(bp, &zero, sizeof(u_int32_t));
  91. bp += sizeof(u_int32_t);
  92. } else {
  93. memcpy(bp, &data->size, sizeof(data->size));
  94. bp += sizeof(data->size);
  95. memcpy(bp, data->data, data->size);
  96. bp += data->size;
  97. }
  98. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  99. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  100. if (txnid != NULL)
  101. txnid->last_lsn = *ret_lsnp;
  102. __os_free(logrec.data, logrec.size);
  103. return (ret);
  104. }
  105. int
  106. __ham_insdel_print(dbenv, dbtp, lsnp, notused2, notused3)
  107. DB_ENV *dbenv;
  108. DBT *dbtp;
  109. DB_LSN *lsnp;
  110. db_recops notused2;
  111. void *notused3;
  112. {
  113. __ham_insdel_args *argp;
  114. u_int32_t i;
  115. u_int ch;
  116. int ret;
  117. i = 0;
  118. ch = 0;
  119. notused2 = DB_TXN_ABORT;
  120. notused3 = NULL;
  121. if ((ret = __ham_insdel_read(dbenv, dbtp->data, &argp)) != 0)
  122. return (ret);
  123. printf("[%lu][%lu]ham_insdel: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  124.     (u_long)lsnp->file,
  125.     (u_long)lsnp->offset,
  126.     (u_long)argp->type,
  127.     (u_long)argp->txnid->txnid,
  128.     (u_long)argp->prev_lsn.file,
  129.     (u_long)argp->prev_lsn.offset);
  130. printf("topcode: %lun", (u_long)argp->opcode);
  131. printf("tfileid: %ldn", (long)argp->fileid);
  132. printf("tpgno: %lun", (u_long)argp->pgno);
  133. printf("tndx: %lun", (u_long)argp->ndx);
  134. printf("tpagelsn: [%lu][%lu]n",
  135.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  136. printf("tkey: ");
  137. for (i = 0; i < argp->key.size; i++) {
  138. ch = ((u_int8_t *)argp->key.data)[i];
  139. if (isprint(ch) || ch == 0xa)
  140. putchar(ch);
  141. else
  142. printf("%#x ", ch);
  143. }
  144. printf("n");
  145. printf("tdata: ");
  146. for (i = 0; i < argp->data.size; i++) {
  147. ch = ((u_int8_t *)argp->data.data)[i];
  148. if (isprint(ch) || ch == 0xa)
  149. putchar(ch);
  150. else
  151. printf("%#x ", ch);
  152. }
  153. printf("n");
  154. printf("n");
  155. __os_free(argp, 0);
  156. return (0);
  157. }
  158. int
  159. __ham_insdel_read(dbenv, recbuf, argpp)
  160. DB_ENV *dbenv;
  161. void *recbuf;
  162. __ham_insdel_args **argpp;
  163. {
  164. __ham_insdel_args *argp;
  165. u_int8_t *bp;
  166. int ret;
  167. ret = __os_malloc(dbenv, sizeof(__ham_insdel_args) +
  168.     sizeof(DB_TXN), NULL, &argp);
  169. if (ret != 0)
  170. return (ret);
  171. argp->txnid = (DB_TXN *)&argp[1];
  172. bp = recbuf;
  173. memcpy(&argp->type, bp, sizeof(argp->type));
  174. bp += sizeof(argp->type);
  175. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  176. bp += sizeof(argp->txnid->txnid);
  177. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  178. bp += sizeof(DB_LSN);
  179. memcpy(&argp->opcode, bp, sizeof(argp->opcode));
  180. bp += sizeof(argp->opcode);
  181. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  182. bp += sizeof(argp->fileid);
  183. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  184. bp += sizeof(argp->pgno);
  185. memcpy(&argp->ndx, bp, sizeof(argp->ndx));
  186. bp += sizeof(argp->ndx);
  187. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  188. bp += sizeof(argp->pagelsn);
  189. memset(&argp->key, 0, sizeof(argp->key));
  190. memcpy(&argp->key.size, bp, sizeof(u_int32_t));
  191. bp += sizeof(u_int32_t);
  192. argp->key.data = bp;
  193. bp += argp->key.size;
  194. memset(&argp->data, 0, sizeof(argp->data));
  195. memcpy(&argp->data.size, bp, sizeof(u_int32_t));
  196. bp += sizeof(u_int32_t);
  197. argp->data.data = bp;
  198. bp += argp->data.size;
  199. *argpp = argp;
  200. return (0);
  201. }
  202. int
  203. __ham_newpage_log(dbenv, txnid, ret_lsnp, flags,
  204. opcode, fileid, prev_pgno, prevlsn, new_pgno, pagelsn,
  205. next_pgno, nextlsn)
  206. DB_ENV *dbenv;
  207. DB_TXN *txnid;
  208. DB_LSN *ret_lsnp;
  209. u_int32_t flags;
  210. u_int32_t opcode;
  211. int32_t fileid;
  212. db_pgno_t prev_pgno;
  213. DB_LSN * prevlsn;
  214. db_pgno_t new_pgno;
  215. DB_LSN * pagelsn;
  216. db_pgno_t next_pgno;
  217. DB_LSN * nextlsn;
  218. {
  219. DBT logrec;
  220. DB_LSN *lsnp, null_lsn;
  221. u_int32_t rectype, txn_num;
  222. int ret;
  223. u_int8_t *bp;
  224. rectype = DB_ham_newpage;
  225. if (txnid != NULL &&
  226.     TAILQ_FIRST(&txnid->kids) != NULL &&
  227.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  228. return (ret);
  229. txn_num = txnid == NULL ? 0 : txnid->txnid;
  230. if (txnid == NULL) {
  231. ZERO_LSN(null_lsn);
  232. lsnp = &null_lsn;
  233. } else
  234. lsnp = &txnid->last_lsn;
  235. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  236.     + sizeof(opcode)
  237.     + sizeof(fileid)
  238.     + sizeof(prev_pgno)
  239.     + sizeof(*prevlsn)
  240.     + sizeof(new_pgno)
  241.     + sizeof(*pagelsn)
  242.     + sizeof(next_pgno)
  243.     + sizeof(*nextlsn);
  244. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  245. return (ret);
  246. bp = logrec.data;
  247. memcpy(bp, &rectype, sizeof(rectype));
  248. bp += sizeof(rectype);
  249. memcpy(bp, &txn_num, sizeof(txn_num));
  250. bp += sizeof(txn_num);
  251. memcpy(bp, lsnp, sizeof(DB_LSN));
  252. bp += sizeof(DB_LSN);
  253. memcpy(bp, &opcode, sizeof(opcode));
  254. bp += sizeof(opcode);
  255. memcpy(bp, &fileid, sizeof(fileid));
  256. bp += sizeof(fileid);
  257. memcpy(bp, &prev_pgno, sizeof(prev_pgno));
  258. bp += sizeof(prev_pgno);
  259. if (prevlsn != NULL)
  260. memcpy(bp, prevlsn, sizeof(*prevlsn));
  261. else
  262. memset(bp, 0, sizeof(*prevlsn));
  263. bp += sizeof(*prevlsn);
  264. memcpy(bp, &new_pgno, sizeof(new_pgno));
  265. bp += sizeof(new_pgno);
  266. if (pagelsn != NULL)
  267. memcpy(bp, pagelsn, sizeof(*pagelsn));
  268. else
  269. memset(bp, 0, sizeof(*pagelsn));
  270. bp += sizeof(*pagelsn);
  271. memcpy(bp, &next_pgno, sizeof(next_pgno));
  272. bp += sizeof(next_pgno);
  273. if (nextlsn != NULL)
  274. memcpy(bp, nextlsn, sizeof(*nextlsn));
  275. else
  276. memset(bp, 0, sizeof(*nextlsn));
  277. bp += sizeof(*nextlsn);
  278. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  279. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  280. if (txnid != NULL)
  281. txnid->last_lsn = *ret_lsnp;
  282. __os_free(logrec.data, logrec.size);
  283. return (ret);
  284. }
  285. int
  286. __ham_newpage_print(dbenv, dbtp, lsnp, notused2, notused3)
  287. DB_ENV *dbenv;
  288. DBT *dbtp;
  289. DB_LSN *lsnp;
  290. db_recops notused2;
  291. void *notused3;
  292. {
  293. __ham_newpage_args *argp;
  294. u_int32_t i;
  295. u_int ch;
  296. int ret;
  297. i = 0;
  298. ch = 0;
  299. notused2 = DB_TXN_ABORT;
  300. notused3 = NULL;
  301. if ((ret = __ham_newpage_read(dbenv, dbtp->data, &argp)) != 0)
  302. return (ret);
  303. printf("[%lu][%lu]ham_newpage: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  304.     (u_long)lsnp->file,
  305.     (u_long)lsnp->offset,
  306.     (u_long)argp->type,
  307.     (u_long)argp->txnid->txnid,
  308.     (u_long)argp->prev_lsn.file,
  309.     (u_long)argp->prev_lsn.offset);
  310. printf("topcode: %lun", (u_long)argp->opcode);
  311. printf("tfileid: %ldn", (long)argp->fileid);
  312. printf("tprev_pgno: %lun", (u_long)argp->prev_pgno);
  313. printf("tprevlsn: [%lu][%lu]n",
  314.     (u_long)argp->prevlsn.file, (u_long)argp->prevlsn.offset);
  315. printf("tnew_pgno: %lun", (u_long)argp->new_pgno);
  316. printf("tpagelsn: [%lu][%lu]n",
  317.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  318. printf("tnext_pgno: %lun", (u_long)argp->next_pgno);
  319. printf("tnextlsn: [%lu][%lu]n",
  320.     (u_long)argp->nextlsn.file, (u_long)argp->nextlsn.offset);
  321. printf("n");
  322. __os_free(argp, 0);
  323. return (0);
  324. }
  325. int
  326. __ham_newpage_read(dbenv, recbuf, argpp)
  327. DB_ENV *dbenv;
  328. void *recbuf;
  329. __ham_newpage_args **argpp;
  330. {
  331. __ham_newpage_args *argp;
  332. u_int8_t *bp;
  333. int ret;
  334. ret = __os_malloc(dbenv, sizeof(__ham_newpage_args) +
  335.     sizeof(DB_TXN), NULL, &argp);
  336. if (ret != 0)
  337. return (ret);
  338. argp->txnid = (DB_TXN *)&argp[1];
  339. bp = recbuf;
  340. memcpy(&argp->type, bp, sizeof(argp->type));
  341. bp += sizeof(argp->type);
  342. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  343. bp += sizeof(argp->txnid->txnid);
  344. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  345. bp += sizeof(DB_LSN);
  346. memcpy(&argp->opcode, bp, sizeof(argp->opcode));
  347. bp += sizeof(argp->opcode);
  348. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  349. bp += sizeof(argp->fileid);
  350. memcpy(&argp->prev_pgno, bp, sizeof(argp->prev_pgno));
  351. bp += sizeof(argp->prev_pgno);
  352. memcpy(&argp->prevlsn, bp,  sizeof(argp->prevlsn));
  353. bp += sizeof(argp->prevlsn);
  354. memcpy(&argp->new_pgno, bp, sizeof(argp->new_pgno));
  355. bp += sizeof(argp->new_pgno);
  356. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  357. bp += sizeof(argp->pagelsn);
  358. memcpy(&argp->next_pgno, bp, sizeof(argp->next_pgno));
  359. bp += sizeof(argp->next_pgno);
  360. memcpy(&argp->nextlsn, bp,  sizeof(argp->nextlsn));
  361. bp += sizeof(argp->nextlsn);
  362. *argpp = argp;
  363. return (0);
  364. }
  365. int
  366. __ham_splitmeta_print(dbenv, dbtp, lsnp, notused2, notused3)
  367. DB_ENV *dbenv;
  368. DBT *dbtp;
  369. DB_LSN *lsnp;
  370. db_recops notused2;
  371. void *notused3;
  372. {
  373. __ham_splitmeta_args *argp;
  374. u_int32_t i;
  375. u_int ch;
  376. int ret;
  377. i = 0;
  378. ch = 0;
  379. notused2 = DB_TXN_ABORT;
  380. notused3 = NULL;
  381. if ((ret = __ham_splitmeta_read(dbenv, dbtp->data, &argp)) != 0)
  382. return (ret);
  383. printf("[%lu][%lu]ham_splitmeta: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  384.     (u_long)lsnp->file,
  385.     (u_long)lsnp->offset,
  386.     (u_long)argp->type,
  387.     (u_long)argp->txnid->txnid,
  388.     (u_long)argp->prev_lsn.file,
  389.     (u_long)argp->prev_lsn.offset);
  390. printf("tfileid: %ldn", (long)argp->fileid);
  391. printf("tbucket: %lun", (u_long)argp->bucket);
  392. printf("tovflpoint: %lun", (u_long)argp->ovflpoint);
  393. printf("tspares: %lun", (u_long)argp->spares);
  394. printf("tmetalsn: [%lu][%lu]n",
  395.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  396. printf("n");
  397. __os_free(argp, 0);
  398. return (0);
  399. }
  400. int
  401. __ham_splitmeta_read(dbenv, recbuf, argpp)
  402. DB_ENV *dbenv;
  403. void *recbuf;
  404. __ham_splitmeta_args **argpp;
  405. {
  406. __ham_splitmeta_args *argp;
  407. u_int8_t *bp;
  408. int ret;
  409. ret = __os_malloc(dbenv, sizeof(__ham_splitmeta_args) +
  410.     sizeof(DB_TXN), NULL, &argp);
  411. if (ret != 0)
  412. return (ret);
  413. argp->txnid = (DB_TXN *)&argp[1];
  414. bp = recbuf;
  415. memcpy(&argp->type, bp, sizeof(argp->type));
  416. bp += sizeof(argp->type);
  417. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  418. bp += sizeof(argp->txnid->txnid);
  419. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  420. bp += sizeof(DB_LSN);
  421. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  422. bp += sizeof(argp->fileid);
  423. memcpy(&argp->bucket, bp, sizeof(argp->bucket));
  424. bp += sizeof(argp->bucket);
  425. memcpy(&argp->ovflpoint, bp, sizeof(argp->ovflpoint));
  426. bp += sizeof(argp->ovflpoint);
  427. memcpy(&argp->spares, bp, sizeof(argp->spares));
  428. bp += sizeof(argp->spares);
  429. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  430. bp += sizeof(argp->metalsn);
  431. *argpp = argp;
  432. return (0);
  433. }
  434. int
  435. __ham_splitdata_log(dbenv, txnid, ret_lsnp, flags,
  436. fileid, opcode, pgno, pageimage, pagelsn)
  437. DB_ENV *dbenv;
  438. DB_TXN *txnid;
  439. DB_LSN *ret_lsnp;
  440. u_int32_t flags;
  441. int32_t fileid;
  442. u_int32_t opcode;
  443. db_pgno_t pgno;
  444. const DBT *pageimage;
  445. DB_LSN * pagelsn;
  446. {
  447. DBT logrec;
  448. DB_LSN *lsnp, null_lsn;
  449. u_int32_t zero;
  450. u_int32_t rectype, txn_num;
  451. int ret;
  452. u_int8_t *bp;
  453. rectype = DB_ham_splitdata;
  454. if (txnid != NULL &&
  455.     TAILQ_FIRST(&txnid->kids) != NULL &&
  456.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  457. return (ret);
  458. txn_num = txnid == NULL ? 0 : txnid->txnid;
  459. if (txnid == NULL) {
  460. ZERO_LSN(null_lsn);
  461. lsnp = &null_lsn;
  462. } else
  463. lsnp = &txnid->last_lsn;
  464. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  465.     + sizeof(fileid)
  466.     + sizeof(opcode)
  467.     + sizeof(pgno)
  468.     + sizeof(u_int32_t) + (pageimage == NULL ? 0 : pageimage->size)
  469.     + sizeof(*pagelsn);
  470. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  471. return (ret);
  472. bp = logrec.data;
  473. memcpy(bp, &rectype, sizeof(rectype));
  474. bp += sizeof(rectype);
  475. memcpy(bp, &txn_num, sizeof(txn_num));
  476. bp += sizeof(txn_num);
  477. memcpy(bp, lsnp, sizeof(DB_LSN));
  478. bp += sizeof(DB_LSN);
  479. memcpy(bp, &fileid, sizeof(fileid));
  480. bp += sizeof(fileid);
  481. memcpy(bp, &opcode, sizeof(opcode));
  482. bp += sizeof(opcode);
  483. memcpy(bp, &pgno, sizeof(pgno));
  484. bp += sizeof(pgno);
  485. if (pageimage == NULL) {
  486. zero = 0;
  487. memcpy(bp, &zero, sizeof(u_int32_t));
  488. bp += sizeof(u_int32_t);
  489. } else {
  490. memcpy(bp, &pageimage->size, sizeof(pageimage->size));
  491. bp += sizeof(pageimage->size);
  492. memcpy(bp, pageimage->data, pageimage->size);
  493. bp += pageimage->size;
  494. }
  495. if (pagelsn != NULL)
  496. memcpy(bp, pagelsn, sizeof(*pagelsn));
  497. else
  498. memset(bp, 0, sizeof(*pagelsn));
  499. bp += sizeof(*pagelsn);
  500. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  501. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  502. if (txnid != NULL)
  503. txnid->last_lsn = *ret_lsnp;
  504. __os_free(logrec.data, logrec.size);
  505. return (ret);
  506. }
  507. int
  508. __ham_splitdata_print(dbenv, dbtp, lsnp, notused2, notused3)
  509. DB_ENV *dbenv;
  510. DBT *dbtp;
  511. DB_LSN *lsnp;
  512. db_recops notused2;
  513. void *notused3;
  514. {
  515. __ham_splitdata_args *argp;
  516. u_int32_t i;
  517. u_int ch;
  518. int ret;
  519. i = 0;
  520. ch = 0;
  521. notused2 = DB_TXN_ABORT;
  522. notused3 = NULL;
  523. if ((ret = __ham_splitdata_read(dbenv, dbtp->data, &argp)) != 0)
  524. return (ret);
  525. printf("[%lu][%lu]ham_splitdata: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  526.     (u_long)lsnp->file,
  527.     (u_long)lsnp->offset,
  528.     (u_long)argp->type,
  529.     (u_long)argp->txnid->txnid,
  530.     (u_long)argp->prev_lsn.file,
  531.     (u_long)argp->prev_lsn.offset);
  532. printf("tfileid: %ldn", (long)argp->fileid);
  533. printf("topcode: %lun", (u_long)argp->opcode);
  534. printf("tpgno: %lun", (u_long)argp->pgno);
  535. printf("tpageimage: ");
  536. for (i = 0; i < argp->pageimage.size; i++) {
  537. ch = ((u_int8_t *)argp->pageimage.data)[i];
  538. if (isprint(ch) || ch == 0xa)
  539. putchar(ch);
  540. else
  541. printf("%#x ", ch);
  542. }
  543. printf("n");
  544. printf("tpagelsn: [%lu][%lu]n",
  545.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  546. printf("n");
  547. __os_free(argp, 0);
  548. return (0);
  549. }
  550. int
  551. __ham_splitdata_read(dbenv, recbuf, argpp)
  552. DB_ENV *dbenv;
  553. void *recbuf;
  554. __ham_splitdata_args **argpp;
  555. {
  556. __ham_splitdata_args *argp;
  557. u_int8_t *bp;
  558. int ret;
  559. ret = __os_malloc(dbenv, sizeof(__ham_splitdata_args) +
  560.     sizeof(DB_TXN), NULL, &argp);
  561. if (ret != 0)
  562. return (ret);
  563. argp->txnid = (DB_TXN *)&argp[1];
  564. bp = recbuf;
  565. memcpy(&argp->type, bp, sizeof(argp->type));
  566. bp += sizeof(argp->type);
  567. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  568. bp += sizeof(argp->txnid->txnid);
  569. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  570. bp += sizeof(DB_LSN);
  571. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  572. bp += sizeof(argp->fileid);
  573. memcpy(&argp->opcode, bp, sizeof(argp->opcode));
  574. bp += sizeof(argp->opcode);
  575. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  576. bp += sizeof(argp->pgno);
  577. memset(&argp->pageimage, 0, sizeof(argp->pageimage));
  578. memcpy(&argp->pageimage.size, bp, sizeof(u_int32_t));
  579. bp += sizeof(u_int32_t);
  580. argp->pageimage.data = bp;
  581. bp += argp->pageimage.size;
  582. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  583. bp += sizeof(argp->pagelsn);
  584. *argpp = argp;
  585. return (0);
  586. }
  587. int
  588. __ham_replace_log(dbenv, txnid, ret_lsnp, flags,
  589. fileid, pgno, ndx, pagelsn, off, olditem,
  590. newitem, makedup)
  591. DB_ENV *dbenv;
  592. DB_TXN *txnid;
  593. DB_LSN *ret_lsnp;
  594. u_int32_t flags;
  595. int32_t fileid;
  596. db_pgno_t pgno;
  597. u_int32_t ndx;
  598. DB_LSN * pagelsn;
  599. int32_t off;
  600. const DBT *olditem;
  601. const DBT *newitem;
  602. u_int32_t makedup;
  603. {
  604. DBT logrec;
  605. DB_LSN *lsnp, null_lsn;
  606. u_int32_t zero;
  607. u_int32_t rectype, txn_num;
  608. int ret;
  609. u_int8_t *bp;
  610. rectype = DB_ham_replace;
  611. if (txnid != NULL &&
  612.     TAILQ_FIRST(&txnid->kids) != NULL &&
  613.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  614. return (ret);
  615. txn_num = txnid == NULL ? 0 : txnid->txnid;
  616. if (txnid == NULL) {
  617. ZERO_LSN(null_lsn);
  618. lsnp = &null_lsn;
  619. } else
  620. lsnp = &txnid->last_lsn;
  621. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  622.     + sizeof(fileid)
  623.     + sizeof(pgno)
  624.     + sizeof(ndx)
  625.     + sizeof(*pagelsn)
  626.     + sizeof(off)
  627.     + sizeof(u_int32_t) + (olditem == NULL ? 0 : olditem->size)
  628.     + sizeof(u_int32_t) + (newitem == NULL ? 0 : newitem->size)
  629.     + sizeof(makedup);
  630. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  631. return (ret);
  632. bp = logrec.data;
  633. memcpy(bp, &rectype, sizeof(rectype));
  634. bp += sizeof(rectype);
  635. memcpy(bp, &txn_num, sizeof(txn_num));
  636. bp += sizeof(txn_num);
  637. memcpy(bp, lsnp, sizeof(DB_LSN));
  638. bp += sizeof(DB_LSN);
  639. memcpy(bp, &fileid, sizeof(fileid));
  640. bp += sizeof(fileid);
  641. memcpy(bp, &pgno, sizeof(pgno));
  642. bp += sizeof(pgno);
  643. memcpy(bp, &ndx, sizeof(ndx));
  644. bp += sizeof(ndx);
  645. if (pagelsn != NULL)
  646. memcpy(bp, pagelsn, sizeof(*pagelsn));
  647. else
  648. memset(bp, 0, sizeof(*pagelsn));
  649. bp += sizeof(*pagelsn);
  650. memcpy(bp, &off, sizeof(off));
  651. bp += sizeof(off);
  652. if (olditem == NULL) {
  653. zero = 0;
  654. memcpy(bp, &zero, sizeof(u_int32_t));
  655. bp += sizeof(u_int32_t);
  656. } else {
  657. memcpy(bp, &olditem->size, sizeof(olditem->size));
  658. bp += sizeof(olditem->size);
  659. memcpy(bp, olditem->data, olditem->size);
  660. bp += olditem->size;
  661. }
  662. if (newitem == NULL) {
  663. zero = 0;
  664. memcpy(bp, &zero, sizeof(u_int32_t));
  665. bp += sizeof(u_int32_t);
  666. } else {
  667. memcpy(bp, &newitem->size, sizeof(newitem->size));
  668. bp += sizeof(newitem->size);
  669. memcpy(bp, newitem->data, newitem->size);
  670. bp += newitem->size;
  671. }
  672. memcpy(bp, &makedup, sizeof(makedup));
  673. bp += sizeof(makedup);
  674. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  675. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  676. if (txnid != NULL)
  677. txnid->last_lsn = *ret_lsnp;
  678. __os_free(logrec.data, logrec.size);
  679. return (ret);
  680. }
  681. int
  682. __ham_replace_print(dbenv, dbtp, lsnp, notused2, notused3)
  683. DB_ENV *dbenv;
  684. DBT *dbtp;
  685. DB_LSN *lsnp;
  686. db_recops notused2;
  687. void *notused3;
  688. {
  689. __ham_replace_args *argp;
  690. u_int32_t i;
  691. u_int ch;
  692. int ret;
  693. i = 0;
  694. ch = 0;
  695. notused2 = DB_TXN_ABORT;
  696. notused3 = NULL;
  697. if ((ret = __ham_replace_read(dbenv, dbtp->data, &argp)) != 0)
  698. return (ret);
  699. printf("[%lu][%lu]ham_replace: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  700.     (u_long)lsnp->file,
  701.     (u_long)lsnp->offset,
  702.     (u_long)argp->type,
  703.     (u_long)argp->txnid->txnid,
  704.     (u_long)argp->prev_lsn.file,
  705.     (u_long)argp->prev_lsn.offset);
  706. printf("tfileid: %ldn", (long)argp->fileid);
  707. printf("tpgno: %lun", (u_long)argp->pgno);
  708. printf("tndx: %lun", (u_long)argp->ndx);
  709. printf("tpagelsn: [%lu][%lu]n",
  710.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  711. printf("toff: %ldn", (long)argp->off);
  712. printf("tolditem: ");
  713. for (i = 0; i < argp->olditem.size; i++) {
  714. ch = ((u_int8_t *)argp->olditem.data)[i];
  715. if (isprint(ch) || ch == 0xa)
  716. putchar(ch);
  717. else
  718. printf("%#x ", ch);
  719. }
  720. printf("n");
  721. printf("tnewitem: ");
  722. for (i = 0; i < argp->newitem.size; i++) {
  723. ch = ((u_int8_t *)argp->newitem.data)[i];
  724. if (isprint(ch) || ch == 0xa)
  725. putchar(ch);
  726. else
  727. printf("%#x ", ch);
  728. }
  729. printf("n");
  730. printf("tmakedup: %lun", (u_long)argp->makedup);
  731. printf("n");
  732. __os_free(argp, 0);
  733. return (0);
  734. }
  735. int
  736. __ham_replace_read(dbenv, recbuf, argpp)
  737. DB_ENV *dbenv;
  738. void *recbuf;
  739. __ham_replace_args **argpp;
  740. {
  741. __ham_replace_args *argp;
  742. u_int8_t *bp;
  743. int ret;
  744. ret = __os_malloc(dbenv, sizeof(__ham_replace_args) +
  745.     sizeof(DB_TXN), NULL, &argp);
  746. if (ret != 0)
  747. return (ret);
  748. argp->txnid = (DB_TXN *)&argp[1];
  749. bp = recbuf;
  750. memcpy(&argp->type, bp, sizeof(argp->type));
  751. bp += sizeof(argp->type);
  752. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  753. bp += sizeof(argp->txnid->txnid);
  754. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  755. bp += sizeof(DB_LSN);
  756. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  757. bp += sizeof(argp->fileid);
  758. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  759. bp += sizeof(argp->pgno);
  760. memcpy(&argp->ndx, bp, sizeof(argp->ndx));
  761. bp += sizeof(argp->ndx);
  762. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  763. bp += sizeof(argp->pagelsn);
  764. memcpy(&argp->off, bp, sizeof(argp->off));
  765. bp += sizeof(argp->off);
  766. memset(&argp->olditem, 0, sizeof(argp->olditem));
  767. memcpy(&argp->olditem.size, bp, sizeof(u_int32_t));
  768. bp += sizeof(u_int32_t);
  769. argp->olditem.data = bp;
  770. bp += argp->olditem.size;
  771. memset(&argp->newitem, 0, sizeof(argp->newitem));
  772. memcpy(&argp->newitem.size, bp, sizeof(u_int32_t));
  773. bp += sizeof(u_int32_t);
  774. argp->newitem.data = bp;
  775. bp += argp->newitem.size;
  776. memcpy(&argp->makedup, bp, sizeof(argp->makedup));
  777. bp += sizeof(argp->makedup);
  778. *argpp = argp;
  779. return (0);
  780. }
  781. int
  782. __ham_newpgno_print(dbenv, dbtp, lsnp, notused2, notused3)
  783. DB_ENV *dbenv;
  784. DBT *dbtp;
  785. DB_LSN *lsnp;
  786. db_recops notused2;
  787. void *notused3;
  788. {
  789. __ham_newpgno_args *argp;
  790. u_int32_t i;
  791. u_int ch;
  792. int ret;
  793. i = 0;
  794. ch = 0;
  795. notused2 = DB_TXN_ABORT;
  796. notused3 = NULL;
  797. if ((ret = __ham_newpgno_read(dbenv, dbtp->data, &argp)) != 0)
  798. return (ret);
  799. printf("[%lu][%lu]ham_newpgno: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  800.     (u_long)lsnp->file,
  801.     (u_long)lsnp->offset,
  802.     (u_long)argp->type,
  803.     (u_long)argp->txnid->txnid,
  804.     (u_long)argp->prev_lsn.file,
  805.     (u_long)argp->prev_lsn.offset);
  806. printf("topcode: %lun", (u_long)argp->opcode);
  807. printf("tfileid: %ldn", (long)argp->fileid);
  808. printf("tpgno: %lun", (u_long)argp->pgno);
  809. printf("tfree_pgno: %lun", (u_long)argp->free_pgno);
  810. printf("told_type: %lun", (u_long)argp->old_type);
  811. printf("told_pgno: %lun", (u_long)argp->old_pgno);
  812. printf("tnew_type: %lun", (u_long)argp->new_type);
  813. printf("tpagelsn: [%lu][%lu]n",
  814.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  815. printf("tmetalsn: [%lu][%lu]n",
  816.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  817. printf("n");
  818. __os_free(argp, 0);
  819. return (0);
  820. }
  821. int
  822. __ham_newpgno_read(dbenv, recbuf, argpp)
  823. DB_ENV *dbenv;
  824. void *recbuf;
  825. __ham_newpgno_args **argpp;
  826. {
  827. __ham_newpgno_args *argp;
  828. u_int8_t *bp;
  829. int ret;
  830. ret = __os_malloc(dbenv, sizeof(__ham_newpgno_args) +
  831.     sizeof(DB_TXN), NULL, &argp);
  832. if (ret != 0)
  833. return (ret);
  834. argp->txnid = (DB_TXN *)&argp[1];
  835. bp = recbuf;
  836. memcpy(&argp->type, bp, sizeof(argp->type));
  837. bp += sizeof(argp->type);
  838. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  839. bp += sizeof(argp->txnid->txnid);
  840. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  841. bp += sizeof(DB_LSN);
  842. memcpy(&argp->opcode, bp, sizeof(argp->opcode));
  843. bp += sizeof(argp->opcode);
  844. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  845. bp += sizeof(argp->fileid);
  846. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  847. bp += sizeof(argp->pgno);
  848. memcpy(&argp->free_pgno, bp, sizeof(argp->free_pgno));
  849. bp += sizeof(argp->free_pgno);
  850. memcpy(&argp->old_type, bp, sizeof(argp->old_type));
  851. bp += sizeof(argp->old_type);
  852. memcpy(&argp->old_pgno, bp, sizeof(argp->old_pgno));
  853. bp += sizeof(argp->old_pgno);
  854. memcpy(&argp->new_type, bp, sizeof(argp->new_type));
  855. bp += sizeof(argp->new_type);
  856. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  857. bp += sizeof(argp->pagelsn);
  858. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  859. bp += sizeof(argp->metalsn);
  860. *argpp = argp;
  861. return (0);
  862. }
  863. int
  864. __ham_ovfl_print(dbenv, dbtp, lsnp, notused2, notused3)
  865. DB_ENV *dbenv;
  866. DBT *dbtp;
  867. DB_LSN *lsnp;
  868. db_recops notused2;
  869. void *notused3;
  870. {
  871. __ham_ovfl_args *argp;
  872. u_int32_t i;
  873. u_int ch;
  874. int ret;
  875. i = 0;
  876. ch = 0;
  877. notused2 = DB_TXN_ABORT;
  878. notused3 = NULL;
  879. if ((ret = __ham_ovfl_read(dbenv, dbtp->data, &argp)) != 0)
  880. return (ret);
  881. printf("[%lu][%lu]ham_ovfl: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  882.     (u_long)lsnp->file,
  883.     (u_long)lsnp->offset,
  884.     (u_long)argp->type,
  885.     (u_long)argp->txnid->txnid,
  886.     (u_long)argp->prev_lsn.file,
  887.     (u_long)argp->prev_lsn.offset);
  888. printf("tfileid: %ldn", (long)argp->fileid);
  889. printf("tstart_pgno: %lun", (u_long)argp->start_pgno);
  890. printf("tnpages: %lun", (u_long)argp->npages);
  891. printf("tfree_pgno: %lun", (u_long)argp->free_pgno);
  892. printf("tovflpoint: %lun", (u_long)argp->ovflpoint);
  893. printf("tmetalsn: [%lu][%lu]n",
  894.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  895. printf("n");
  896. __os_free(argp, 0);
  897. return (0);
  898. }
  899. int
  900. __ham_ovfl_read(dbenv, recbuf, argpp)
  901. DB_ENV *dbenv;
  902. void *recbuf;
  903. __ham_ovfl_args **argpp;
  904. {
  905. __ham_ovfl_args *argp;
  906. u_int8_t *bp;
  907. int ret;
  908. ret = __os_malloc(dbenv, sizeof(__ham_ovfl_args) +
  909.     sizeof(DB_TXN), NULL, &argp);
  910. if (ret != 0)
  911. return (ret);
  912. argp->txnid = (DB_TXN *)&argp[1];
  913. bp = recbuf;
  914. memcpy(&argp->type, bp, sizeof(argp->type));
  915. bp += sizeof(argp->type);
  916. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  917. bp += sizeof(argp->txnid->txnid);
  918. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  919. bp += sizeof(DB_LSN);
  920. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  921. bp += sizeof(argp->fileid);
  922. memcpy(&argp->start_pgno, bp, sizeof(argp->start_pgno));
  923. bp += sizeof(argp->start_pgno);
  924. memcpy(&argp->npages, bp, sizeof(argp->npages));
  925. bp += sizeof(argp->npages);
  926. memcpy(&argp->free_pgno, bp, sizeof(argp->free_pgno));
  927. bp += sizeof(argp->free_pgno);
  928. memcpy(&argp->ovflpoint, bp, sizeof(argp->ovflpoint));
  929. bp += sizeof(argp->ovflpoint);
  930. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  931. bp += sizeof(argp->metalsn);
  932. *argpp = argp;
  933. return (0);
  934. }
  935. int
  936. __ham_copypage_log(dbenv, txnid, ret_lsnp, flags,
  937. fileid, pgno, pagelsn, next_pgno, nextlsn, nnext_pgno,
  938. nnextlsn, page)
  939. DB_ENV *dbenv;
  940. DB_TXN *txnid;
  941. DB_LSN *ret_lsnp;
  942. u_int32_t flags;
  943. int32_t fileid;
  944. db_pgno_t pgno;
  945. DB_LSN * pagelsn;
  946. db_pgno_t next_pgno;
  947. DB_LSN * nextlsn;
  948. db_pgno_t nnext_pgno;
  949. DB_LSN * nnextlsn;
  950. const DBT *page;
  951. {
  952. DBT logrec;
  953. DB_LSN *lsnp, null_lsn;
  954. u_int32_t zero;
  955. u_int32_t rectype, txn_num;
  956. int ret;
  957. u_int8_t *bp;
  958. rectype = DB_ham_copypage;
  959. if (txnid != NULL &&
  960.     TAILQ_FIRST(&txnid->kids) != NULL &&
  961.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  962. return (ret);
  963. txn_num = txnid == NULL ? 0 : txnid->txnid;
  964. if (txnid == NULL) {
  965. ZERO_LSN(null_lsn);
  966. lsnp = &null_lsn;
  967. } else
  968. lsnp = &txnid->last_lsn;
  969. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  970.     + sizeof(fileid)
  971.     + sizeof(pgno)
  972.     + sizeof(*pagelsn)
  973.     + sizeof(next_pgno)
  974.     + sizeof(*nextlsn)
  975.     + sizeof(nnext_pgno)
  976.     + sizeof(*nnextlsn)
  977.     + sizeof(u_int32_t) + (page == NULL ? 0 : page->size);
  978. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  979. return (ret);
  980. bp = logrec.data;
  981. memcpy(bp, &rectype, sizeof(rectype));
  982. bp += sizeof(rectype);
  983. memcpy(bp, &txn_num, sizeof(txn_num));
  984. bp += sizeof(txn_num);
  985. memcpy(bp, lsnp, sizeof(DB_LSN));
  986. bp += sizeof(DB_LSN);
  987. memcpy(bp, &fileid, sizeof(fileid));
  988. bp += sizeof(fileid);
  989. memcpy(bp, &pgno, sizeof(pgno));
  990. bp += sizeof(pgno);
  991. if (pagelsn != NULL)
  992. memcpy(bp, pagelsn, sizeof(*pagelsn));
  993. else
  994. memset(bp, 0, sizeof(*pagelsn));
  995. bp += sizeof(*pagelsn);
  996. memcpy(bp, &next_pgno, sizeof(next_pgno));
  997. bp += sizeof(next_pgno);
  998. if (nextlsn != NULL)
  999. memcpy(bp, nextlsn, sizeof(*nextlsn));
  1000. else
  1001. memset(bp, 0, sizeof(*nextlsn));
  1002. bp += sizeof(*nextlsn);
  1003. memcpy(bp, &nnext_pgno, sizeof(nnext_pgno));
  1004. bp += sizeof(nnext_pgno);
  1005. if (nnextlsn != NULL)
  1006. memcpy(bp, nnextlsn, sizeof(*nnextlsn));
  1007. else
  1008. memset(bp, 0, sizeof(*nnextlsn));
  1009. bp += sizeof(*nnextlsn);
  1010. if (page == NULL) {
  1011. zero = 0;
  1012. memcpy(bp, &zero, sizeof(u_int32_t));
  1013. bp += sizeof(u_int32_t);
  1014. } else {
  1015. memcpy(bp, &page->size, sizeof(page->size));
  1016. bp += sizeof(page->size);
  1017. memcpy(bp, page->data, page->size);
  1018. bp += page->size;
  1019. }
  1020. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  1021. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  1022. if (txnid != NULL)
  1023. txnid->last_lsn = *ret_lsnp;
  1024. __os_free(logrec.data, logrec.size);
  1025. return (ret);
  1026. }
  1027. int
  1028. __ham_copypage_print(dbenv, dbtp, lsnp, notused2, notused3)
  1029. DB_ENV *dbenv;
  1030. DBT *dbtp;
  1031. DB_LSN *lsnp;
  1032. db_recops notused2;
  1033. void *notused3;
  1034. {
  1035. __ham_copypage_args *argp;
  1036. u_int32_t i;
  1037. u_int ch;
  1038. int ret;
  1039. i = 0;
  1040. ch = 0;
  1041. notused2 = DB_TXN_ABORT;
  1042. notused3 = NULL;
  1043. if ((ret = __ham_copypage_read(dbenv, dbtp->data, &argp)) != 0)
  1044. return (ret);
  1045. printf("[%lu][%lu]ham_copypage: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1046.     (u_long)lsnp->file,
  1047.     (u_long)lsnp->offset,
  1048.     (u_long)argp->type,
  1049.     (u_long)argp->txnid->txnid,
  1050.     (u_long)argp->prev_lsn.file,
  1051.     (u_long)argp->prev_lsn.offset);
  1052. printf("tfileid: %ldn", (long)argp->fileid);
  1053. printf("tpgno: %lun", (u_long)argp->pgno);
  1054. printf("tpagelsn: [%lu][%lu]n",
  1055.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  1056. printf("tnext_pgno: %lun", (u_long)argp->next_pgno);
  1057. printf("tnextlsn: [%lu][%lu]n",
  1058.     (u_long)argp->nextlsn.file, (u_long)argp->nextlsn.offset);
  1059. printf("tnnext_pgno: %lun", (u_long)argp->nnext_pgno);
  1060. printf("tnnextlsn: [%lu][%lu]n",
  1061.     (u_long)argp->nnextlsn.file, (u_long)argp->nnextlsn.offset);
  1062. printf("tpage: ");
  1063. for (i = 0; i < argp->page.size; i++) {
  1064. ch = ((u_int8_t *)argp->page.data)[i];
  1065. if (isprint(ch) || ch == 0xa)
  1066. putchar(ch);
  1067. else
  1068. printf("%#x ", ch);
  1069. }
  1070. printf("n");
  1071. printf("n");
  1072. __os_free(argp, 0);
  1073. return (0);
  1074. }
  1075. int
  1076. __ham_copypage_read(dbenv, recbuf, argpp)
  1077. DB_ENV *dbenv;
  1078. void *recbuf;
  1079. __ham_copypage_args **argpp;
  1080. {
  1081. __ham_copypage_args *argp;
  1082. u_int8_t *bp;
  1083. int ret;
  1084. ret = __os_malloc(dbenv, sizeof(__ham_copypage_args) +
  1085.     sizeof(DB_TXN), NULL, &argp);
  1086. if (ret != 0)
  1087. return (ret);
  1088. argp->txnid = (DB_TXN *)&argp[1];
  1089. bp = recbuf;
  1090. memcpy(&argp->type, bp, sizeof(argp->type));
  1091. bp += sizeof(argp->type);
  1092. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1093. bp += sizeof(argp->txnid->txnid);
  1094. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1095. bp += sizeof(DB_LSN);
  1096. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1097. bp += sizeof(argp->fileid);
  1098. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  1099. bp += sizeof(argp->pgno);
  1100. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  1101. bp += sizeof(argp->pagelsn);
  1102. memcpy(&argp->next_pgno, bp, sizeof(argp->next_pgno));
  1103. bp += sizeof(argp->next_pgno);
  1104. memcpy(&argp->nextlsn, bp,  sizeof(argp->nextlsn));
  1105. bp += sizeof(argp->nextlsn);
  1106. memcpy(&argp->nnext_pgno, bp, sizeof(argp->nnext_pgno));
  1107. bp += sizeof(argp->nnext_pgno);
  1108. memcpy(&argp->nnextlsn, bp,  sizeof(argp->nnextlsn));
  1109. bp += sizeof(argp->nnextlsn);
  1110. memset(&argp->page, 0, sizeof(argp->page));
  1111. memcpy(&argp->page.size, bp, sizeof(u_int32_t));
  1112. bp += sizeof(u_int32_t);
  1113. argp->page.data = bp;
  1114. bp += argp->page.size;
  1115. *argpp = argp;
  1116. return (0);
  1117. }
  1118. int
  1119. __ham_metagroup_log(dbenv, txnid, ret_lsnp, flags,
  1120. fileid, bucket, pgno, metalsn, pagelsn)
  1121. DB_ENV *dbenv;
  1122. DB_TXN *txnid;
  1123. DB_LSN *ret_lsnp;
  1124. u_int32_t flags;
  1125. int32_t fileid;
  1126. u_int32_t bucket;
  1127. db_pgno_t pgno;
  1128. DB_LSN * metalsn;
  1129. DB_LSN * pagelsn;
  1130. {
  1131. DBT logrec;
  1132. DB_LSN *lsnp, null_lsn;
  1133. u_int32_t rectype, txn_num;
  1134. int ret;
  1135. u_int8_t *bp;
  1136. rectype = DB_ham_metagroup;
  1137. if (txnid != NULL &&
  1138.     TAILQ_FIRST(&txnid->kids) != NULL &&
  1139.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1140. return (ret);
  1141. txn_num = txnid == NULL ? 0 : txnid->txnid;
  1142. if (txnid == NULL) {
  1143. ZERO_LSN(null_lsn);
  1144. lsnp = &null_lsn;
  1145. } else
  1146. lsnp = &txnid->last_lsn;
  1147. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1148.     + sizeof(fileid)
  1149.     + sizeof(bucket)
  1150.     + sizeof(pgno)
  1151.     + sizeof(*metalsn)
  1152.     + sizeof(*pagelsn);
  1153. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  1154. return (ret);
  1155. bp = logrec.data;
  1156. memcpy(bp, &rectype, sizeof(rectype));
  1157. bp += sizeof(rectype);
  1158. memcpy(bp, &txn_num, sizeof(txn_num));
  1159. bp += sizeof(txn_num);
  1160. memcpy(bp, lsnp, sizeof(DB_LSN));
  1161. bp += sizeof(DB_LSN);
  1162. memcpy(bp, &fileid, sizeof(fileid));
  1163. bp += sizeof(fileid);
  1164. memcpy(bp, &bucket, sizeof(bucket));
  1165. bp += sizeof(bucket);
  1166. memcpy(bp, &pgno, sizeof(pgno));
  1167. bp += sizeof(pgno);
  1168. if (metalsn != NULL)
  1169. memcpy(bp, metalsn, sizeof(*metalsn));
  1170. else
  1171. memset(bp, 0, sizeof(*metalsn));
  1172. bp += sizeof(*metalsn);
  1173. if (pagelsn != NULL)
  1174. memcpy(bp, pagelsn, sizeof(*pagelsn));
  1175. else
  1176. memset(bp, 0, sizeof(*pagelsn));
  1177. bp += sizeof(*pagelsn);
  1178. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  1179. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  1180. if (txnid != NULL)
  1181. txnid->last_lsn = *ret_lsnp;
  1182. __os_free(logrec.data, logrec.size);
  1183. return (ret);
  1184. }
  1185. int
  1186. __ham_metagroup_print(dbenv, dbtp, lsnp, notused2, notused3)
  1187. DB_ENV *dbenv;
  1188. DBT *dbtp;
  1189. DB_LSN *lsnp;
  1190. db_recops notused2;
  1191. void *notused3;
  1192. {
  1193. __ham_metagroup_args *argp;
  1194. u_int32_t i;
  1195. u_int ch;
  1196. int ret;
  1197. i = 0;
  1198. ch = 0;
  1199. notused2 = DB_TXN_ABORT;
  1200. notused3 = NULL;
  1201. if ((ret = __ham_metagroup_read(dbenv, dbtp->data, &argp)) != 0)
  1202. return (ret);
  1203. printf("[%lu][%lu]ham_metagroup: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1204.     (u_long)lsnp->file,
  1205.     (u_long)lsnp->offset,
  1206.     (u_long)argp->type,
  1207.     (u_long)argp->txnid->txnid,
  1208.     (u_long)argp->prev_lsn.file,
  1209.     (u_long)argp->prev_lsn.offset);
  1210. printf("tfileid: %ldn", (long)argp->fileid);
  1211. printf("tbucket: %lun", (u_long)argp->bucket);
  1212. printf("tpgno: %lun", (u_long)argp->pgno);
  1213. printf("tmetalsn: [%lu][%lu]n",
  1214.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  1215. printf("tpagelsn: [%lu][%lu]n",
  1216.     (u_long)argp->pagelsn.file, (u_long)argp->pagelsn.offset);
  1217. printf("n");
  1218. __os_free(argp, 0);
  1219. return (0);
  1220. }
  1221. int
  1222. __ham_metagroup_read(dbenv, recbuf, argpp)
  1223. DB_ENV *dbenv;
  1224. void *recbuf;
  1225. __ham_metagroup_args **argpp;
  1226. {
  1227. __ham_metagroup_args *argp;
  1228. u_int8_t *bp;
  1229. int ret;
  1230. ret = __os_malloc(dbenv, sizeof(__ham_metagroup_args) +
  1231.     sizeof(DB_TXN), NULL, &argp);
  1232. if (ret != 0)
  1233. return (ret);
  1234. argp->txnid = (DB_TXN *)&argp[1];
  1235. bp = recbuf;
  1236. memcpy(&argp->type, bp, sizeof(argp->type));
  1237. bp += sizeof(argp->type);
  1238. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1239. bp += sizeof(argp->txnid->txnid);
  1240. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1241. bp += sizeof(DB_LSN);
  1242. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1243. bp += sizeof(argp->fileid);
  1244. memcpy(&argp->bucket, bp, sizeof(argp->bucket));
  1245. bp += sizeof(argp->bucket);
  1246. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  1247. bp += sizeof(argp->pgno);
  1248. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  1249. bp += sizeof(argp->metalsn);
  1250. memcpy(&argp->pagelsn, bp,  sizeof(argp->pagelsn));
  1251. bp += sizeof(argp->pagelsn);
  1252. *argpp = argp;
  1253. return (0);
  1254. }
  1255. int
  1256. __ham_groupalloc1_print(dbenv, dbtp, lsnp, notused2, notused3)
  1257. DB_ENV *dbenv;
  1258. DBT *dbtp;
  1259. DB_LSN *lsnp;
  1260. db_recops notused2;
  1261. void *notused3;
  1262. {
  1263. __ham_groupalloc1_args *argp;
  1264. u_int32_t i;
  1265. u_int ch;
  1266. int ret;
  1267. i = 0;
  1268. ch = 0;
  1269. notused2 = DB_TXN_ABORT;
  1270. notused3 = NULL;
  1271. if ((ret = __ham_groupalloc1_read(dbenv, dbtp->data, &argp)) != 0)
  1272. return (ret);
  1273. printf("[%lu][%lu]ham_groupalloc1: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1274.     (u_long)lsnp->file,
  1275.     (u_long)lsnp->offset,
  1276.     (u_long)argp->type,
  1277.     (u_long)argp->txnid->txnid,
  1278.     (u_long)argp->prev_lsn.file,
  1279.     (u_long)argp->prev_lsn.offset);
  1280. printf("tfileid: %ldn", (long)argp->fileid);
  1281. printf("tpgno: %lun", (u_long)argp->pgno);
  1282. printf("tmetalsn: [%lu][%lu]n",
  1283.     (u_long)argp->metalsn.file, (u_long)argp->metalsn.offset);
  1284. printf("tmmetalsn: [%lu][%lu]n",
  1285.     (u_long)argp->mmetalsn.file, (u_long)argp->mmetalsn.offset);
  1286. printf("tstart_pgno: %lun", (u_long)argp->start_pgno);
  1287. printf("tnum: %lun", (u_long)argp->num);
  1288. printf("n");
  1289. __os_free(argp, 0);
  1290. return (0);
  1291. }
  1292. int
  1293. __ham_groupalloc1_read(dbenv, recbuf, argpp)
  1294. DB_ENV *dbenv;
  1295. void *recbuf;
  1296. __ham_groupalloc1_args **argpp;
  1297. {
  1298. __ham_groupalloc1_args *argp;
  1299. u_int8_t *bp;
  1300. int ret;
  1301. ret = __os_malloc(dbenv, sizeof(__ham_groupalloc1_args) +
  1302.     sizeof(DB_TXN), NULL, &argp);
  1303. if (ret != 0)
  1304. return (ret);
  1305. argp->txnid = (DB_TXN *)&argp[1];
  1306. bp = recbuf;
  1307. memcpy(&argp->type, bp, sizeof(argp->type));
  1308. bp += sizeof(argp->type);
  1309. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1310. bp += sizeof(argp->txnid->txnid);
  1311. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1312. bp += sizeof(DB_LSN);
  1313. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1314. bp += sizeof(argp->fileid);
  1315. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  1316. bp += sizeof(argp->pgno);
  1317. memcpy(&argp->metalsn, bp,  sizeof(argp->metalsn));
  1318. bp += sizeof(argp->metalsn);
  1319. memcpy(&argp->mmetalsn, bp,  sizeof(argp->mmetalsn));
  1320. bp += sizeof(argp->mmetalsn);
  1321. memcpy(&argp->start_pgno, bp, sizeof(argp->start_pgno));
  1322. bp += sizeof(argp->start_pgno);
  1323. memcpy(&argp->num, bp, sizeof(argp->num));
  1324. bp += sizeof(argp->num);
  1325. *argpp = argp;
  1326. return (0);
  1327. }
  1328. int
  1329. __ham_groupalloc2_print(dbenv, dbtp, lsnp, notused2, notused3)
  1330. DB_ENV *dbenv;
  1331. DBT *dbtp;
  1332. DB_LSN *lsnp;
  1333. db_recops notused2;
  1334. void *notused3;
  1335. {
  1336. __ham_groupalloc2_args *argp;
  1337. u_int32_t i;
  1338. u_int ch;
  1339. int ret;
  1340. i = 0;
  1341. ch = 0;
  1342. notused2 = DB_TXN_ABORT;
  1343. notused3 = NULL;
  1344. if ((ret = __ham_groupalloc2_read(dbenv, dbtp->data, &argp)) != 0)
  1345. return (ret);
  1346. printf("[%lu][%lu]ham_groupalloc2: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1347.     (u_long)lsnp->file,
  1348.     (u_long)lsnp->offset,
  1349.     (u_long)argp->type,
  1350.     (u_long)argp->txnid->txnid,
  1351.     (u_long)argp->prev_lsn.file,
  1352.     (u_long)argp->prev_lsn.offset);
  1353. printf("tfileid: %ldn", (long)argp->fileid);
  1354. printf("tmeta_lsn: [%lu][%lu]n",
  1355.     (u_long)argp->meta_lsn.file, (u_long)argp->meta_lsn.offset);
  1356. printf("talloc_lsn: [%lu][%lu]n",
  1357.     (u_long)argp->alloc_lsn.file, (u_long)argp->alloc_lsn.offset);
  1358. printf("tstart_pgno: %lun", (u_long)argp->start_pgno);
  1359. printf("tnum: %lun", (u_long)argp->num);
  1360. printf("tfree: %lun", (u_long)argp->free);
  1361. printf("n");
  1362. __os_free(argp, 0);
  1363. return (0);
  1364. }
  1365. int
  1366. __ham_groupalloc2_read(dbenv, recbuf, argpp)
  1367. DB_ENV *dbenv;
  1368. void *recbuf;
  1369. __ham_groupalloc2_args **argpp;
  1370. {
  1371. __ham_groupalloc2_args *argp;
  1372. u_int8_t *bp;
  1373. int ret;
  1374. ret = __os_malloc(dbenv, sizeof(__ham_groupalloc2_args) +
  1375.     sizeof(DB_TXN), NULL, &argp);
  1376. if (ret != 0)
  1377. return (ret);
  1378. argp->txnid = (DB_TXN *)&argp[1];
  1379. bp = recbuf;
  1380. memcpy(&argp->type, bp, sizeof(argp->type));
  1381. bp += sizeof(argp->type);
  1382. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1383. bp += sizeof(argp->txnid->txnid);
  1384. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1385. bp += sizeof(DB_LSN);
  1386. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1387. bp += sizeof(argp->fileid);
  1388. memcpy(&argp->meta_lsn, bp,  sizeof(argp->meta_lsn));
  1389. bp += sizeof(argp->meta_lsn);
  1390. memcpy(&argp->alloc_lsn, bp,  sizeof(argp->alloc_lsn));
  1391. bp += sizeof(argp->alloc_lsn);
  1392. memcpy(&argp->start_pgno, bp, sizeof(argp->start_pgno));
  1393. bp += sizeof(argp->start_pgno);
  1394. memcpy(&argp->num, bp, sizeof(argp->num));
  1395. bp += sizeof(argp->num);
  1396. memcpy(&argp->free, bp, sizeof(argp->free));
  1397. bp += sizeof(argp->free);
  1398. *argpp = argp;
  1399. return (0);
  1400. }
  1401. int
  1402. __ham_groupalloc_log(dbenv, txnid, ret_lsnp, flags,
  1403. fileid, meta_lsn, start_pgno, num, free)
  1404. DB_ENV *dbenv;
  1405. DB_TXN *txnid;
  1406. DB_LSN *ret_lsnp;
  1407. u_int32_t flags;
  1408. int32_t fileid;
  1409. DB_LSN * meta_lsn;
  1410. db_pgno_t start_pgno;
  1411. u_int32_t num;
  1412. db_pgno_t free;
  1413. {
  1414. DBT logrec;
  1415. DB_LSN *lsnp, null_lsn;
  1416. u_int32_t rectype, txn_num;
  1417. int ret;
  1418. u_int8_t *bp;
  1419. rectype = DB_ham_groupalloc;
  1420. if (txnid != NULL &&
  1421.     TAILQ_FIRST(&txnid->kids) != NULL &&
  1422.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1423. return (ret);
  1424. txn_num = txnid == NULL ? 0 : txnid->txnid;
  1425. if (txnid == NULL) {
  1426. ZERO_LSN(null_lsn);
  1427. lsnp = &null_lsn;
  1428. } else
  1429. lsnp = &txnid->last_lsn;
  1430. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1431.     + sizeof(fileid)
  1432.     + sizeof(*meta_lsn)
  1433.     + sizeof(start_pgno)
  1434.     + sizeof(num)
  1435.     + sizeof(free);
  1436. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  1437. return (ret);
  1438. bp = logrec.data;
  1439. memcpy(bp, &rectype, sizeof(rectype));
  1440. bp += sizeof(rectype);
  1441. memcpy(bp, &txn_num, sizeof(txn_num));
  1442. bp += sizeof(txn_num);
  1443. memcpy(bp, lsnp, sizeof(DB_LSN));
  1444. bp += sizeof(DB_LSN);
  1445. memcpy(bp, &fileid, sizeof(fileid));
  1446. bp += sizeof(fileid);
  1447. if (meta_lsn != NULL)
  1448. memcpy(bp, meta_lsn, sizeof(*meta_lsn));
  1449. else
  1450. memset(bp, 0, sizeof(*meta_lsn));
  1451. bp += sizeof(*meta_lsn);
  1452. memcpy(bp, &start_pgno, sizeof(start_pgno));
  1453. bp += sizeof(start_pgno);
  1454. memcpy(bp, &num, sizeof(num));
  1455. bp += sizeof(num);
  1456. memcpy(bp, &free, sizeof(free));
  1457. bp += sizeof(free);
  1458. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  1459. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  1460. if (txnid != NULL)
  1461. txnid->last_lsn = *ret_lsnp;
  1462. __os_free(logrec.data, logrec.size);
  1463. return (ret);
  1464. }
  1465. int
  1466. __ham_groupalloc_print(dbenv, dbtp, lsnp, notused2, notused3)
  1467. DB_ENV *dbenv;
  1468. DBT *dbtp;
  1469. DB_LSN *lsnp;
  1470. db_recops notused2;
  1471. void *notused3;
  1472. {
  1473. __ham_groupalloc_args *argp;
  1474. u_int32_t i;
  1475. u_int ch;
  1476. int ret;
  1477. i = 0;
  1478. ch = 0;
  1479. notused2 = DB_TXN_ABORT;
  1480. notused3 = NULL;
  1481. if ((ret = __ham_groupalloc_read(dbenv, dbtp->data, &argp)) != 0)
  1482. return (ret);
  1483. printf("[%lu][%lu]ham_groupalloc: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1484.     (u_long)lsnp->file,
  1485.     (u_long)lsnp->offset,
  1486.     (u_long)argp->type,
  1487.     (u_long)argp->txnid->txnid,
  1488.     (u_long)argp->prev_lsn.file,
  1489.     (u_long)argp->prev_lsn.offset);
  1490. printf("tfileid: %ldn", (long)argp->fileid);
  1491. printf("tmeta_lsn: [%lu][%lu]n",
  1492.     (u_long)argp->meta_lsn.file, (u_long)argp->meta_lsn.offset);
  1493. printf("tstart_pgno: %lun", (u_long)argp->start_pgno);
  1494. printf("tnum: %lun", (u_long)argp->num);
  1495. printf("tfree: %lun", (u_long)argp->free);
  1496. printf("n");
  1497. __os_free(argp, 0);
  1498. return (0);
  1499. }
  1500. int
  1501. __ham_groupalloc_read(dbenv, recbuf, argpp)
  1502. DB_ENV *dbenv;
  1503. void *recbuf;
  1504. __ham_groupalloc_args **argpp;
  1505. {
  1506. __ham_groupalloc_args *argp;
  1507. u_int8_t *bp;
  1508. int ret;
  1509. ret = __os_malloc(dbenv, sizeof(__ham_groupalloc_args) +
  1510.     sizeof(DB_TXN), NULL, &argp);
  1511. if (ret != 0)
  1512. return (ret);
  1513. argp->txnid = (DB_TXN *)&argp[1];
  1514. bp = recbuf;
  1515. memcpy(&argp->type, bp, sizeof(argp->type));
  1516. bp += sizeof(argp->type);
  1517. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1518. bp += sizeof(argp->txnid->txnid);
  1519. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1520. bp += sizeof(DB_LSN);
  1521. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1522. bp += sizeof(argp->fileid);
  1523. memcpy(&argp->meta_lsn, bp,  sizeof(argp->meta_lsn));
  1524. bp += sizeof(argp->meta_lsn);
  1525. memcpy(&argp->start_pgno, bp, sizeof(argp->start_pgno));
  1526. bp += sizeof(argp->start_pgno);
  1527. memcpy(&argp->num, bp, sizeof(argp->num));
  1528. bp += sizeof(argp->num);
  1529. memcpy(&argp->free, bp, sizeof(argp->free));
  1530. bp += sizeof(argp->free);
  1531. *argpp = argp;
  1532. return (0);
  1533. }
  1534. int
  1535. __ham_curadj_log(dbenv, txnid, ret_lsnp, flags,
  1536. fileid, pgno, indx, len, dup_off, add,
  1537. is_dup, order)
  1538. DB_ENV *dbenv;
  1539. DB_TXN *txnid;
  1540. DB_LSN *ret_lsnp;
  1541. u_int32_t flags;
  1542. int32_t fileid;
  1543. db_pgno_t pgno;
  1544. u_int32_t indx;
  1545. u_int32_t len;
  1546. u_int32_t dup_off;
  1547. int add;
  1548. int is_dup;
  1549. u_int32_t order;
  1550. {
  1551. DBT logrec;
  1552. DB_LSN *lsnp, null_lsn;
  1553. u_int32_t rectype, txn_num;
  1554. int ret;
  1555. u_int8_t *bp;
  1556. rectype = DB_ham_curadj;
  1557. if (txnid != NULL &&
  1558.     TAILQ_FIRST(&txnid->kids) != NULL &&
  1559.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1560. return (ret);
  1561. txn_num = txnid == NULL ? 0 : txnid->txnid;
  1562. if (txnid == NULL) {
  1563. ZERO_LSN(null_lsn);
  1564. lsnp = &null_lsn;
  1565. } else
  1566. lsnp = &txnid->last_lsn;
  1567. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1568.     + sizeof(fileid)
  1569.     + sizeof(pgno)
  1570.     + sizeof(indx)
  1571.     + sizeof(len)
  1572.     + sizeof(dup_off)
  1573.     + sizeof(add)
  1574.     + sizeof(is_dup)
  1575.     + sizeof(order);
  1576. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  1577. return (ret);
  1578. bp = logrec.data;
  1579. memcpy(bp, &rectype, sizeof(rectype));
  1580. bp += sizeof(rectype);
  1581. memcpy(bp, &txn_num, sizeof(txn_num));
  1582. bp += sizeof(txn_num);
  1583. memcpy(bp, lsnp, sizeof(DB_LSN));
  1584. bp += sizeof(DB_LSN);
  1585. memcpy(bp, &fileid, sizeof(fileid));
  1586. bp += sizeof(fileid);
  1587. memcpy(bp, &pgno, sizeof(pgno));
  1588. bp += sizeof(pgno);
  1589. memcpy(bp, &indx, sizeof(indx));
  1590. bp += sizeof(indx);
  1591. memcpy(bp, &len, sizeof(len));
  1592. bp += sizeof(len);
  1593. memcpy(bp, &dup_off, sizeof(dup_off));
  1594. bp += sizeof(dup_off);
  1595. memcpy(bp, &add, sizeof(add));
  1596. bp += sizeof(add);
  1597. memcpy(bp, &is_dup, sizeof(is_dup));
  1598. bp += sizeof(is_dup);
  1599. memcpy(bp, &order, sizeof(order));
  1600. bp += sizeof(order);
  1601. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  1602. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  1603. if (txnid != NULL)
  1604. txnid->last_lsn = *ret_lsnp;
  1605. __os_free(logrec.data, logrec.size);
  1606. return (ret);
  1607. }
  1608. int
  1609. __ham_curadj_print(dbenv, dbtp, lsnp, notused2, notused3)
  1610. DB_ENV *dbenv;
  1611. DBT *dbtp;
  1612. DB_LSN *lsnp;
  1613. db_recops notused2;
  1614. void *notused3;
  1615. {
  1616. __ham_curadj_args *argp;
  1617. u_int32_t i;
  1618. u_int ch;
  1619. int ret;
  1620. i = 0;
  1621. ch = 0;
  1622. notused2 = DB_TXN_ABORT;
  1623. notused3 = NULL;
  1624. if ((ret = __ham_curadj_read(dbenv, dbtp->data, &argp)) != 0)
  1625. return (ret);
  1626. printf("[%lu][%lu]ham_curadj: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1627.     (u_long)lsnp->file,
  1628.     (u_long)lsnp->offset,
  1629.     (u_long)argp->type,
  1630.     (u_long)argp->txnid->txnid,
  1631.     (u_long)argp->prev_lsn.file,
  1632.     (u_long)argp->prev_lsn.offset);
  1633. printf("tfileid: %ldn", (long)argp->fileid);
  1634. printf("tpgno: %lun", (u_long)argp->pgno);
  1635. printf("tindx: %lun", (u_long)argp->indx);
  1636. printf("tlen: %lun", (u_long)argp->len);
  1637. printf("tdup_off: %lun", (u_long)argp->dup_off);
  1638. printf("tadd: %ldn", (long)argp->add);
  1639. printf("tis_dup: %ldn", (long)argp->is_dup);
  1640. printf("torder: %lun", (u_long)argp->order);
  1641. printf("n");
  1642. __os_free(argp, 0);
  1643. return (0);
  1644. }
  1645. int
  1646. __ham_curadj_read(dbenv, recbuf, argpp)
  1647. DB_ENV *dbenv;
  1648. void *recbuf;
  1649. __ham_curadj_args **argpp;
  1650. {
  1651. __ham_curadj_args *argp;
  1652. u_int8_t *bp;
  1653. int ret;
  1654. ret = __os_malloc(dbenv, sizeof(__ham_curadj_args) +
  1655.     sizeof(DB_TXN), NULL, &argp);
  1656. if (ret != 0)
  1657. return (ret);
  1658. argp->txnid = (DB_TXN *)&argp[1];
  1659. bp = recbuf;
  1660. memcpy(&argp->type, bp, sizeof(argp->type));
  1661. bp += sizeof(argp->type);
  1662. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1663. bp += sizeof(argp->txnid->txnid);
  1664. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1665. bp += sizeof(DB_LSN);
  1666. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1667. bp += sizeof(argp->fileid);
  1668. memcpy(&argp->pgno, bp, sizeof(argp->pgno));
  1669. bp += sizeof(argp->pgno);
  1670. memcpy(&argp->indx, bp, sizeof(argp->indx));
  1671. bp += sizeof(argp->indx);
  1672. memcpy(&argp->len, bp, sizeof(argp->len));
  1673. bp += sizeof(argp->len);
  1674. memcpy(&argp->dup_off, bp, sizeof(argp->dup_off));
  1675. bp += sizeof(argp->dup_off);
  1676. memcpy(&argp->add, bp, sizeof(argp->add));
  1677. bp += sizeof(argp->add);
  1678. memcpy(&argp->is_dup, bp, sizeof(argp->is_dup));
  1679. bp += sizeof(argp->is_dup);
  1680. memcpy(&argp->order, bp, sizeof(argp->order));
  1681. bp += sizeof(argp->order);
  1682. *argpp = argp;
  1683. return (0);
  1684. }
  1685. int
  1686. __ham_chgpg_log(dbenv, txnid, ret_lsnp, flags,
  1687. fileid, mode, old_pgno, new_pgno, old_indx, new_indx)
  1688. DB_ENV *dbenv;
  1689. DB_TXN *txnid;
  1690. DB_LSN *ret_lsnp;
  1691. u_int32_t flags;
  1692. int32_t fileid;
  1693. db_ham_mode mode;
  1694. db_pgno_t old_pgno;
  1695. db_pgno_t new_pgno;
  1696. u_int32_t old_indx;
  1697. u_int32_t new_indx;
  1698. {
  1699. DBT logrec;
  1700. DB_LSN *lsnp, null_lsn;
  1701. u_int32_t rectype, txn_num;
  1702. int ret;
  1703. u_int8_t *bp;
  1704. rectype = DB_ham_chgpg;
  1705. if (txnid != NULL &&
  1706.     TAILQ_FIRST(&txnid->kids) != NULL &&
  1707.     (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
  1708. return (ret);
  1709. txn_num = txnid == NULL ? 0 : txnid->txnid;
  1710. if (txnid == NULL) {
  1711. ZERO_LSN(null_lsn);
  1712. lsnp = &null_lsn;
  1713. } else
  1714. lsnp = &txnid->last_lsn;
  1715. logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
  1716.     + sizeof(fileid)
  1717.     + sizeof(mode)
  1718.     + sizeof(old_pgno)
  1719.     + sizeof(new_pgno)
  1720.     + sizeof(old_indx)
  1721.     + sizeof(new_indx);
  1722. if ((ret = __os_malloc(dbenv, logrec.size, NULL, &logrec.data)) != 0)
  1723. return (ret);
  1724. bp = logrec.data;
  1725. memcpy(bp, &rectype, sizeof(rectype));
  1726. bp += sizeof(rectype);
  1727. memcpy(bp, &txn_num, sizeof(txn_num));
  1728. bp += sizeof(txn_num);
  1729. memcpy(bp, lsnp, sizeof(DB_LSN));
  1730. bp += sizeof(DB_LSN);
  1731. memcpy(bp, &fileid, sizeof(fileid));
  1732. bp += sizeof(fileid);
  1733. memcpy(bp, &mode, sizeof(mode));
  1734. bp += sizeof(mode);
  1735. memcpy(bp, &old_pgno, sizeof(old_pgno));
  1736. bp += sizeof(old_pgno);
  1737. memcpy(bp, &new_pgno, sizeof(new_pgno));
  1738. bp += sizeof(new_pgno);
  1739. memcpy(bp, &old_indx, sizeof(old_indx));
  1740. bp += sizeof(old_indx);
  1741. memcpy(bp, &new_indx, sizeof(new_indx));
  1742. bp += sizeof(new_indx);
  1743. DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
  1744. ret = log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
  1745. if (txnid != NULL)
  1746. txnid->last_lsn = *ret_lsnp;
  1747. __os_free(logrec.data, logrec.size);
  1748. return (ret);
  1749. }
  1750. int
  1751. __ham_chgpg_print(dbenv, dbtp, lsnp, notused2, notused3)
  1752. DB_ENV *dbenv;
  1753. DBT *dbtp;
  1754. DB_LSN *lsnp;
  1755. db_recops notused2;
  1756. void *notused3;
  1757. {
  1758. __ham_chgpg_args *argp;
  1759. u_int32_t i;
  1760. u_int ch;
  1761. int ret;
  1762. i = 0;
  1763. ch = 0;
  1764. notused2 = DB_TXN_ABORT;
  1765. notused3 = NULL;
  1766. if ((ret = __ham_chgpg_read(dbenv, dbtp->data, &argp)) != 0)
  1767. return (ret);
  1768. printf("[%lu][%lu]ham_chgpg: rec: %lu txnid %lx prevlsn [%lu][%lu]n",
  1769.     (u_long)lsnp->file,
  1770.     (u_long)lsnp->offset,
  1771.     (u_long)argp->type,
  1772.     (u_long)argp->txnid->txnid,
  1773.     (u_long)argp->prev_lsn.file,
  1774.     (u_long)argp->prev_lsn.offset);
  1775. printf("tfileid: %ldn", (long)argp->fileid);
  1776. printf("tmode: %ldn", (long)argp->mode);
  1777. printf("told_pgno: %lun", (u_long)argp->old_pgno);
  1778. printf("tnew_pgno: %lun", (u_long)argp->new_pgno);
  1779. printf("told_indx: %lun", (u_long)argp->old_indx);
  1780. printf("tnew_indx: %lun", (u_long)argp->new_indx);
  1781. printf("n");
  1782. __os_free(argp, 0);
  1783. return (0);
  1784. }
  1785. int
  1786. __ham_chgpg_read(dbenv, recbuf, argpp)
  1787. DB_ENV *dbenv;
  1788. void *recbuf;
  1789. __ham_chgpg_args **argpp;
  1790. {
  1791. __ham_chgpg_args *argp;
  1792. u_int8_t *bp;
  1793. int ret;
  1794. ret = __os_malloc(dbenv, sizeof(__ham_chgpg_args) +
  1795.     sizeof(DB_TXN), NULL, &argp);
  1796. if (ret != 0)
  1797. return (ret);
  1798. argp->txnid = (DB_TXN *)&argp[1];
  1799. bp = recbuf;
  1800. memcpy(&argp->type, bp, sizeof(argp->type));
  1801. bp += sizeof(argp->type);
  1802. memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
  1803. bp += sizeof(argp->txnid->txnid);
  1804. memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
  1805. bp += sizeof(DB_LSN);
  1806. memcpy(&argp->fileid, bp, sizeof(argp->fileid));
  1807. bp += sizeof(argp->fileid);
  1808. memcpy(&argp->mode, bp, sizeof(argp->mode));
  1809. bp += sizeof(argp->mode);
  1810. memcpy(&argp->old_pgno, bp, sizeof(argp->old_pgno));
  1811. bp += sizeof(argp->old_pgno);
  1812. memcpy(&argp->new_pgno, bp, sizeof(argp->new_pgno));
  1813. bp += sizeof(argp->new_pgno);
  1814. memcpy(&argp->old_indx, bp, sizeof(argp->old_indx));
  1815. bp += sizeof(argp->old_indx);
  1816. memcpy(&argp->new_indx, bp, sizeof(argp->new_indx));
  1817. bp += sizeof(argp->new_indx);
  1818. *argpp = argp;
  1819. return (0);
  1820. }
  1821. int
  1822. __ham_init_print(dbenv)
  1823. DB_ENV *dbenv;
  1824. {
  1825. int ret;
  1826. if ((ret = __db_add_recovery(dbenv,
  1827.     __ham_insdel_print, DB_ham_insdel)) != 0)
  1828. return (ret);
  1829. if ((ret = __db_add_recovery(dbenv,
  1830.     __ham_newpage_print, DB_ham_newpage)) != 0)
  1831. return (ret);
  1832. if ((ret = __db_add_recovery(dbenv,
  1833.     __ham_splitmeta_print, DB_ham_splitmeta)) != 0)
  1834. return (ret);
  1835. if ((ret = __db_add_recovery(dbenv,
  1836.     __ham_splitdata_print, DB_ham_splitdata)) != 0)
  1837. return (ret);
  1838. if ((ret = __db_add_recovery(dbenv,
  1839.     __ham_replace_print, DB_ham_replace)) != 0)
  1840. return (ret);
  1841. if ((ret = __db_add_recovery(dbenv,
  1842.     __ham_newpgno_print, DB_ham_newpgno)) != 0)
  1843. return (ret);
  1844. if ((ret = __db_add_recovery(dbenv,
  1845.     __ham_ovfl_print, DB_ham_ovfl)) != 0)
  1846. return (ret);
  1847. if ((ret = __db_add_recovery(dbenv,
  1848.     __ham_copypage_print, DB_ham_copypage)) != 0)
  1849. return (ret);
  1850. if ((ret = __db_add_recovery(dbenv,
  1851.     __ham_metagroup_print, DB_ham_metagroup)) != 0)
  1852. return (ret);
  1853. if ((ret = __db_add_recovery(dbenv,
  1854.     __ham_groupalloc1_print, DB_ham_groupalloc1)) != 0)
  1855. return (ret);
  1856. if ((ret = __db_add_recovery(dbenv,
  1857.     __ham_groupalloc2_print, DB_ham_groupalloc2)) != 0)
  1858. return (ret);
  1859. if ((ret = __db_add_recovery(dbenv,
  1860.     __ham_groupalloc_print, DB_ham_groupalloc)) != 0)
  1861. return (ret);
  1862. if ((ret = __db_add_recovery(dbenv,
  1863.     __ham_curadj_print, DB_ham_curadj)) != 0)
  1864. return (ret);
  1865. if ((ret = __db_add_recovery(dbenv,
  1866.     __ham_chgpg_print, DB_ham_chgpg)) != 0)
  1867. return (ret);
  1868. return (0);
  1869. }
  1870. int
  1871. __ham_init_recover(dbenv)
  1872. DB_ENV *dbenv;
  1873. {
  1874. int ret;
  1875. if ((ret = __db_add_recovery(dbenv,
  1876.     __ham_insdel_recover, DB_ham_insdel)) != 0)
  1877. return (ret);
  1878. if ((ret = __db_add_recovery(dbenv,
  1879.     __ham_newpage_recover, DB_ham_newpage)) != 0)
  1880. return (ret);
  1881. if ((ret = __db_add_recovery(dbenv,
  1882.     __deprecated_recover, DB_ham_splitmeta)) != 0)
  1883. return (ret);
  1884. if ((ret = __db_add_recovery(dbenv,
  1885.     __ham_splitdata_recover, DB_ham_splitdata)) != 0)
  1886. return (ret);
  1887. if ((ret = __db_add_recovery(dbenv,
  1888.     __ham_replace_recover, DB_ham_replace)) != 0)
  1889. return (ret);
  1890. if ((ret = __db_add_recovery(dbenv,
  1891.     __deprecated_recover, DB_ham_newpgno)) != 0)
  1892. return (ret);
  1893. if ((ret = __db_add_recovery(dbenv,
  1894.     __deprecated_recover, DB_ham_ovfl)) != 0)
  1895. return (ret);
  1896. if ((ret = __db_add_recovery(dbenv,
  1897.     __ham_copypage_recover, DB_ham_copypage)) != 0)
  1898. return (ret);
  1899. if ((ret = __db_add_recovery(dbenv,
  1900.     __ham_metagroup_recover, DB_ham_metagroup)) != 0)
  1901. return (ret);
  1902. if ((ret = __db_add_recovery(dbenv,
  1903.     __deprecated_recover, DB_ham_groupalloc1)) != 0)
  1904. return (ret);
  1905. if ((ret = __db_add_recovery(dbenv,
  1906.     __deprecated_recover, DB_ham_groupalloc2)) != 0)
  1907. return (ret);
  1908. if ((ret = __db_add_recovery(dbenv,
  1909.     __ham_groupalloc_recover, DB_ham_groupalloc)) != 0)
  1910. return (ret);
  1911. if ((ret = __db_add_recovery(dbenv,
  1912.     __ham_curadj_recover, DB_ham_curadj)) != 0)
  1913. return (ret);
  1914. if ((ret = __db_add_recovery(dbenv,
  1915.     __ham_chgpg_recover, DB_ham_chgpg)) != 0)
  1916. return (ret);
  1917. return (0);
  1918. }