sf_serializer.[hc] add function sf_serializer_read

storage_engine
YuQing 2021-09-17 09:30:15 +08:00
parent edf9d58909
commit 8344c8309f
3 changed files with 123 additions and 8 deletions

View File

@ -1,5 +1,4 @@
%define LibserverframeDevel libserverframe-devel
%define LibserverframeDebuginfo libserverframe-debuginfo
%define CommitVersion %(echo $COMMIT_VERSION)
Name: libserverframe

View File

@ -45,6 +45,8 @@ static SFSerializerTypeConfig value_type_configs[SF_SERIALIZER_VALUE_TYPE_COUNT]
{"int32", sizeof(SFSerializerPackFieldInt32), 0},
{"int64", sizeof(SFSerializerPackFieldInt64), 0},
{"string", sizeof(SFSerializerPackStringValue), 0},
{"int8_array", sizeof(SFSerializerPackFieldArray), 1},
{"int16_array", sizeof(SFSerializerPackFieldArray), 2},
{"int32_array", sizeof(SFSerializerPackFieldArray), 4},
{"int64_array", sizeof(SFSerializerPackFieldArray), 8},
{"map", sizeof(SFSerializerPackFieldArray), 2 *
@ -224,10 +226,19 @@ static int unpack_array(SFSerializerIterator *it, const int remain_len)
it->p += sizeof(SFSerializerPackFieldArray);
end = it->int_array.elts + count;
for (pn=it->int_array.elts; pn<end; pn++) {
if (it->field.type == sf_serializer_value_type_int32_array) {
*pn = buff2int(it->p);
} else {
*pn = buff2long(it->p);
switch (it->field.type) {
case sf_serializer_value_type_int8_array:
*pn = *it->p;
break;
case sf_serializer_value_type_int16_array:
*pn = buff2short(it->p);
break;
case sf_serializer_value_type_int32_array:
*pn = buff2int(it->p);
break;
default:
*pn = buff2long(it->p);
break;
}
it->p += value_type_configs[it->field.type].elt_size;
}
@ -336,6 +347,8 @@ const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it)
return NULL;
}
break;
case sf_serializer_value_type_int8_array:
case sf_serializer_value_type_int16_array:
case sf_serializer_value_type_int32_array:
case sf_serializer_value_type_int64_array:
if ((it->error_no=unpack_array(it, remain_len - sizeof(
@ -357,3 +370,48 @@ const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it)
return &it->field;
}
int sf_serializer_read(int fd, char *buff, const int size)
{
SFSerializerPackHeader *header;
int length;
int total_bytes;
if (size <= sizeof(SFSerializerPackHeader)) {
errno = EOVERFLOW;
return -1;
}
if (fc_safe_read(fd, buff, sizeof(SFSerializerPackHeader)) !=
sizeof(SFSerializerPackHeader))
{
if (errno == 0) {
errno = ENODATA;
}
return -1;
}
header = (SFSerializerPackHeader *)buff;
length = buff2int(header->length);
if (length <= 0) {
errno = EINVAL;
return -1;
}
total_bytes = sizeof(SFSerializerPackHeader) + length;
if (total_bytes > size) {
errno = EOVERFLOW;
return -1;
}
if (fc_safe_read(fd, buff + sizeof(SFSerializerPackHeader),
length) != length)
{
if (errno == 0) {
errno = ENODATA;
}
return -1;
}
return total_bytes;
}

View File

@ -22,7 +22,7 @@
#include "fastcommon/fast_buffer.h"
#include "fastcommon/hash.h"
#define SF_SERIALIZER_VALUE_TYPE_COUNT 8
#define SF_SERIALIZER_VALUE_TYPE_COUNT 10
typedef enum {
sf_serializer_value_type_int8 = 0,
@ -30,6 +30,8 @@ typedef enum {
sf_serializer_value_type_int32,
sf_serializer_value_type_int64,
sf_serializer_value_type_string,
sf_serializer_value_type_int8_array,
sf_serializer_value_type_int16_array,
sf_serializer_value_type_int32_array,
sf_serializer_value_type_int64_array,
sf_serializer_value_type_map
@ -242,6 +244,60 @@ static inline int sf_serializer_pack_string(FastBuffer *buffer,
return 0;
}
static inline int sf_serializer_pack_int8_array(FastBuffer *buffer,
const unsigned char fid, const int8_t *array, const int count)
{
int result;
int length;
SFSerializerPackFieldArray *obj;
const int8_t *pn;
const int8_t *end;
char *ps;
length = sizeof(SFSerializerPackFieldArray) + count * 1;
if ((result=fast_buffer_check_inc_size(buffer, length)) != 0) {
return result;
}
obj = (SFSerializerPackFieldArray *)(buffer->data + buffer->length);
obj->field.id = fid;
obj->field.type = sf_serializer_value_type_int8_array;
int2buff(count, obj->value.count);
end = array + count;
for (pn=array, ps=obj->value.ptr; pn<end; pn++) {
*ps++ = *pn;
}
buffer->length += length;
return 0;
}
static inline int sf_serializer_pack_int16_array(FastBuffer *buffer,
const unsigned char fid, const int16_t *array, const int count)
{
int result;
int length;
SFSerializerPackFieldArray *obj;
const int16_t *pn;
const int16_t *end;
char *ps;
length = sizeof(SFSerializerPackFieldArray) + count * 2;
if ((result=fast_buffer_check_inc_size(buffer, length)) != 0) {
return result;
}
obj = (SFSerializerPackFieldArray *)(buffer->data + buffer->length);
obj->field.id = fid;
obj->field.type = sf_serializer_value_type_int16_array;
int2buff(count, obj->value.count);
end = array + count;
for (pn=array, ps=obj->value.ptr; pn<end; pn++, ps+=2) {
short2buff(*pn, ps);
}
buffer->length += length;
return 0;
}
static inline int sf_serializer_pack_int32_array(FastBuffer *buffer,
const unsigned char fid, const int32_t *array, const int count)
{
@ -287,10 +343,10 @@ static inline int sf_serializer_pack_int64_array(FastBuffer *buffer,
obj = (SFSerializerPackFieldArray *)(buffer->data + buffer->length);
obj->field.id = fid;
obj->field.type = sf_serializer_value_type_int64_array;
long2buff(count, obj->value.count);
int2buff(count, obj->value.count);
end = array + count;
for (pn=array, ps=obj->value.ptr; pn<end; pn++, ps+=8) {
int2buff(*pn, ps);
long2buff(*pn, ps);
}
buffer->length += length;
return 0;
@ -367,6 +423,8 @@ int sf_serializer_unpack(SFSerializerIterator *it, const string_t *content);
const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it);
int sf_serializer_read(int fd, char *buff, const int size);
#ifdef __cplusplus
}
#endif