forked from argandas/ardubson
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathardubsonObjBuilder.cpp
130 lines (117 loc) · 2.9 KB
/
ardubsonObjBuilder.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
ardubson.h - Library for the BSON (Binary-JSON) format.
Created by Hugo Arganda (argandas), April 6, 2016.
Released into the public domain.
*/
#include "ardubsonObjBuilder.h"
#include "ardubsonTypes.h"
#include "ardubsonConfig.h"
// Constructor /////////////////////////////////////////////////////////////////
BSONObjBuilder::BSONObjBuilder(void)
{
reset();
}
BSONObjBuilder::BSONObjBuilder(char *data, int len)
{
int i = 0;
int size = 0;
reset();
size = *(uint32_t *) data;
if ((size == len) && (BSON_DOC_SIZE > len))
{
for (i = 0; i < len; i++)
{
appendNum(*data++);
}
_done = true;
}
}
// Public Methods //////////////////////////////////////////////////////////////
// Append BSON Element (char*)
BSONObjBuilder& BSONObjBuilder::append(BSONElement element)
{
appendBSONElement(element);
return *this;
}
// Append string (char*)
BSONObjBuilder& BSONObjBuilder::append(const char *key, char *value)
{
return append(key, value, strlen(value) + 1);
}
// Append string (char*) with a defined length
BSONObjBuilder& BSONObjBuilder::append(const char *key, char *value, int size)
{
uint8_t ret = appendNum((char) BSON_TYPE_STRING);
if (true == ret)
{
ret &= appendStr(key);
if (true == ret)
{
ret &= appendNum((int32_t) size);
if (true == ret)
{
ret &= appendStr(value);
}
}
}
return *this;
}
// Append boolean
BSONObjBuilder& BSONObjBuilder::append(const char *key, bool value)
{
uint8_t ret = appendNum((char) BSON_TYPE_BOOLEAN);
if (true == ret)
{
ret &= appendStr(key);
if (true == ret)
{
ret &= appendNum((char) (value ? 1 : 0));
}
}
return *this;
}
// Append int, the value will be saved as int32 type
BSONObjBuilder& BSONObjBuilder::append(const char *key, int16_t value)
{
return append(key, (int32_t) value);
}
// Append int32
BSONObjBuilder& BSONObjBuilder::append(const char *key, int32_t value)
{
uint8_t ret = appendNum((char) BSON_TYPE_INT32);
if (true == ret)
{
ret &= appendStr(key);
if (true == ret)
{
ret &= appendNum(value);
}
}
return *this;
}
// Append int64
BSONObjBuilder& BSONObjBuilder::append(const char *key, int64_t value)
{
uint8_t ret = appendNum((char) BSON_TYPE_INT64);
if (true == ret)
{
ret &= appendStr(key);
if (true == ret)
{
ret &= appendNum(value);
}
}
return *this;
}
// Generate BSON Object, this finishes the BSON Object builder,
// no more elements should be added after this.
BSONObject BSONObjBuilder::obj(void)
{
if (!_done)
{
appendNum((char) BSON_EOO); // EOO
*(uint32_t *) &_doc = _idx; // Add frame length
_done = true;
}
return BSONObject((char *) _doc);
}