soprano: add parameter list

This commit is contained in:
Dmitry Simonenko 2017-03-03 15:55:17 +03:00
parent b2976adcde
commit 670dba2b92
3 changed files with 85 additions and 1 deletions

View File

@ -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})

36
src/so_param.c Normal file
View File

@ -0,0 +1,36 @@
/*
* soprano.
*
* Protocol-level PostgreSQL client library.
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <so_macro.h>
#include <so_stream.h>
#include <so_param.h>
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;
}

48
src/so_param.h Normal file
View File

@ -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