annotate main/database/src/converters.h @ 11553:35e9e4b6ab34 octave-forge

Fix configuration of postgresql include directories.
author i7tiol
date Sun, 17 Mar 2013 19:08:04 +0000
parents d14a23884d9c
children eb48ca3b21a1
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 #include <endian.h>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
28
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
29 #include <vector>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
30 #include <string>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
31
11553
35e9e4b6ab34 Fix configuration of postgresql include directories.
i7tiol
parents: 11480
diff changeset
32 #include <libpq-fe.h>
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
33
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
34 #define OCT_PQ_NUM_CONVERTERS 13
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
35
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
36 typedef std::vector<char> oct_pq_dynvec_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
37
11409
21794ea37065 Make char* in to_octave_ converters const.
i7tiol
parents: 11407
diff changeset
38 typedef int (*oct_pq_to_octave_fp_t) (const char *, octave_value &, int);
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
39
11407
f4098c7d5b35 Wrong implementation of copy-in from argument.
i7tiol
parents: 11394
diff changeset
40 typedef int (*oct_pq_from_octave_fp_t) (const octave_value &, oct_pq_dynvec_t &);
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
41
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
42 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
43
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
44 struct oct_pq_conv_t_;
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
45
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
46 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
47
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
48 // 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
49 typedef struct oct_pq_conv_t_
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
50 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
51 Oid oid; // read from server
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
52 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
53 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
54 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
55 //composite types
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
56 bool is_composite; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
57 bool is_enum; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
58 bool is_not_constant; // false for constant objects
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
59 // const char *name; not all constants, use std::string
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
60 std::string name;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
61 oct_pq_to_octave_fp_t to_octave_str;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
62 oct_pq_to_octave_fp_t to_octave_bin;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
63 oct_pq_from_octave_fp_t from_octave_str;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
64 oct_pq_from_octave_fp_t from_octave_bin;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
65 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
66 oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
67
11460
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
68 std::string &pq_basetype_prefix (void);
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
69
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
70 // a wrapper class for array of pointers to converters which qualifies
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
71 // base type names in initialization
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
72 class oct_pq_conv_ptrs_t
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
73 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
74 public:
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 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
77 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
78 for (int i = 0; i < n; i++)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
79 {
11460
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
80 std::string prefix = pq_basetype_prefix ();
11429
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 converters[i]->name = prefix.append (converters[i]->name);
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 }
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
85
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
86 oct_pq_conv_t *operator[] (int i) { return converters[i]; }
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 private:
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 oct_pq_conv_t **converters;
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
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
93 // 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
94 // constructor which nullifies it, for efficient use of maps, where
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
95 // 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
96 // newly generated key mapping to a value of NULL
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
97 class oct_pq_conv_wrapper_t
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
98 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
99 public:
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
100
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
101 oct_pq_conv_wrapper_t (void) : conv (NULL) {}
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
102
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
103 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
104
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
105 operator oct_pq_conv_t *&(void) { return conv; }
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_t *&operator->(void) { return conv; }
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 private:
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 oct_pq_conv_t *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
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
114 // helper function for debugging
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
115 void print_conv (oct_pq_conv_t *);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
116
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11410
diff changeset
117 extern oct_pq_conv_ptrs_t conv_ptrs;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
118
11410
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
119 // these prototypes are needed because pointers to these functions are
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
120 // stored in the converter structures of each found enum type
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
121 int to_octave_str_text (const char *c, octave_value &ov, int nb);
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
122 int to_octave_bin_text (const char *c, octave_value &ov, int nb);
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
123 int from_octave_str_text (const octave_value &ov, oct_pq_dynvec_t &val);
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
124 int from_octave_bin_text (const octave_value &ov, oct_pq_dynvec_t &val);
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11409
diff changeset
125
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
126 // 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
127 #define OCT_PQ_PUT(dv, type, val) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
128 dv.resize (dv.size () + sizeof (type)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
129 *((type *) &(dv.end ()[-sizeof (type)])) = val;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
130
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
131 // 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
132 // 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
133 // after further increasing 'dv', OCT_PQ_FILL_UINT32_PLACEHOLDER
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
134 // should be used with equal arguments
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
135 #define OCT_PQ_SET_UINT32_PLACEHOLDER(dv, var) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
136 octave_idx_type var = dv.size () + sizeof (uint32_t); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
137 dv.resize (var);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
138 // to be used after OCT_PQ_SET_UINT32_PLACEHOLDER with equal
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
139 // arguments; calculate difference between current size of dynamic
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
140 // 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
141 // 'var', and write this difference, converted to uint32_t in network
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
142 // byte order, to the placeholder within 'dv' just before the position
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
143 // stored in 'var'
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
144 #define OCT_PQ_FILL_UINT32_PLACEHOLDER(dv, var) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
145 *((uint32_t *) &(dv[var - sizeof (uint32_t)])) = htobe32 (dv.size () - var);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
146
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
147 #define OCT_PQ_DECL_GET_INT32(retvar, pointer, type) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
148 type retvar = be32toh (*((type *) pointer)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
149 pointer += 4;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
150
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
151 #define OCT_PQ_GET_INT32(retvar, pointer, type) \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
152 retvar = be32toh (*((type *) pointer)); \
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
153 pointer += 4;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
154
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
155 #endif // __OCT_PQ_CONVERTERS__