conn, fld
[libpgclient.git] / include / libpgcli / pgfld.h
blobe5278d36038ef244bc0f697a39840282cc75d2e1
1 /*Copyright (c) Brian B.
3 This library is free software; you can redistribute it and/or
4 modify it under the terms of the GNU Lesser General Public
5 License as published by the Free Software Foundation; either
6 version 3 of the License, or (at your option) any later version.
7 See the file LICENSE included with this distribution for more
8 information.
9 */
10 #ifndef __PGFLD_H__
11 #define __PGFLD_H__
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stdint.h>
16 #include <endian.h>
17 #include <netinet/in.h>
18 #ifdef HAVE_GMP
19 #include <gmp.h>
20 #endif
21 #include <libex/str.h>
22 #include <libex/time.h>
23 #include "pgconsts.h"
25 #define NUMERIC_POS 0x0000
26 #define NUMERIC_NEG 0x4000
27 #define NUMERIC_SHORT 0x8000
28 #define NUMERIC_NAN 0xC000
29 #define NUMERIC_DSCALE_MASK 0x3FFF
31 typedef struct in_addr inet_t;
32 typedef int32_t date_t;
33 typedef int32_t fsec_t;
35 typedef struct {
36 int32_t len;
37 uint32_t bit;
38 } pg_bit32_t;
40 typedef struct {
41 int64_t time;
42 int32_t day;
43 int32_t month;
44 } pg_intv_t;
46 typedef union {
47 int32_t i4;
48 int64_t i8;
49 float f4;
50 double f8;
51 char *s;
52 int8_t b;
53 int32_t d;
54 tm_t tm;
55 pg_intv_t intv;
56 #ifdef HAVE_GMP
57 mpq_t q;
58 #endif
59 pg_bit32_t bit32;
60 inet_t sin_addr;
61 uint8_t *u;
62 } pgval_t;
64 int timestamp_to_tm (tm_t dt, struct tm *tm);
65 struct tm *date_to_tm (date_t dt, struct tm *tm);
66 struct tm *interval_to_tm(pg_intv_t *span, struct tm *tm);
67 int tm_to_timestamp (struct tm *tm, fsec_t fsec, int *tzp, tm_t *result);
69 double pg_conv_double (double d);
70 float pg_conv_float (float f);
72 #ifdef HAVE_GMP
73 void pg_get_numeric (uint8_t *buf, mpq_t res, uint16_t *scale);
74 str_t *pg_numstr (mpq_ptr x, int base, uint16_t dscale, int float_prec);
75 #endif
77 typedef struct pgfld pgfld_t;
78 struct pgfld {
79 int is_null;
80 int oid;
81 pgval_t data;
82 size_t len;
83 int fmt;
84 int16_t dscale;
86 typedef pgfld_t* pgfld_ptr_t;
88 #define PG_DEF_MPZ { ._mp_alloc = 0, ._mp_size = 0, ._mp_d = NULL }
89 #define PG_DEF_MPQ { ._mp_num = PG_DEF_MPZ, ._mp_den = PG_DEF_MPZ }
90 #define PG_DEF_NUMERIC_DATA { .q = {PG_DEF_MPQ} }
92 #define PG_DEF { .is_null = 1, .oid = 0, .fmt = 0 }
93 #define PG_DEF_INT { .is_null = 1, .oid = OID_INT4, .fmt = 1 }
94 #define PG_DEF_BIGINT { .is_null = 1, .oid = OID_INT8, .fmt = 1 }
95 #define PG_DEF_FLOAT { .is_null = 1, .oid = OID_FLOAT4, .fmt = 1 }
96 #define PG_DEF_DOUBLE { .is_null = 1, .oid = OID_FLOAT8, .fmt = 1 }
97 #define PG_DEF_VARCHAR { .is_null = 1, .oid = OID_VARCHAR, .fmt = 0 }
98 #define PG_DEF_CHAR { .is_null = 1, .oid = OID_CHAR, .fmt = 0 }
99 #define PG_DEF_BOOL { .is_null = 1, .oid = OID_BOOL, .fmt = 1 }
100 #define PG_DEF_DATE { .is_null = 1, .oid = OID_DATE, .fmt = 1 }
101 #define PG_DEF_TIMESTAMP { .is_null = 1, .oid = OID_TIMESTAMP, .fmt = 1 }
102 #define PG_DEF_UUID { .is_null = 1, .oid = OID_UUID, .fmt = 1 }
103 #define PG_DEF_BYTEA { .is_null = 1, .oid = OID_BYTEA, .fmt = 1 }
104 #define PG_DEF_BIT32 { .is_null = 1, .oid = OID_BIT, .fmt = 1 }
105 #define PG_DEF_MONEY { .is_null = 1, .oid = OID_MONEY, .fmt = 1 }
106 #define PG_DEF_TEXT { .is_null = 1, .oid = OID_TEXT, .fmt = 0 }
108 #define PG_SET(X,V,L) X.is_null = 0; X.data.s = V, X.len = 0 == L ? strlen(V) : L
109 #define PG_SET_NULL(X) X.is_null = 1
110 #define PG_SET_INT(X,V) X.is_null = 0; X.data.i4 = htobe32(V), X.len = sizeof(int32_t)
111 #define PG_SET_BIGINT(X,V) X.is_null = 0; X.data.i8 = htobe64(V), X.len = sizeof(int64_t)
112 #define PG_SET_FLOAT(X,V) X.is_null = 0; X.data.f4 = pg_conv_float(V), X.len = sizeof(float)
113 #define PG_SET_DOUBLE(X,V) X.is_null = 0; X.data.f8 = pg_conv_double(V), X.len = sizeof(double)
114 #define PG_SET_VARCHAR(X,V,L) X.is_null = 0; X.data.s = V, X.len = 0 == L ? strlen(V) : L
115 #define PG_SET_CHAR(X,V,L) X.is_null = 0; X.data.s = V, X.len = 0 == L ? strlen(V) : L
116 #define PG_SET_BOOL(X,V) X.is_null = 0; X.data.b = V ? 1 : 0, X.len = sizeof(int8_t)
117 #define PG_SET_DATE(X,V) X.is_null = 0; X.data.d = htobe32(V), X.len = sizeof(date_t)
118 #define PG_SET_TIMESTAMP(X,V) X.is_null = 0; X.data.tm = htobe64(V), X.len = sizeof(tm_t)
119 #define PG_SET_BYTEA(X,V,L) X.is_null = 0; X.data.s = V; X.len = L
120 #define PG_SET_UUID(X,V) X.is_null = 0; X.data.u = V, X.len = sizeof(uuid_t)
121 #define PG_SET_BIT32(X,V) X.is_null = 0, X.data.bit32.bit = htobe32(V), X.data.bit32.len = htobe32(32), X.len = sizeof(pg_bit32_t)
122 #define PG_SET_TEXT(X,V,L) X.is_null = 0; X.data.s = V, X.len = 0 == L ? strlen(V) : L
123 #define PG_SET_MONEY(X,V) PG_SET_BIGINT(X,V)
125 #define PG_INIT(V,L) { .is_null = 0, .oid = 0, .fmt = 0, .data.s = V, .len = 0 == L ? strlen(V) : L }
126 #define PG_INIT_NULL { .is_null = 1, .oid = 0, .fmt = 0 }
127 #define PG_INIT_INT(V) { .is_null = 0, .oid = OID_INT4, .fmt = 1, .data.i4 = htobe32(V), .len = sizeof(int32_t) }
128 #define PG_INIT_BIGINT(V) { .is_null = 0, .oid = OID_INT8, .fmt = 1, .data.i8 = htobe64(V), .len = sizeof(int64_t) }
129 #define PG_INIT_FLOAT(V) { .is_null = 0, .oid = OID_FLOAT4, .fmt = 1, .data.f4 = pg_conv_float(V), .len = sizeof(float) }
130 #define PG_INIT_DOUBLE(V) { .is_null = 0, .oid = OID_FLOAT8, .fmt = 1, .data.f8 = pg_conv_double(V), .len = sizeof(double) }
131 #define PG_INIT_VARCHAR(V,L) { .is_null = 0, .oid = OID_VARCHAR, .fmt = 0, .data.s = V, .len = 0 == L ? strlen(V) : L }
132 #define PG_INIT_CHAR(V,L) { .is_null = 0, .oid = OID_CHAR, .fmt = 0, .data.s = V, .len = 0 == L ? strlen(V) : L }
133 #define PG_INIT_BOOL(V) { .is_null = 0, .oid = OID_BOOL, .fmt = 1, .data.b = V ? 1 : 0, .len = sizeof(int8_t) }
134 #define PG_INIT_DATE(V), { .is_null = 0, .oid = OID_DATE, .fmt = 1, .data.s = htobe32(V), .len = sizeof(date_t) }
135 #define PG_INIT_TIMESTAMP(V) { .is_null = 0, .oid = OID_TIMESTAMP, .fmt = 1, .data.tm = htobe64(V), .len = sizeof(int64_t) }
136 #define PG_INIT_BYTEA(V) { .is_null = 0, .oid = OID_BYTEA, .fmt = 1, .data.s = V, .len = L }
137 #define PG_INIT_UUID(V) { .is_null = 0, .oid = OID_UUID, .fmt = 1, .data.u = V, .len = sizeof(uuid_t) }
138 #define PG_INIT_BIT32(V) { .is_null = 0, .oid = OID_BIT, .fmt = 1, .data.bit32.bit = htobe32(V), .data.bit32.len = htobe32(32), .len = sizeof(pg_bit32_t) }
139 #define PG_INIT_TEXT(V,L) { .is_null = 0, .oid = OID_TEXT, .fmt = 0, .data.s = V, .len = 0 == L ? strlen(V) : L }
140 #define PG_INIT_MONEY(V) { .is_null = 0, .oid = OID_MONEY, .fmt = 1, .data.i8 = htobe64(V), .len = sizeof(int64_t) }
142 #endif