1/*- 2 * See the file LICENSE for redistribution information. 3 * 4 * Copyright (c) 1997-2009 Oracle. All rights reserved. 5 * 6 * $Id$ 7 */ 8 9#include "db_config.h" 10 11#include "db_int.h" 12 13#include "db_cxx.h" 14 15DbMultipleIterator::DbMultipleIterator(const Dbt &dbt) 16 : data_((u_int8_t*)dbt.get_data()), 17 p_((u_int32_t*)(data_ + dbt.get_ulen() - sizeof(u_int32_t))) 18{ 19} 20 21bool DbMultipleDataIterator::next(Dbt &data) 22{ 23 if (*p_ == (u_int32_t)-1) { 24 data.set_data(0); 25 data.set_size(0); 26 p_ = 0; 27 } else { 28 data.set_data(data_ + *p_--); 29 data.set_size(*p_--); 30 if (data.get_size() == 0 && data.get_data() == data_) 31 data.set_data(0); 32 } 33 return (p_ != 0); 34} 35 36bool DbMultipleKeyDataIterator::next(Dbt &key, Dbt &data) 37{ 38 if (*p_ == (u_int32_t)-1) { 39 key.set_data(0); 40 key.set_size(0); 41 data.set_data(0); 42 data.set_size(0); 43 p_ = 0; 44 } else { 45 key.set_data(data_ + *p_--); 46 key.set_size(*p_--); 47 data.set_data(data_ + *p_--); 48 data.set_size(*p_--); 49 } 50 return (p_ != 0); 51} 52 53bool DbMultipleRecnoDataIterator::next(db_recno_t &recno, Dbt &data) 54{ 55 if (*p_ == (u_int32_t)0) { 56 recno = 0; 57 data.set_data(0); 58 data.set_size(0); 59 p_ = 0; 60 } else { 61 recno = *p_--; 62 data.set_data(data_ + *p_--); 63 data.set_size(*p_--); 64 } 65 return (p_ != 0); 66} 67 68 69DbMultipleBuilder::DbMultipleBuilder(Dbt &dbt) : dbt_(dbt) 70{ 71 DB_MULTIPLE_WRITE_INIT(p_, dbt_.get_DBT()); 72} 73 74 75bool DbMultipleDataBuilder::append(void *dbuf, size_t dlen) 76{ 77 DB_MULTIPLE_WRITE_NEXT(p_, dbt_.get_DBT(), dbuf, dlen); 78 return (p_ != 0); 79} 80 81bool DbMultipleDataBuilder::reserve(void *&ddest, size_t dlen) 82{ 83 DB_MULTIPLE_RESERVE_NEXT(p_, dbt_.get_DBT(), ddest, dlen); 84 return (ddest != 0); 85} 86 87bool DbMultipleKeyDataBuilder::append( 88 void *kbuf, size_t klen, void *dbuf, size_t dlen) 89{ 90 DB_MULTIPLE_KEY_WRITE_NEXT(p_, dbt_.get_DBT(), 91 kbuf, klen, dbuf, dlen); 92 return (p_ != 0); 93} 94 95bool DbMultipleKeyDataBuilder::reserve( 96 void *&kdest, size_t klen, void *&ddest, size_t dlen) 97{ 98 DB_MULTIPLE_KEY_RESERVE_NEXT(p_, dbt_.get_DBT(), 99 kdest, klen, ddest, dlen); 100 return (kdest != 0 && ddest != 0); 101} 102 103 104DbMultipleRecnoDataBuilder::DbMultipleRecnoDataBuilder(Dbt &dbt) : dbt_(dbt) 105{ 106 DB_MULTIPLE_RECNO_WRITE_INIT(p_, dbt_.get_DBT()); 107} 108 109bool DbMultipleRecnoDataBuilder::append( 110 db_recno_t recno, void *dbuf, size_t dlen) 111{ 112 DB_MULTIPLE_RECNO_WRITE_NEXT(p_, dbt_.get_DBT(), 113 recno, dbuf, dlen); 114 return (p_ != 0); 115} 116 117bool DbMultipleRecnoDataBuilder::reserve( 118 db_recno_t recno, void *&ddest, size_t dlen) 119{ 120 DB_MULTIPLE_RECNO_RESERVE_NEXT(p_, dbt_.get_DBT(), 121 recno, ddest, dlen); 122 return (ddest != 0); 123} 124