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