annotate main/database/src/converters.h @ 11712:f4c52c68f744 octave-forge

Added converters for types uuid and xml.
author i7tiol
date Sun, 19 May 2013 18:47:32 +0000
parents 4f5471a9bce6
children ee2b22964070
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
1 /*
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
2
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
3 Copyright (C) 2012, 2013 Olaf Till <i7tiol@t-online.de>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
4
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
8 (at your option) any later version.
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
9
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
13 GNU General Public License for more details.
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
14
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
16 along with this program; If not, see <http://www.gnu.org/licenses/>.
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
17
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
18 */
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
19
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
20 #ifndef __OCT_PQ_CONVERTERS__
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
21
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
22 #define __OCT_PQ_CONVERTERS__
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
23
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
24 #include <octave/oct.h>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
25
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
26 #include <stdint.h>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
27
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
28 #include <vector>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
29 #include <string>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
30
11553
35e9e4b6ab34 Fix configuration of postgresql include directories.
i7tiol
parents: 11480
diff changeset
31 #include <libpq-fe.h>
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
32
11644
eb48ca3b21a1 Fix #include <endian.h> for Apple, reported by Kamil Badyla.
i7tiol
parents: 11553
diff changeset
33 #include "wrap_endian.h"
eb48ca3b21a1 Fix #include <endian.h> for Apple, reported by Kamil Badyla.
i7tiol
parents: 11553
diff changeset
34
11712
f4c52c68f744 Added converters for types uuid and xml.
i7tiol
parents: 11710
diff changeset
35 #define OCT_PQ_NUM_CONVERTERS 34
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
36
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
37 typedef std::vector<char> oct_pq_dynvec_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
38
11657
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
39 class octave_pq_connection;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
40
11657
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
41 typedef int (*oct_pq_to_octave_fp_t) (const octave_pq_connection &,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
42 const char *, octave_value &, int);
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
43
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
44 typedef int (*oct_pq_from_octave_fp_t) (const octave_pq_connection &,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
45 const octave_value &,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
46 oct_pq_dynvec_t &);
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
47
11474
4fd39d36eff5 Retrieve element information of composite types already at connection time. Exclude negative element numbers (system columns) of composite types corresponding to tables.
i7tiol
parents: 11460
diff changeset
48 typedef std::vector<Oid> oct_pq_el_oids_t;
4fd39d36eff5 Retrieve element information of composite types already at connection time. Exclude negative element numbers (system columns) of composite types corresponding to tables.
i7tiol
parents: 11460
diff changeset
49
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
50 struct oct_pq_conv_t_;
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
51
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
52 typedef std::vector<struct oct_pq_conv_t_ *> oct_pq_conv_cache_t;
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
53
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
54 // some objects will be constants, some will be allocated
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
55 typedef struct oct_pq_conv_t_
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
56 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
57 Oid oid; // read from server
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
58 Oid aoid; // array oid // read from server
11474
4fd39d36eff5 Retrieve element information of composite types already at connection time. Exclude negative element numbers (system columns) of composite types corresponding to tables.
i7tiol
parents: 11460
diff changeset
59 oct_pq_el_oids_t el_oids; // element oids, empty for non-composite types
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
60 oct_pq_conv_cache_t conv_cache; // element converter structures for
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
61 //composite types
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
62 bool is_composite; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
63 bool is_enum; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
64 bool is_not_constant; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
65 // const char *name; not all constants, use std::string
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
66 std::string name;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
67 oct_pq_to_octave_fp_t to_octave_str;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
68 oct_pq_to_octave_fp_t to_octave_bin;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
69 oct_pq_from_octave_fp_t from_octave_str;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
70 oct_pq_from_octave_fp_t from_octave_bin;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
71 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
72 oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
73
11460
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
74 std::string &pq_basetype_prefix (void);
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
75
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
76 // a wrapper class for array of pointers to converters which qualifies
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
77 // base type names in initialization
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
78 class oct_pq_conv_ptrs_t
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
79 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
80 public:
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
81
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
82 oct_pq_conv_ptrs_t (int n, oct_pq_conv_t **ptrs) : converters (ptrs)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
83 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
84 for (int i = 0; i < n; i++)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
85 {
11460
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
86 std::string prefix = pq_basetype_prefix ();
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
87
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
88 converters[i]->name = prefix.append (converters[i]->name);
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
89 }
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
90 }
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
91
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
92 oct_pq_conv_t *operator[] (int i) { return converters[i]; }
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
93
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
94 private:
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
95
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
96 oct_pq_conv_t **converters;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
97 };
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
98
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
99 // a wrapper class around oct_pq_conv_t* to provide a default
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
100 // constructor which nullifies it, for efficient use of maps, where
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
101 // checking for the presence of a key while inserting it can rely on a
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
102 // newly generated key mapping to a value of NULL
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
103 class oct_pq_conv_wrapper_t
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
104 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
105 public:
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
106
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
107 oct_pq_conv_wrapper_t (void) : conv (NULL) {}
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
108
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
109 oct_pq_conv_wrapper_t (oct_pq_conv_t *c) : conv (c) {}
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
110
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
111 operator oct_pq_conv_t *&(void) { return conv; }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
112
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
113 oct_pq_conv_t *&operator->(void) { return conv; }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
114
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
115 private:
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
116
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
117 oct_pq_conv_t *conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
118 };
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
119
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
120 // helper function for debugging
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
121 void print_conv (oct_pq_conv_t *);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
122
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
123 extern oct_pq_conv_ptrs_t conv_ptrs;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
124
11410
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
125 // these prototypes are needed because pointers to these functions are
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
126 // stored in the converter structures of each found enum type
11657
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
127 int to_octave_str_text (const octave_pq_connection &conn,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
128 const char *c, octave_value &ov, int nb);
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
129 int to_octave_bin_text (const octave_pq_connection &conn,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
130 const char *c, octave_value &ov, int nb);
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
131 int from_octave_str_text (const octave_pq_connection &conn,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
132 const octave_value &ov, oct_pq_dynvec_t &val);
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
133 int from_octave_bin_text (const octave_pq_connection &conn,
465192f682f0 Pass connection information to converters.
i7tiol
parents: 11644
diff changeset
134 const octave_value &ov, oct_pq_dynvec_t &val);
11410
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
135
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
136 // append bytes of value 'val' of type 'type' to dynamic char vector 'dv'
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
137 #define OCT_PQ_PUT(dv, type, val) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
138 dv.resize (dv.size () + sizeof (type)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
139 *((type *) &(dv.end ()[-sizeof (type)])) = val;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
140
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
141 // increase size of dynamic char vector 'dv' by size of uint32 and
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
142 // store the new size in a variable named 'var' of octave_idx_type;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
143 // after further increasing 'dv', OCT_PQ_FILL_UINT32_PLACEHOLDER
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
144 // should be used with equal arguments
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
145 #define OCT_PQ_SET_UINT32_PLACEHOLDER(dv, var) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
146 octave_idx_type var = dv.size () + sizeof (uint32_t); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
147 dv.resize (var);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
148 // to be used after OCT_PQ_SET_UINT32_PLACEHOLDER with equal
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
149 // arguments; calculate difference between current size of dynamic
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
150 // char vector 'dv' and a previous size stored in a variable named
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
151 // 'var', and write this difference, converted to uint32_t in network
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
152 // byte order, to the placeholder within 'dv' just before the position
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
153 // stored in 'var'
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
154 #define OCT_PQ_FILL_UINT32_PLACEHOLDER(dv, var) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
155 *((uint32_t *) &(dv[var - sizeof (uint32_t)])) = htobe32 (dv.size () - var);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
156
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
157 #define OCT_PQ_DECL_GET_INT32(retvar, pointer, type) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
158 type retvar = be32toh (*((type *) pointer)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
159 pointer += 4;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
160
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
161 #define OCT_PQ_GET_INT32(retvar, pointer, type) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
162 retvar = be32toh (*((type *) pointer)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
163 pointer += 4;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
164
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
165 #endif // __OCT_PQ_CONVERTERS__