diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1f8d9a5a..22a6a778 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ set(so_library soprano) -set(so_src so_md5.c so_password.c so_read.c so_beread.c so_feread.c) +set(so_src so_md5.c so_password.c so_param.c so_read.c so_beread.c so_feread.c) add_library(so_library_shared SHARED ${so_src}) set_target_properties(so_library_shared PROPERTIES OUTPUT_NAME ${so_library}) diff --git a/src/so_param.c b/src/so_param.c new file mode 100644 index 00000000..a47b82e5 --- /dev/null +++ b/src/so_param.c @@ -0,0 +1,36 @@ + +/* + * soprano. + * + * Protocol-level PostgreSQL client library. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include + +int so_paramlist_add(so_paramlist_t *list, + uint8_t *name, + uint32_t name_len, + uint8_t *value, + uint32_t value_len) +{ + int size = sizeof(so_param_t) + name_len + value_len; + int rc; + rc = so_stream_ensure(&list->buf, size); + if (so_unlikely(rc == -1)) + return -1; + so_param_t *param = (so_param_t*)list->buf.p; + param->name_len = name_len; + param->value_len = value_len; + memcpy(param->data, name, name_len); + memcpy(param->data + name_len, value, value_len); + so_stream_advance(&list->buf, size); + return 0; +} diff --git a/src/so_param.h b/src/so_param.h new file mode 100644 index 00000000..53a2036a --- /dev/null +++ b/src/so_param.h @@ -0,0 +1,48 @@ +#ifndef SO_PARAM_H_ +#define SO_PARAM_H_ + +/* + * soprano. + * + * Protocol-level PostgreSQL client library. +*/ + +typedef struct so_param_t so_param_t; +typedef struct so_paramlist_t so_paramlist_t; + +struct so_param_t { + uint32_t name_len; + uint32_t value_len; + char data[]; +}; + +struct so_paramlist_t { + so_stream_t buf; +}; + +static inline char* +so_param_name(so_param_t *param) { + return param->data; +} + +static inline char* +so_param_value(so_param_t *param) { + return param->data + param->name_len; +} + +static inline void +so_paramlist_init(so_paramlist_t *list) +{ + so_stream_init(&list->buf); +} + +static inline void +so_paramlist_free(so_paramlist_t *list) +{ + so_stream_free(&list->buf); +} + +int so_paramlist_add(so_paramlist_t*, uint8_t*, uint32_t, + uint8_t*, uint32_t); + +#endif