sf_serializer.[hc] add function sf_serializer_read
parent
edf9d58909
commit
8344c8309f
|
|
@ -1,5 +1,4 @@
|
|||
%define LibserverframeDevel libserverframe-devel
|
||||
%define LibserverframeDebuginfo libserverframe-debuginfo
|
||||
%define CommitVersion %(echo $COMMIT_VERSION)
|
||||
|
||||
Name: libserverframe
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue