diff --git a/libserverframe.spec b/libserverframe.spec index 0e672c6..7effa52 100644 --- a/libserverframe.spec +++ b/libserverframe.spec @@ -1,5 +1,4 @@ %define LibserverframeDevel libserverframe-devel -%define LibserverframeDebuginfo libserverframe-debuginfo %define CommitVersion %(echo $COMMIT_VERSION) Name: libserverframe diff --git a/src/sf_serializer.c b/src/sf_serializer.c index 8c65709..cd65178 100644 --- a/src/sf_serializer.c +++ b/src/sf_serializer.c @@ -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; pnfield.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; +} diff --git a/src/sf_serializer.h b/src/sf_serializer.h index 5298adb..35eb391 100644 --- a/src/sf_serializer.h +++ b/src/sf_serializer.h @@ -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; pnlength += 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; pnlength += 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; pnlength += 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