sf_serializer.[hc] add function sf_serializer_read
parent
edf9d58909
commit
8344c8309f
|
|
@ -1,5 +1,4 @@
|
||||||
%define LibserverframeDevel libserverframe-devel
|
%define LibserverframeDevel libserverframe-devel
|
||||||
%define LibserverframeDebuginfo libserverframe-debuginfo
|
|
||||||
%define CommitVersion %(echo $COMMIT_VERSION)
|
%define CommitVersion %(echo $COMMIT_VERSION)
|
||||||
|
|
||||||
Name: libserverframe
|
Name: libserverframe
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,8 @@ static SFSerializerTypeConfig value_type_configs[SF_SERIALIZER_VALUE_TYPE_COUNT]
|
||||||
{"int32", sizeof(SFSerializerPackFieldInt32), 0},
|
{"int32", sizeof(SFSerializerPackFieldInt32), 0},
|
||||||
{"int64", sizeof(SFSerializerPackFieldInt64), 0},
|
{"int64", sizeof(SFSerializerPackFieldInt64), 0},
|
||||||
{"string", sizeof(SFSerializerPackStringValue), 0},
|
{"string", sizeof(SFSerializerPackStringValue), 0},
|
||||||
|
{"int8_array", sizeof(SFSerializerPackFieldArray), 1},
|
||||||
|
{"int16_array", sizeof(SFSerializerPackFieldArray), 2},
|
||||||
{"int32_array", sizeof(SFSerializerPackFieldArray), 4},
|
{"int32_array", sizeof(SFSerializerPackFieldArray), 4},
|
||||||
{"int64_array", sizeof(SFSerializerPackFieldArray), 8},
|
{"int64_array", sizeof(SFSerializerPackFieldArray), 8},
|
||||||
{"map", sizeof(SFSerializerPackFieldArray), 2 *
|
{"map", sizeof(SFSerializerPackFieldArray), 2 *
|
||||||
|
|
@ -224,10 +226,19 @@ static int unpack_array(SFSerializerIterator *it, const int remain_len)
|
||||||
it->p += sizeof(SFSerializerPackFieldArray);
|
it->p += sizeof(SFSerializerPackFieldArray);
|
||||||
end = it->int_array.elts + count;
|
end = it->int_array.elts + count;
|
||||||
for (pn=it->int_array.elts; pn<end; pn++) {
|
for (pn=it->int_array.elts; pn<end; pn++) {
|
||||||
if (it->field.type == sf_serializer_value_type_int32_array) {
|
switch (it->field.type) {
|
||||||
*pn = buff2int(it->p);
|
case sf_serializer_value_type_int8_array:
|
||||||
} else {
|
*pn = *it->p;
|
||||||
*pn = buff2long(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;
|
it->p += value_type_configs[it->field.type].elt_size;
|
||||||
}
|
}
|
||||||
|
|
@ -336,6 +347,8 @@ const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
break;
|
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_int32_array:
|
||||||
case sf_serializer_value_type_int64_array:
|
case sf_serializer_value_type_int64_array:
|
||||||
if ((it->error_no=unpack_array(it, remain_len - sizeof(
|
if ((it->error_no=unpack_array(it, remain_len - sizeof(
|
||||||
|
|
@ -357,3 +370,48 @@ const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it)
|
||||||
|
|
||||||
return &it->field;
|
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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@
|
||||||
#include "fastcommon/fast_buffer.h"
|
#include "fastcommon/fast_buffer.h"
|
||||||
#include "fastcommon/hash.h"
|
#include "fastcommon/hash.h"
|
||||||
|
|
||||||
#define SF_SERIALIZER_VALUE_TYPE_COUNT 8
|
#define SF_SERIALIZER_VALUE_TYPE_COUNT 10
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
sf_serializer_value_type_int8 = 0,
|
sf_serializer_value_type_int8 = 0,
|
||||||
|
|
@ -30,6 +30,8 @@ typedef enum {
|
||||||
sf_serializer_value_type_int32,
|
sf_serializer_value_type_int32,
|
||||||
sf_serializer_value_type_int64,
|
sf_serializer_value_type_int64,
|
||||||
sf_serializer_value_type_string,
|
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_int32_array,
|
||||||
sf_serializer_value_type_int64_array,
|
sf_serializer_value_type_int64_array,
|
||||||
sf_serializer_value_type_map
|
sf_serializer_value_type_map
|
||||||
|
|
@ -242,6 +244,60 @@ static inline int sf_serializer_pack_string(FastBuffer *buffer,
|
||||||
return 0;
|
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,
|
static inline int sf_serializer_pack_int32_array(FastBuffer *buffer,
|
||||||
const unsigned char fid, const int32_t *array, const int count)
|
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 = (SFSerializerPackFieldArray *)(buffer->data + buffer->length);
|
||||||
obj->field.id = fid;
|
obj->field.id = fid;
|
||||||
obj->field.type = sf_serializer_value_type_int64_array;
|
obj->field.type = sf_serializer_value_type_int64_array;
|
||||||
long2buff(count, obj->value.count);
|
int2buff(count, obj->value.count);
|
||||||
end = array + count;
|
end = array + count;
|
||||||
for (pn=array, ps=obj->value.ptr; pn<end; pn++, ps+=8) {
|
for (pn=array, ps=obj->value.ptr; pn<end; pn++, ps+=8) {
|
||||||
int2buff(*pn, ps);
|
long2buff(*pn, ps);
|
||||||
}
|
}
|
||||||
buffer->length += length;
|
buffer->length += length;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -367,6 +423,8 @@ int sf_serializer_unpack(SFSerializerIterator *it, const string_t *content);
|
||||||
|
|
||||||
const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it);
|
const SFSerializerFieldValue *sf_serializer_next(SFSerializerIterator *it);
|
||||||
|
|
||||||
|
int sf_serializer_read(int fd, char *buff, const int size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue