1 #include <drift/dslcore.h>
2 #include <drift/GenLib.h>
3 #include <drift/serialize.h>
6 bool DSL_Serializable::_serialize_int(
DSL_BUFFER * buf,
void * val, uint8_t size,
bool deserialize) {
7 assert(size == 1 || size == 2 || size == 4 || size == 8);
8 return deserialize ? dsl_deserialize_int(buf, val, size) : dsl_serialize_int(buf, val, size);
10 bool DSL_Serializable::serialize_var(
DSL_BUFFER * buf,
string * val,
bool deserialize) {
11 return deserialize ? dsl_deserialize_string(buf, val) : dsl_serialize_string(buf, val);
13 bool DSL_Serializable::serialize_var(
DSL_BUFFER * buf,
char * data,
size_t bufSize,
bool deserialize) {
14 return deserialize ? dsl_deserialize_varchar(buf, (uint8_t *)data, bufSize) : dsl_serialize_varchar(buf, (const uint8_t *)data, strlen(data));
16 bool DSL_Serializable::serialize_var(
DSL_BUFFER * buf, uint8_t * data,
size_t lSize,
bool deserialize) {
17 return deserialize ? dsl_deserialize_fixed(buf, data, lSize) : dsl_serialize_fixed(buf, data, lSize);
20 size_t _max_size_of_varint(uint8_t size) {
21 assert(size == 1 || size == 2 || size == 4 || size == 8);
22 unsigned int x = (size * 8) / 7;
23 if ((size * 8) % 7 != 0) {
29 bool DSL_Serializable::GetSerialized(
DSL_BUFFER * buf) {
30 return Serialize(buf,
false);
33 bool DSL_Serializable::FromSerialized(
DSL_BUFFER * buf) {
34 return Serialize(buf,
true);
37 string DSL_Serializable::GetSerialized() {
41 if (GetSerialized(&buf)) {
42 ret.assign(buf.data, buf.len);
47 bool DSL_Serializable::FromSerialized(
const string& str) {
51 bool ret = FromSerialized(&buf);
58 bool DSL_Serializable::GetCompressed(
DSL_BUFFER * buf,
int compression_level) {
60 if (Serialize(buf,
false)) {
63 uLongf dlen = compressBound(buf->len);
64 if ((
sizeof(uLongf) == 4 || dlen <= UINT32_MAX)) {
66 if (compress2(buf2.udata, &dlen, buf->udata, buf->len, compression_level) == Z_OK) {
67 uint32_t serlen = buf->len;
69 if (dsl_serialize_int(buf, &serlen,
sizeof(serlen))) {
81 bool DSL_Serializable::FromCompressed(
DSL_BUFFER * buf) {
86 if (dsl_deserialize_int(buf, &serlen,
sizeof(serlen))) {
90 if ((n = uncompress(buf2.udata, &dlen, buf->udata, buf->len)) == Z_OK && dlen == serlen) {
93 if (Serialize(buf,
true)) {
103 string DSL_Serializable::GetCompressed(
int compression_level) {
107 if (GetCompressed(&buf, compression_level)) {
108 ret.assign(buf.data, buf.len);
113 bool DSL_Serializable::FromCompressed(
const string& str) {
117 bool ret = FromCompressed(&buf);
124 bool DSL_Serializable_DSD::serializeEntries(
DSL_BUFFER * buf) {
126 for (
auto& x : dsd_entries) {
127 buffer_append_int<uint8>(buf, x.first);
128 #if SIZE_MAX > UINT32_MAX
129 if (x.second.length() > UINT32_MAX) {
return false; }
131 len = x.second.length();
132 if (!serialize_var(buf, &len,
false)) {
return false; }
133 if (!
buffer_append(buf, x.second.c_str(), x.second.length())) {
return false; }
147 bool DSL_CC dsl_serialize_int(
DSL_BUFFER * buf,
const void * pVal,
size_t lSize) {
148 assert(lSize == 1 || lSize == 2 || lSize == 4 || lSize == 8);
170 while (tmp || first) {
178 buffer_append_int<uint8_t>(buf, data);
183 bool DSL_CC dsl_deserialize_int(
DSL_BUFFER * buf,
void * pVal,
size_t lSize) {
184 assert(lSize == 1 || lSize == 2 || lSize == 4 || lSize == 8);
186 uint8_t * data = buf->udata;
187 size_t maxlen = _max_size_of_varint(lSize);
189 if (buf->len < ++used) {
196 if (!(*data & 0x80)) {
202 while (data >= buf->udata) {
204 tmp |= (*data & 0x7F);
212 if (tmp > UINT8_MAX) {
218 if (tmp > UINT16_MAX) {
224 if (tmp > UINT32_MAX) {
240 bool DSL_CC dsl_serialize_string(
DSL_BUFFER * buf,
const string * val) {
241 return dsl_serialize_varchar(buf, (
const uint8_t *)val->data(), val->length());
243 bool DSL_CC dsl_deserialize_string(
DSL_BUFFER * buf,
string * val) {
245 if (!dsl_deserialize_int(buf, &lSize,
sizeof(lSize))) {
248 if (buf->len < lSize) {
252 val->assign(buf->data, lSize);
260 bool DSL_CC dsl_serialize_varchar(
DSL_BUFFER * buf,
const uint8_t * val, uint32_t lSize) {
261 if (!dsl_serialize_int(buf, &lSize,
sizeof(lSize))) {
266 bool DSL_CC dsl_deserialize_varchar(
DSL_BUFFER * buf, uint8_t * val, uint32_t lSize) {
268 if (!dsl_deserialize_int(buf, &len,
sizeof(len))) {
271 if (len > lSize || buf->len < len) {
275 memcpy(val, buf->udata, len);
281 bool DSL_CC dsl_serialize_fixed(
DSL_BUFFER * buf,
const uint8_t * val, uint32_t lSize) {
284 bool DSL_CC dsl_deserialize_fixed(
DSL_BUFFER * buf, uint8_t * val, uint32_t lSize) {
285 if (buf->len < lSize) {
289 memcpy(val, buf->udata, lSize);
DSL_API void DSL_CC buffer_remove_front(DSL_BUFFER *buf, int64 len)
Remove data from the beginning of the buffer.
DSL_API void DSL_CC buffer_init(DSL_BUFFER *buf, bool useMutex=false)
Initialize the buffer, optionally with a mutex protecting it. If you don't use the mutex you need to ...
DSL_API void DSL_CC buffer_set(DSL_BUFFER *buf, const char *ptr, int64 len)
Sets the buffer to the specified data, discarding anything existing.
DSL_API void DSL_CC buffer_free(DSL_BUFFER *buf)
Free the buffer when you are done with it.
DSL_API void DSL_CC buffer_clear(DSL_BUFFER *buf)
Sets the buffer length to 0 and clears the data. It is still ready to be used unlike buffer_free.
DSL_API bool DSL_CC buffer_append(DSL_BUFFER *buf, const char *ptr, int64 len)
Add data to the end of the buffer.
DSL_API void DSL_CC buffer_resize(DSL_BUFFER *buf, int64 len)
Resize the buffer, if the length is longer then the existing data the added byte values are undefined...