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

MySQL数据库

开发平台:

Visual C++

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