1 /* Do not edit: automatically built by gen_rec.awk. */ 2 #include <sys/types.h> 3 #include <sys/queue.h> 4 #include <sys/stat.h> 5 #include <bitstring.h> 6 #include <errno.h> 7 #include <fcntl.h> 8 #include <limits.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include "common.h" 13 #include <db_int.h> 14 #include "db_page.h" 15 #include "db_am.h" 16 #include "rep.h" 17 #include "txn.h" 18 /* 19 * PUBLIC: #ifdef USE_DB4_LOGGING 20 */ 21 /* 22 * PUBLIC: int __vi_marker_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t, 23 * PUBLIC: u_int32_t)); 24 */ 25 int 26 __vi_marker_log(dbenv, txnid, ret_lsnp, flags, 27 opcode) 28 DB_ENV *dbenv; 29 DB_TXN *txnid; 30 DB_LSN *ret_lsnp; 31 u_int32_t flags; 32 u_int32_t opcode; 33 { 34 DBT logrec; 35 DB_LSN *lsnp, null_lsn; 36 u_int32_t uinttmp; 37 u_int32_t rectype, txn_num; 38 int ret; 39 u_int8_t *bp; 40 41 rectype = DB_vi_marker; 42 if (txnid != NULL && 43 TAILQ_FIRST(&txnid->kids) != NULL && 44 (ret = __txn_activekids(dbenv, rectype, txnid)) != 0) 45 return (ret); 46 txn_num = txnid == NULL ? 0 : txnid->txnid; 47 if (txnid == NULL) { 48 ZERO_LSN(null_lsn); 49 lsnp = &null_lsn; 50 } else 51 lsnp = &txnid->last_lsn; 52 logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN) 53 + sizeof(u_int32_t); 54 if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0) 55 return (ret); 56 57 bp = logrec.data; 58 59 memcpy(bp, &rectype, sizeof(rectype)); 60 bp += sizeof(rectype); 61 62 memcpy(bp, &txn_num, sizeof(txn_num)); 63 bp += sizeof(txn_num); 64 65 memcpy(bp, lsnp, sizeof(DB_LSN)); 66 bp += sizeof(DB_LSN); 67 68 uinttmp = (u_int32_t)opcode; 69 memcpy(bp, &uinttmp, sizeof(uinttmp)); 70 bp += sizeof(uinttmp); 71 72 DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size); 73 ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags); 74 if (txnid != NULL && ret == 0) 75 txnid->last_lsn = *ret_lsnp; 76 #ifdef LOG_DIAGNOSTIC 77 if (ret != 0) 78 (void)__vi_marker_print(dbenv, 79 (DBT *)&logrec, ret_lsnp, NULL, NULL); 80 #endif 81 __os_free(dbenv, logrec.data, logrec.size); 82 return (ret); 83 } 84 85 /* 86 * PUBLIC: int __vi_marker_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 87 * PUBLIC: void *)); 88 */ 89 int 90 __vi_marker_getpgnos(dbenv, rec, lsnp, notused1, summary) 91 DB_ENV *dbenv; 92 DBT *rec; 93 DB_LSN *lsnp; 94 db_recops notused1; 95 void *summary; 96 { 97 TXN_RECS *t; 98 int ret; 99 COMPQUIET(rec, NULL); 100 COMPQUIET(notused1, DB_TXN_ABORT); 101 102 t = (TXN_RECS *)summary; 103 104 if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0) 105 return (ret); 106 107 t->array[t->npages].flags = LSN_PAGE_NOLOCK; 108 t->array[t->npages].lsn = *lsnp; 109 t->array[t->npages].fid = DB_LOGFILEID_INVALID; 110 memset(&t->array[t->npages].pgdesc, 0, 111 sizeof(t->array[t->npages].pgdesc)); 112 113 t->npages++; 114 115 return (0); 116 } 117 118 /* 119 * PUBLIC: int __vi_marker_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 120 * PUBLIC: void *)); 121 */ 122 int 123 __vi_marker_print(dbenv, dbtp, lsnp, notused2, notused3) 124 DB_ENV *dbenv; 125 DBT *dbtp; 126 DB_LSN *lsnp; 127 db_recops notused2; 128 void *notused3; 129 { 130 __vi_marker_args *argp; 131 int ret; 132 133 notused2 = DB_TXN_ABORT; 134 notused3 = NULL; 135 136 if ((ret = __vi_marker_read(dbenv, dbtp->data, &argp)) != 0) 137 return (ret); 138 (void)printf( 139 "[%lu][%lu]vi_marker: rec: %lu txnid %lx prevlsn [%lu][%lu]\n", 140 (u_long)lsnp->file, 141 (u_long)lsnp->offset, 142 (u_long)argp->type, 143 (u_long)argp->txnid->txnid, 144 (u_long)argp->prev_lsn.file, 145 (u_long)argp->prev_lsn.offset); 146 (void)printf("\topcode: %lu\n", (u_long)argp->opcode); 147 (void)printf("\n"); 148 __os_free(dbenv, argp, 0); 149 return (0); 150 } 151 152 /* 153 * PUBLIC: int __vi_marker_read __P((DB_ENV *, void *, __vi_marker_args **)); 154 */ 155 int 156 __vi_marker_read(dbenv, recbuf, argpp) 157 DB_ENV *dbenv; 158 void *recbuf; 159 __vi_marker_args **argpp; 160 { 161 __vi_marker_args *argp; 162 int ret; 163 u_int32_t uinttmp; 164 u_int8_t *bp; 165 166 ret = __os_malloc(dbenv, sizeof(__vi_marker_args) + 167 sizeof(DB_TXN), &argp); 168 if (ret != 0) 169 return (ret); 170 argp->txnid = (DB_TXN *)&argp[1]; 171 172 bp = recbuf; 173 memcpy(&argp->type, bp, sizeof(argp->type)); 174 bp += sizeof(argp->type); 175 176 memcpy(&argp->txnid->txnid, bp, sizeof(argp->txnid->txnid)); 177 bp += sizeof(argp->txnid->txnid); 178 179 memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN)); 180 bp += sizeof(DB_LSN); 181 182 memcpy(&uinttmp, bp, sizeof(uinttmp)); 183 argp->opcode = (u_int32_t)uinttmp; 184 bp += sizeof(uinttmp); 185 186 *argpp = argp; 187 return (0); 188 } 189 190 /* 191 * PUBLIC: int __vi_cursor_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t, 192 * PUBLIC: u_int32_t, db_recno_t, size_t)); 193 */ 194 int 195 __vi_cursor_log(dbenv, txnid, ret_lsnp, flags, 196 opcode, lno, cno) 197 DB_ENV *dbenv; 198 DB_TXN *txnid; 199 DB_LSN *ret_lsnp; 200 u_int32_t flags; 201 u_int32_t opcode; 202 db_recno_t lno; 203 size_t cno; 204 { 205 DBT logrec; 206 DB_LSN *lsnp, null_lsn; 207 u_int32_t uinttmp; 208 u_int32_t rectype, txn_num; 209 int ret; 210 u_int8_t *bp; 211 212 rectype = DB_vi_cursor; 213 if (txnid != NULL && 214 TAILQ_FIRST(&txnid->kids) != NULL && 215 (ret = __txn_activekids(dbenv, rectype, txnid)) != 0) 216 return (ret); 217 txn_num = txnid == NULL ? 0 : txnid->txnid; 218 if (txnid == NULL) { 219 ZERO_LSN(null_lsn); 220 lsnp = &null_lsn; 221 } else 222 lsnp = &txnid->last_lsn; 223 logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN) 224 + sizeof(u_int32_t) 225 + sizeof(u_int32_t) 226 + sizeof(u_int32_t); 227 if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0) 228 return (ret); 229 230 bp = logrec.data; 231 232 memcpy(bp, &rectype, sizeof(rectype)); 233 bp += sizeof(rectype); 234 235 memcpy(bp, &txn_num, sizeof(txn_num)); 236 bp += sizeof(txn_num); 237 238 memcpy(bp, lsnp, sizeof(DB_LSN)); 239 bp += sizeof(DB_LSN); 240 241 uinttmp = (u_int32_t)opcode; 242 memcpy(bp, &uinttmp, sizeof(uinttmp)); 243 bp += sizeof(uinttmp); 244 245 uinttmp = (u_int32_t)lno; 246 memcpy(bp, &uinttmp, sizeof(uinttmp)); 247 bp += sizeof(uinttmp); 248 249 uinttmp = (u_int32_t)cno; 250 memcpy(bp, &uinttmp, sizeof(uinttmp)); 251 bp += sizeof(uinttmp); 252 253 DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size); 254 ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags); 255 if (txnid != NULL && ret == 0) 256 txnid->last_lsn = *ret_lsnp; 257 #ifdef LOG_DIAGNOSTIC 258 if (ret != 0) 259 (void)__vi_cursor_print(dbenv, 260 (DBT *)&logrec, ret_lsnp, NULL, NULL); 261 #endif 262 __os_free(dbenv, logrec.data, logrec.size); 263 return (ret); 264 } 265 266 /* 267 * PUBLIC: int __vi_cursor_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 268 * PUBLIC: void *)); 269 */ 270 int 271 __vi_cursor_getpgnos(dbenv, rec, lsnp, notused1, summary) 272 DB_ENV *dbenv; 273 DBT *rec; 274 DB_LSN *lsnp; 275 db_recops notused1; 276 void *summary; 277 { 278 TXN_RECS *t; 279 int ret; 280 COMPQUIET(rec, NULL); 281 COMPQUIET(notused1, DB_TXN_ABORT); 282 283 t = (TXN_RECS *)summary; 284 285 if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0) 286 return (ret); 287 288 t->array[t->npages].flags = LSN_PAGE_NOLOCK; 289 t->array[t->npages].lsn = *lsnp; 290 t->array[t->npages].fid = DB_LOGFILEID_INVALID; 291 memset(&t->array[t->npages].pgdesc, 0, 292 sizeof(t->array[t->npages].pgdesc)); 293 294 t->npages++; 295 296 return (0); 297 } 298 299 /* 300 * PUBLIC: int __vi_cursor_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 301 * PUBLIC: void *)); 302 */ 303 int 304 __vi_cursor_print(dbenv, dbtp, lsnp, notused2, notused3) 305 DB_ENV *dbenv; 306 DBT *dbtp; 307 DB_LSN *lsnp; 308 db_recops notused2; 309 void *notused3; 310 { 311 __vi_cursor_args *argp; 312 int ret; 313 314 notused2 = DB_TXN_ABORT; 315 notused3 = NULL; 316 317 if ((ret = __vi_cursor_read(dbenv, dbtp->data, &argp)) != 0) 318 return (ret); 319 (void)printf( 320 "[%lu][%lu]vi_cursor: rec: %lu txnid %lx prevlsn [%lu][%lu]\n", 321 (u_long)lsnp->file, 322 (u_long)lsnp->offset, 323 (u_long)argp->type, 324 (u_long)argp->txnid->txnid, 325 (u_long)argp->prev_lsn.file, 326 (u_long)argp->prev_lsn.offset); 327 (void)printf("\topcode: %lu\n", (u_long)argp->opcode); 328 (void)printf("\tlno: %lu\n", (u_long)argp->lno); 329 (void)printf("\tcno: %d\n", argp->cno); 330 (void)printf("\n"); 331 __os_free(dbenv, argp, 0); 332 return (0); 333 } 334 335 /* 336 * PUBLIC: int __vi_cursor_read __P((DB_ENV *, void *, __vi_cursor_args **)); 337 */ 338 int 339 __vi_cursor_read(dbenv, recbuf, argpp) 340 DB_ENV *dbenv; 341 void *recbuf; 342 __vi_cursor_args **argpp; 343 { 344 __vi_cursor_args *argp; 345 int ret; 346 u_int32_t uinttmp; 347 u_int8_t *bp; 348 349 ret = __os_malloc(dbenv, sizeof(__vi_cursor_args) + 350 sizeof(DB_TXN), &argp); 351 if (ret != 0) 352 return (ret); 353 argp->txnid = (DB_TXN *)&argp[1]; 354 355 bp = recbuf; 356 memcpy(&argp->type, bp, sizeof(argp->type)); 357 bp += sizeof(argp->type); 358 359 memcpy(&argp->txnid->txnid, bp, sizeof(argp->txnid->txnid)); 360 bp += sizeof(argp->txnid->txnid); 361 362 memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN)); 363 bp += sizeof(DB_LSN); 364 365 memcpy(&uinttmp, bp, sizeof(uinttmp)); 366 argp->opcode = (u_int32_t)uinttmp; 367 bp += sizeof(uinttmp); 368 369 memcpy(&uinttmp, bp, sizeof(uinttmp)); 370 argp->lno = (db_recno_t)uinttmp; 371 bp += sizeof(uinttmp); 372 373 memcpy(&uinttmp, bp, sizeof(uinttmp)); 374 argp->cno = (size_t)uinttmp; 375 bp += sizeof(uinttmp); 376 377 *argpp = argp; 378 return (0); 379 } 380 381 /* 382 * PUBLIC: int __vi_mark_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t, 383 * PUBLIC: LMARK *)); 384 */ 385 int 386 __vi_mark_log(dbenv, txnid, ret_lsnp, flags, 387 lmp) 388 DB_ENV *dbenv; 389 DB_TXN *txnid; 390 DB_LSN *ret_lsnp; 391 u_int32_t flags; 392 LMARK * lmp; 393 { 394 DBT logrec; 395 DB_LSN *lsnp, null_lsn; 396 u_int32_t rectype, txn_num; 397 int ret; 398 u_int8_t *bp; 399 400 rectype = DB_vi_mark; 401 if (txnid != NULL && 402 TAILQ_FIRST(&txnid->kids) != NULL && 403 (ret = __txn_activekids(dbenv, rectype, txnid)) != 0) 404 return (ret); 405 txn_num = txnid == NULL ? 0 : txnid->txnid; 406 if (txnid == NULL) { 407 ZERO_LSN(null_lsn); 408 lsnp = &null_lsn; 409 } else 410 lsnp = &txnid->last_lsn; 411 logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN) 412 + sizeof(*lmp); 413 if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0) 414 return (ret); 415 416 bp = logrec.data; 417 418 memcpy(bp, &rectype, sizeof(rectype)); 419 bp += sizeof(rectype); 420 421 memcpy(bp, &txn_num, sizeof(txn_num)); 422 bp += sizeof(txn_num); 423 424 memcpy(bp, lsnp, sizeof(DB_LSN)); 425 bp += sizeof(DB_LSN); 426 427 if (lmp != NULL) 428 memcpy(bp, lmp, sizeof(*lmp)); 429 else 430 memset(bp, 0, sizeof(*lmp)); 431 bp += sizeof(*lmp); 432 433 DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size); 434 ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags); 435 if (txnid != NULL && ret == 0) 436 txnid->last_lsn = *ret_lsnp; 437 #ifdef LOG_DIAGNOSTIC 438 if (ret != 0) 439 (void)__vi_mark_print(dbenv, 440 (DBT *)&logrec, ret_lsnp, NULL, NULL); 441 #endif 442 __os_free(dbenv, logrec.data, logrec.size); 443 return (ret); 444 } 445 446 /* 447 * PUBLIC: int __vi_mark_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 448 * PUBLIC: void *)); 449 */ 450 int 451 __vi_mark_getpgnos(dbenv, rec, lsnp, notused1, summary) 452 DB_ENV *dbenv; 453 DBT *rec; 454 DB_LSN *lsnp; 455 db_recops notused1; 456 void *summary; 457 { 458 TXN_RECS *t; 459 int ret; 460 COMPQUIET(rec, NULL); 461 COMPQUIET(notused1, DB_TXN_ABORT); 462 463 t = (TXN_RECS *)summary; 464 465 if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0) 466 return (ret); 467 468 t->array[t->npages].flags = LSN_PAGE_NOLOCK; 469 t->array[t->npages].lsn = *lsnp; 470 t->array[t->npages].fid = DB_LOGFILEID_INVALID; 471 memset(&t->array[t->npages].pgdesc, 0, 472 sizeof(t->array[t->npages].pgdesc)); 473 474 t->npages++; 475 476 return (0); 477 } 478 479 /* 480 * PUBLIC: int __vi_mark_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 481 * PUBLIC: void *)); 482 */ 483 int 484 __vi_mark_print(dbenv, dbtp, lsnp, notused2, notused3) 485 DB_ENV *dbenv; 486 DBT *dbtp; 487 DB_LSN *lsnp; 488 db_recops notused2; 489 void *notused3; 490 { 491 __vi_mark_args *argp; 492 int ret; 493 494 notused2 = DB_TXN_ABORT; 495 notused3 = NULL; 496 497 if ((ret = __vi_mark_read(dbenv, dbtp->data, &argp)) != 0) 498 return (ret); 499 (void)printf( 500 "[%lu][%lu]vi_mark: rec: %lu txnid %lx prevlsn [%lu][%lu]\n", 501 (u_long)lsnp->file, 502 (u_long)lsnp->offset, 503 (u_long)argp->type, 504 (u_long)argp->txnid->txnid, 505 (u_long)argp->prev_lsn.file, 506 (u_long)argp->prev_lsn.offset); 507 (void)printf("\tlmp: %%\n", argp->lmp); 508 (void)printf("\n"); 509 __os_free(dbenv, argp, 0); 510 return (0); 511 } 512 513 /* 514 * PUBLIC: int __vi_mark_read __P((DB_ENV *, void *, __vi_mark_args **)); 515 */ 516 int 517 __vi_mark_read(dbenv, recbuf, argpp) 518 DB_ENV *dbenv; 519 void *recbuf; 520 __vi_mark_args **argpp; 521 { 522 __vi_mark_args *argp; 523 int ret; 524 u_int8_t *bp; 525 526 ret = __os_malloc(dbenv, sizeof(__vi_mark_args) + 527 sizeof(DB_TXN), &argp); 528 if (ret != 0) 529 return (ret); 530 argp->txnid = (DB_TXN *)&argp[1]; 531 532 bp = recbuf; 533 memcpy(&argp->type, bp, sizeof(argp->type)); 534 bp += sizeof(argp->type); 535 536 memcpy(&argp->txnid->txnid, bp, sizeof(argp->txnid->txnid)); 537 bp += sizeof(argp->txnid->txnid); 538 539 memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN)); 540 bp += sizeof(DB_LSN); 541 542 memcpy(&argp->lmp, bp, sizeof(argp->lmp)); 543 bp += sizeof(argp->lmp); 544 545 *argpp = argp; 546 return (0); 547 } 548 549 /* 550 * PUBLIC: int __vi_change_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t, 551 * PUBLIC: u_int32_t, db_recno_t)); 552 */ 553 int 554 __vi_change_log(dbenv, txnid, ret_lsnp, flags, 555 opcode, lno) 556 DB_ENV *dbenv; 557 DB_TXN *txnid; 558 DB_LSN *ret_lsnp; 559 u_int32_t flags; 560 u_int32_t opcode; 561 db_recno_t lno; 562 { 563 DBT logrec; 564 DB_LSN *lsnp, null_lsn; 565 u_int32_t uinttmp; 566 u_int32_t rectype, txn_num; 567 int ret; 568 u_int8_t *bp; 569 570 rectype = DB_vi_change; 571 if (txnid != NULL && 572 TAILQ_FIRST(&txnid->kids) != NULL && 573 (ret = __txn_activekids(dbenv, rectype, txnid)) != 0) 574 return (ret); 575 txn_num = txnid == NULL ? 0 : txnid->txnid; 576 if (txnid == NULL) { 577 ZERO_LSN(null_lsn); 578 lsnp = &null_lsn; 579 } else 580 lsnp = &txnid->last_lsn; 581 logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN) 582 + sizeof(u_int32_t) 583 + sizeof(u_int32_t); 584 if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0) 585 return (ret); 586 587 bp = logrec.data; 588 589 memcpy(bp, &rectype, sizeof(rectype)); 590 bp += sizeof(rectype); 591 592 memcpy(bp, &txn_num, sizeof(txn_num)); 593 bp += sizeof(txn_num); 594 595 memcpy(bp, lsnp, sizeof(DB_LSN)); 596 bp += sizeof(DB_LSN); 597 598 uinttmp = (u_int32_t)opcode; 599 memcpy(bp, &uinttmp, sizeof(uinttmp)); 600 bp += sizeof(uinttmp); 601 602 uinttmp = (u_int32_t)lno; 603 memcpy(bp, &uinttmp, sizeof(uinttmp)); 604 bp += sizeof(uinttmp); 605 606 DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size); 607 ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags); 608 if (txnid != NULL && ret == 0) 609 txnid->last_lsn = *ret_lsnp; 610 #ifdef LOG_DIAGNOSTIC 611 if (ret != 0) 612 (void)__vi_change_print(dbenv, 613 (DBT *)&logrec, ret_lsnp, NULL, NULL); 614 #endif 615 __os_free(dbenv, logrec.data, logrec.size); 616 return (ret); 617 } 618 619 /* 620 * PUBLIC: int __vi_change_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 621 * PUBLIC: void *)); 622 */ 623 int 624 __vi_change_getpgnos(dbenv, rec, lsnp, notused1, summary) 625 DB_ENV *dbenv; 626 DBT *rec; 627 DB_LSN *lsnp; 628 db_recops notused1; 629 void *summary; 630 { 631 TXN_RECS *t; 632 int ret; 633 COMPQUIET(rec, NULL); 634 COMPQUIET(notused1, DB_TXN_ABORT); 635 636 t = (TXN_RECS *)summary; 637 638 if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0) 639 return (ret); 640 641 t->array[t->npages].flags = LSN_PAGE_NOLOCK; 642 t->array[t->npages].lsn = *lsnp; 643 t->array[t->npages].fid = DB_LOGFILEID_INVALID; 644 memset(&t->array[t->npages].pgdesc, 0, 645 sizeof(t->array[t->npages].pgdesc)); 646 647 t->npages++; 648 649 return (0); 650 } 651 652 /* 653 * PUBLIC: int __vi_change_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops, 654 * PUBLIC: void *)); 655 */ 656 int 657 __vi_change_print(dbenv, dbtp, lsnp, notused2, notused3) 658 DB_ENV *dbenv; 659 DBT *dbtp; 660 DB_LSN *lsnp; 661 db_recops notused2; 662 void *notused3; 663 { 664 __vi_change_args *argp; 665 int ret; 666 667 notused2 = DB_TXN_ABORT; 668 notused3 = NULL; 669 670 if ((ret = __vi_change_read(dbenv, dbtp->data, &argp)) != 0) 671 return (ret); 672 (void)printf( 673 "[%lu][%lu]vi_change: rec: %lu txnid %lx prevlsn [%lu][%lu]\n", 674 (u_long)lsnp->file, 675 (u_long)lsnp->offset, 676 (u_long)argp->type, 677 (u_long)argp->txnid->txnid, 678 (u_long)argp->prev_lsn.file, 679 (u_long)argp->prev_lsn.offset); 680 (void)printf("\topcode: %lu\n", (u_long)argp->opcode); 681 (void)printf("\tlno: %lu\n", (u_long)argp->lno); 682 (void)printf("\n"); 683 __os_free(dbenv, argp, 0); 684 return (0); 685 } 686 687 /* 688 * PUBLIC: int __vi_change_read __P((DB_ENV *, void *, __vi_change_args **)); 689 */ 690 int 691 __vi_change_read(dbenv, recbuf, argpp) 692 DB_ENV *dbenv; 693 void *recbuf; 694 __vi_change_args **argpp; 695 { 696 __vi_change_args *argp; 697 int ret; 698 u_int32_t uinttmp; 699 u_int8_t *bp; 700 701 ret = __os_malloc(dbenv, sizeof(__vi_change_args) + 702 sizeof(DB_TXN), &argp); 703 if (ret != 0) 704 return (ret); 705 argp->txnid = (DB_TXN *)&argp[1]; 706 707 bp = recbuf; 708 memcpy(&argp->type, bp, sizeof(argp->type)); 709 bp += sizeof(argp->type); 710 711 memcpy(&argp->txnid->txnid, bp, sizeof(argp->txnid->txnid)); 712 bp += sizeof(argp->txnid->txnid); 713 714 memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN)); 715 bp += sizeof(DB_LSN); 716 717 memcpy(&uinttmp, bp, sizeof(uinttmp)); 718 argp->opcode = (u_int32_t)uinttmp; 719 bp += sizeof(uinttmp); 720 721 memcpy(&uinttmp, bp, sizeof(uinttmp)); 722 argp->lno = (db_recno_t)uinttmp; 723 bp += sizeof(uinttmp); 724 725 *argpp = argp; 726 return (0); 727 } 728 729 /* 730 * PUBLIC: int __vi_init_print __P((DB_ENV *, int (***)(DB_ENV *, DBT *, 731 * PUBLIC: DB_LSN *, db_recops, void *), size_t *)); 732 */ 733 int 734 __vi_init_print(dbenv, dtabp, dtabsizep) 735 DB_ENV *dbenv; 736 int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); 737 size_t *dtabsizep; 738 { 739 int ret; 740 741 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 742 __vi_marker_print, DB_vi_marker)) != 0) 743 return (ret); 744 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 745 __vi_cursor_print, DB_vi_cursor)) != 0) 746 return (ret); 747 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 748 __vi_mark_print, DB_vi_mark)) != 0) 749 return (ret); 750 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 751 __vi_change_print, DB_vi_change)) != 0) 752 return (ret); 753 return (0); 754 } 755 756 /* 757 * PUBLIC: int __vi_init_getpgnos __P((DB_ENV *, int (***)(DB_ENV *, DBT *, 758 * PUBLIC: DB_LSN *, db_recops, void *), size_t *)); 759 */ 760 int 761 __vi_init_getpgnos(dbenv, dtabp, dtabsizep) 762 DB_ENV *dbenv; 763 int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *)); 764 size_t *dtabsizep; 765 { 766 int ret; 767 768 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 769 __vi_marker_getpgnos, DB_vi_marker)) != 0) 770 return (ret); 771 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 772 __vi_cursor_getpgnos, DB_vi_cursor)) != 0) 773 return (ret); 774 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 775 __vi_mark_getpgnos, DB_vi_mark)) != 0) 776 return (ret); 777 if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep, 778 __vi_change_getpgnos, DB_vi_change)) != 0) 779 return (ret); 780 return (0); 781 } 782 783 /* 784 * PUBLIC: int __vi_init_recover __P((DB_ENV *)); 785 */ 786 int 787 __vi_init_recover(dbenv) 788 DB_ENV *dbenv; 789 { 790 int ret; 791 792 if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size, 793 __vi_marker_recover, DB_vi_marker)) != 0) 794 return (ret); 795 if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size, 796 __vi_cursor_recover, DB_vi_cursor)) != 0) 797 return (ret); 798 if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size, 799 __vi_mark_recover, DB_vi_mark)) != 0) 800 return (ret); 801 if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size, 802 __vi_change_recover, DB_vi_change)) != 0) 803 return (ret); 804 return (0); 805 } 806 /* 807 * PUBLIC: #endif 808 */ 809