917f22dcfe20794a43934b0f0e44bd9e5a46545c
[sip-router] / modules / db_postgres / pg_fld.h
1 /* 
2  * $Id$ 
3  *
4  * PostgreSQL Database Driver for SER
5  *
6  * Portions Copyright (C) 2001-2003 FhG FOKUS
7  * Copyright (C) 2003 August.Net Services, LLC
8  * Portions Copyright (C) 2005-2008 iptelorg GmbH
9  *
10  * This file is part of SER, a free SIP server.
11  *
12  * SER is free software; you can redistribute it and/or modify it under the
13  * terms of the GNU General Public License as published by the Free Software
14  * Foundation; either version 2 of the License, or (at your option) any later
15  * version
16  *
17  * For a license to use the ser software under conditions other than those
18  * described here, or to purchase support for this software, please contact
19  * iptel.org by e-mail at the following addresses: info@iptel.org
20  *
21  * SER is distributed in the hope that it will be useful, but WITHOUT ANY
22  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
23  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
24  * details.
25  *
26  * You should have received a copy of the GNU General Public License along
27  * with this program; if not, write to the Free Software Foundation, Inc., 59
28  * Temple Place, Suite 330, Boston, MA 02111-1307 USA
29  */
30
31 #ifndef _PG_FLD_H
32 #define _PG_FLD_H
33
34 /** \addtogroup postgres
35  * @{ 
36  */
37
38 /** \file 
39  * Implementation of pg_fld data structure representing PostgreSQL fields and
40  * related functions.
41  */
42
43 #include "pg_oid.h"
44 #include "pg_cmd.h"
45 #include "../../ut.h"
46 #include "../../lib/srdb2/db_gen.h"
47 #include "../../lib/srdb2/db_fld.h"
48 #include <libpq-fe.h>
49
50 struct pg_fld {
51         db_drv_t gen;
52
53         /**
54          * A union of varius data types from db_fld, postgres expects binary
55          * data in network byte order so we use these variables as temporary
56          * buffer to store values after the conversion.
57          */
58         union {
59                 int          int4[2]; /**< Integer value in network byte order */
60                 short        int2[4];
61                 float        flt;     /**< Float value in network byte order */
62                 double       dbl;     /**< Double value in network byte order */
63                 time_t       time;    /**< Unix timestamp in network byte order */
64                 unsigned int bitmap;  /**< Bitmap value in network byte order */ 
65                 long long    int8;    /**< 8-byte integer value in network byte order */
66                 char         byte[8];
67         } v;
68         char buf[INT2STR_MAX_LEN]; /**< Buffer for int2str conversions */
69         Oid oid;                   /**< Type of the field on the server */
70 };
71
72
73 /** Creates a new PostgreSQL specific payload.
74  * This function creates a new PostgreSQL specific payload structure and
75  * attaches the structure to the generic db_fld structure.
76  * @param fld A generic db_fld structure to be exended.
77  * @param table Name of the table on the server.
78  * @retval 0 on success.
79  * @retval A negative number on error.
80  */
81 int pg_fld(db_fld_t* fld, char* table);
82
83 int pg_resolve_param_oids(db_fld_t* vals, db_fld_t* match, 
84                                                   int n1, int n2, PGresult* res);
85
86 int pg_resolve_result_oids(db_fld_t* fld, int n, PGresult* res);
87
88
89 /** Converts arrays of db_fld fields to PostgreSQL parameters.
90  * The function converts fields in SER db_fld format to parameters suitable
91  * for PostgreSQL API functions.
92  * @param values An array of pointers to values in PostgreSQL format. The
93  *               function will store pointers to converted values there.
94  * @param lenghts An array of integers that will be filled with lenghts
95  *                of values.
96  * @param formats An array of value formats, see PostgreSQL API client
97  *                library documentation for more detail.
98  * @param oids Types of corresponding columns on the server.
99  * @param types A type conversion table.
100  * @param fld An array of db_fld fields to be converted.
101  * @param flags Connection flags controlling how values are converted.
102  * @todo Implement support for bit fields with size bigger than 32 
103  * @todo Implement support for varbit properly to remove leading zeroes
104  * @todo Check if timezones are handled properly
105  * @todo Support for DB_NONE in pg_pg2fld and pg_check_pg2fld
106  * @todo local->UTC conversion (also check the SQL command in ser-oob)
107  */
108 int pg_fld2pg(struct pg_params* dst, int off, pg_type_t* types, 
109                           db_fld_t* src, unsigned int flags);
110
111
112 /** Converts fields from result in PGresult format into SER format.
113  * The function converts fields from PostgreSQL result (PGresult structure)
114  * into the internal format used in SER. The function converts one row at a
115  * time.
116  * @param fld The destination array of db_fld fields to be filled with converted
117  *            values.
118  * @param pres A PostgreSQL result structure to be converted into SER format.
119  * @param row Number of the row to be converted.
120  * @param flags Connection flags controlling how values are converted.
121  * @retval 0 on success
122  * @retval A negative number on error.
123  * @todo UTC->local conversion
124  */
125 int pg_pg2fld(db_fld_t* dst, PGresult* src, int row, pg_type_t* types, 
126                           unsigned int flags);
127
128
129 /** Checks if all db_fld fields have types compatible with corresponding field 
130  * types on the server.
131  * The functions checks whether all db_fld fields in the last parameter are
132  * compatible with column types on the server.
133  * @param oids An array of Oids of corresponding columns on the server.
134  * @param lenghts An array of sizes of corresponding columns on the server.
135  * @param types An array used to map internal field types to Oids.
136  * @param fld An array of db_fld fields to be checked.
137  * @retval 0 on success
138  * @retval A negative number on error.
139  */
140 int pg_check_fld2pg(db_fld_t* fld, pg_type_t* types);
141
142
143 int pg_check_pg2fld(db_fld_t* fld, pg_type_t* types);
144
145
146 /** @} */
147
148 #endif /* _PG_FLD_H */