annotate main/database/src/pq_connection.cc @ 11410:c20550232685 octave-forge

Conversion of enum types implemented.
author i7tiol
date Tue, 22 Jan 2013 20:24:30 +0000
parents 9aee227e296c
children b1f26b72b61a
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 #include "pq_connection.h"
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
21 #include "command.h"
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
22
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
23 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_pq_connection, "PGconn", "PGconn")
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
24
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
25 octave_pq_connection::octave_pq_connection (std::string arg)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
26 : postgres (0), conv_map (), name_conv_map (&map_str_cmp)
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 static bool type_registered = false;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
29
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
30 if (! type_registered) register_type ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
31
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
32 conn = PQconnectdb (arg.c_str ());
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 if (! conn || PQstatus (conn) == CONNECTION_BAD)
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 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
37 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
38 PQfinish (conn);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
39
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
40 conn = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
41 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
42
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
43 error ("PQ connection attempt failed");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
44 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
45 else
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
46 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
47 // init name converter-map (kind of "bootstrapping")
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
48 for (int i = 0; i < OCT_PQ_NUM_CONVERTERS; i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
49 name_conv_map[conv_ptrs[i]->name.c_str ()] = conv_ptrs[i];
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 if (octave_pq_get_postgres_oid () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
52 octave_pq_fill_base_types () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
53 octave_pq_get_composite_types () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
54 octave_pq_get_enum_types ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
55 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
56 PQfinish (conn);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
57
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
58 conn = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
59
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
60 error ("could not read types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
61 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
62 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
63 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
64
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
65 octave_pq_connection::~octave_pq_connection (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
66 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
67 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
68 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
69 PQfinish (conn);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
70
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
71 octave_pq_delete_non_constant_types ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
72 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
73 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
74
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
75 void octave_pq_connection::octave_pq_close (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
76 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
77 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
78 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
79 PQfinish (conn);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
80
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
81 octave_pq_delete_non_constant_types ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
82
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
83 conn = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
84 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
85 else
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
86 error ("PGconn object not open");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
87 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
88
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
89 void octave_pq_connection::octave_pq_delete_non_constant_types (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
90 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
91 // In the first map, allocated types are usually referenced twice
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
92 // (by oid and aoid). Yet we need no refcount as long as we go
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
93 // through the name map as the last, since there (the same) types
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
94 // are only referenced once.
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
95
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
96 std::vector<oct_pq_conv_map_t::iterator> t_it_v;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
97
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
98 for (oct_pq_conv_map_t::iterator it = conv_map.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
99 it != conv_map.end ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
100 it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
101 if (it->second->is_not_constant)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
102 t_it_v.push_back (it);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
103
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
104 for (std::vector<oct_pq_conv_map_t::iterator>::iterator it = t_it_v.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
105 it != t_it_v.end (); it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
106 conv_map.erase (*it);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
107
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
108 std::vector<oct_pq_name_conv_map_t::iterator> t_name_it_v;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
109
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
110 for (oct_pq_name_conv_map_t::iterator it = name_conv_map.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
111 it != name_conv_map.end ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
112 it++)
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 oct_pq_conv_t *conv = it->second;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
115
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
116 if (conv->is_not_constant)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
117 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
118 t_name_it_v.push_back (it);
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 delete conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
121 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
122 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
123
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
124 for (std::vector<oct_pq_name_conv_map_t::iterator>::iterator it =
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
125 t_name_it_v.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
126 it != t_name_it_v.end (); it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
127 name_conv_map.erase (*it);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
128 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
129
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
130 int octave_pq_connection::octave_pq_get_postgres_oid (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
131 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
132 Cell p, pt, rt (1, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
133
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
134 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
135
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
136 std::string cmd ("select oid from pg_roles where rolname = 'postgres';"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
137 caller ("octave_pq_get_postgres_oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
138
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
139 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
140 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
141 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
142 error ("could not read pg_roles");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
143 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
144 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
145
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
146 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
147 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
148 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
149
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
150 postgres = res.scalar_map_value ().contents ("data").cell_value ()(0).
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
151 int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
152 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
153 return 1;
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 return 0;
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
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
158 int octave_pq_connection::octave_pq_fill_base_types (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
159 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
160 // assert postgres oid had been determined
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
161 if (! postgres.int_value ()) return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
162
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
163 Cell p (1, 1), pt (1, 1), rt (3, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
164 p(0) = postgres;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
165 pt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
166 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
167 rt(1) = octave_value ("name");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
168 rt(2) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
169
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
170 std::string cmd ("select oid, typname, typarray from pg_type where (typowner = $1 AND typtype = 'b' AND typarray != 0) OR typname = 'record';"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
171 caller ("octave_pq_fill_base_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
172
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
173 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
174 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
175 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
176 error ("octave_pq_fill_base_types: could not read pg_type");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
177 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
178 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
179
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
180 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
181 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
182 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
183
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
184 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
185 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
186 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
187 error
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
188 ("octave_pq_fill_base_types: could not convert result data to cell");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
189 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
190 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
191
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
192 // make a temporary map of server base types (cell row numbers) for searching
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
193 typedef std::map<std::string, int, bool (*) (const std::string &,
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
194 const std::string &)>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
195 bt_map_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
196 bt_map_t bt_map (&map_string_cmp);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
197 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
198 bt_map[tpls(i, 1).string_value ()] = i;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
199 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
200 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
201 error ("octave_pq_fill_base_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
202 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
203 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
204
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
205 for (int i = 0; i < OCT_PQ_NUM_CONVERTERS; i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
206 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
207 bt_map_t::iterator bt_it;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
208 if ((bt_it = bt_map.find (conv_ptrs[i]->name)) == bt_map.end ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
209 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
210 error ("octave_pq_fill_base_types: type %s not found in pg_types",
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
211 conv_ptrs[i]->name.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
212 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
213 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
214 // fill in oid and aoid into static records of converters
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
215 conv_ptrs[i]->oid = tpls(bt_it->second, 0).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
216 conv_ptrs[i]->aoid = tpls(bt_it->second, 2).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
217
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
218 // fill in map of converters over oid with oid and, if not zero,
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
219 // also with aoid
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
220 conv_map[conv_ptrs[i]->oid] = conv_ptrs[i];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
221 if (conv_ptrs[i]->aoid != 0)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
222 conv_map[conv_ptrs[i]->aoid] = conv_ptrs[i];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
223 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
224 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
225 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
226 error ("octave_pq_fill_base_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
227 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
228 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
229
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
230 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
231 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
232
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
233 int octave_pq_connection::octave_pq_get_composite_types (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
234 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
235 Cell p, pt, rt (4, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
236 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
237 rt(1) = octave_value ("name");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
238 rt(2) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
239 rt(3) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
240
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
241 std::string cmd ("select oid, typname, typarray, typrelid from pg_type where typtype = 'c';"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
242 caller ("octave_pq_get_composite_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
243
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
244 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
245 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
246 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
247 error ("octave_pq_get_composite_types: could not read pg_type");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
248 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
249 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
250
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
251 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
252 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
253 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
254
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
255 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
256 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
257 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
258 error ("octave_pq_get_composite_types: could not convert result data to cell");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
259 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
260 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
261
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
262 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
263 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
264 Oid oid = tpls(i, 0).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
265 Oid aoid = tpls(i, 2).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
266 Oid relid = tpls(i, 3).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
267 std::string name = tpls(i, 1).string_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
268 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
269 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
270 error ("octave_pq_get_composite_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
271 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
272 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
273
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
274 // must be allocated and filled before creating the name map
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
275 // entry, to get a remaining location for the c-string used as
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
276 // key
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
277 oct_pq_conv_t *t_conv = new oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
278 t_conv->oid = oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
279 t_conv->aoid = aoid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
280 t_conv->relid = relid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
281 t_conv->is_composite = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
282 t_conv->is_enum = false;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
283 t_conv->is_not_constant = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
284 t_conv->name = name;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
285 t_conv->to_octave_str = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
286 t_conv->to_octave_bin = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
287 t_conv->from_octave_str = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
288 t_conv->from_octave_bin = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
289
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
290 oct_pq_conv_t *&by_oid = conv_map[oid],
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
291 *&by_name = name_conv_map[t_conv->name.c_str ()];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
292 if (by_oid || by_name)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
293 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
294 error ("octave_pq_get_composite_types: internal error, key already in typemap (by_oid: %u/%li, by name: %s/%li)",
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
295 oid, by_oid, t_conv->name.c_str (), by_name);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
296 if (! by_oid) conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
297 if (! by_name) name_conv_map.erase (t_conv->name.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
298 delete t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
299 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
300 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
301
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
302 by_oid = by_name = t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
303
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
304 if (aoid)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
305 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
306 oct_pq_conv_t *&by_aoid = conv_map[aoid];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
307 if (by_aoid)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
308 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
309 error ("octave_pq_get_composite_types: internal error, aoid key %u already in typemap", aoid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
310 conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
311 name_conv_map.erase (t_conv->name.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
312 delete t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
313 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
314 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
315
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
316 by_aoid = by_oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
317 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
318
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
319 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
320
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
321 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
322 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
323
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
324 int octave_pq_connection::octave_pq_get_enum_types (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
325 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
326 Cell p, pt, rt (3, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
327 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
328 rt(1) = octave_value ("name");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
329 rt(2) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
330
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
331 std::string cmd ("select oid, typname, typarray from pg_type where typtype = 'e';"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
332 caller ("octave_pq_get_enum_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
333
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
334 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
335 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
336 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
337 error ("octave_pq_get_enum_types: could not read pg_type");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
338 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
339 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
340
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
341 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
342 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
343 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
344
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
345 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
346 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
347 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
348 error ("octave_pq_get_enum_types: could not convert result data to cell");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
349 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
350 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
351
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
352 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
353 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
354 Oid oid = tpls(i, 0).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
355 Oid aoid = tpls(i, 2).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
356 std::string name = tpls(i, 1).string_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
357 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
358 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
359 error ("octave_pq_get_enum_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
360 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
361 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
362
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
363 // must be allocated and filled before creating the name map
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
364 // entry, to get a remaining location for the c-string used as
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
365 // key
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
366 oct_pq_conv_t *t_conv = new oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
367 t_conv->oid = oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
368 t_conv->aoid = aoid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
369 t_conv->relid = 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
370 t_conv->is_composite = false;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
371 t_conv->is_enum = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
372 t_conv->is_not_constant = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
373 t_conv->name = name;
11410
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
374 t_conv->to_octave_str = &to_octave_str_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
375 t_conv->to_octave_bin = &to_octave_bin_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
376 t_conv->from_octave_str = &from_octave_str_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
377 t_conv->from_octave_bin = &from_octave_bin_text;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
378
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
379 // we trust there is always an array type in the table
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
380 oct_pq_conv_t *&by_oid = conv_map[oid], *&by_aoid = conv_map[aoid],
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
381 *&by_name = name_conv_map[t_conv->name.c_str ()];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
382 if (by_oid || by_aoid || by_name)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
383 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
384 error ("octave_pq_get_enum_types: internal error, key already in typemap");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
385 if (! by_oid) conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
386 if (! by_aoid) conv_map.erase (aoid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
387 if (! by_name) name_conv_map.erase (t_conv->name.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
388 delete t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
389 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
390 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
391
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
392 by_oid = by_aoid = by_name = t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
393
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
394 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
395
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
396 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
397 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
398
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
399 int octave_pq_connection::octave_pq_refresh_types (void)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
400 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
401 octave_pq_delete_non_constant_types ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
402
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
403 if (octave_pq_get_composite_types () || octave_pq_get_enum_types ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
404 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
405 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
406 PQfinish (conn);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
407 conn = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
408 error ("octave_pq_refresh_types: could not read types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
409 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
410 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
411 else
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
412 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
413 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
414
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
415 int octave_pq_connection::octave_pq_get_cols (Oid relid, std::vector<Oid> &oids)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
416 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
417 // printf ("octave_pq_get_cols(relid %u): ", relid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
418
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
419 Cell p (1, 1), pt (1, 1), rt (2, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
420 p(0) = octave_value (octave_uint32 (relid));
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
421 pt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
422 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
423 rt(1) = octave_value ("int2");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
424
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
425 std::string cmd ("select atttypid, attnum from pg_attribute where attrelid = $1;"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
426 caller ("octave_pq_get_cols");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
427
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
428 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
429 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
430 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
431 error ("%s: could not read pg_type", caller.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
432 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
433 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
434
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
435 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
436 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
437 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
438
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
439 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
440 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
441 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
442 error
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
443 ("%s: could not convert result data to cell", caller.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
444 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
445 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
446
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
447 octave_idx_type r = tpls.rows ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
448
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
449 // printf ("%i colums, ", r);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
450
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
451 oids.resize (r);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
452
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
453 // "column" number (attnum) is one-based, so subtract 1
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
454 for (octave_idx_type i = 0; i < r; i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
455 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
456 octave_idx_type pos = tpls(i, 1).idx_type_value () - 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
457
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
458 // printf ("%u at pos %i, ", tpls(i, 0).uint_value (), pos);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
459
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
460 if (pos >= r)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
461 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
462 error ("%s: internal error (?system catalog erroneous?): column position %i greater than ncols %i for relid %u",
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
463 caller.c_str (), pos, r, relid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
464 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
465 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
466
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
467 oids[pos] = tpls(i, 0).uint_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
468 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
469 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
470 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
471 error ("%s: could not convert result data", caller.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
472 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
473 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
474
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
475 // printf ("\n");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
476
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
477 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
478 }