annotate main/database/src/pq_connection.cc @ 12612:2257648e8ce1 octave-forge

avoid using const_cast, new release 2.3.2 * pq_connection.h/cc: octave_pq_connection now contains pointer to object of new class octave_pq_connection_rep, containing the pq-specific members formerly in octave_pq_connection. * pq_exec.cc, pq_close.cc, pq_update_types.cc, pq_conninfo.cc, pq_lo.cc: Remove const_cast, use octave_pq_connection_rep object instead. * __pq_connect__.cc, converters.h/cc, converters_arr_comp.cc, command.h/cc: Use octave_pq_connection_rep instead of octave_pq_connection.
author i7tiol
date Tue, 05 May 2015 07:31:33 +0000
parents 73d73ef1c0bf
children 1af86934c14e
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
11460
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
25 std::string &pq_basetype_prefix (void)
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
26 {
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
27 static std::string prefix ("pg_catalog.");
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
28 return prefix;
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
29 }
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
30
9ef769abf53d Fix segfault reported by Richard <richard@mail.sheugh.com>, due to undefined order of initialization.
i7tiol
parents: 11429
diff changeset
31 const int pq_bpl = pq_basetype_prefix ().size ();
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
32
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
33 static bool map_str_cmp (const char *c1, const char *c2)
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
34 {
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
35 if (strcmp (c1, c2) < 0)
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
36 return true;
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
37 else
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
38 return false;
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
39 }
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
40
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
41 static bool map_string_cmp (const std::string &s1, const std::string &s2)
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
42 {
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
43 if (s1.compare (s2) < 0)
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
44 return true;
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
45 else
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
46 return false;
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
47 }
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
48
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
49 octave_pq_connection_rep::octave_pq_connection_rep (std::string &arg)
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
50 : conv_map (), name_conv_map (&map_str_cmp), conn (NULL), postgres (0)
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
51 {
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
52 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
53 conn = PQconnectdb (arg.c_str ());
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
54 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
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 if (! conn || PQstatus (conn) == CONNECTION_BAD)
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 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
59 {
11550
a7e6bec0e9bf Retrieve error message when failing to connect.
i7tiol
parents: 11480
diff changeset
60 error ("%s", PQerrorMessage (conn));
a7e6bec0e9bf Retrieve error message when failing to connect.
i7tiol
parents: 11480
diff changeset
61
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
62 PGconn *t_conn = conn;
11394
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 conn = NULL;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
65
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
66 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
67 PQfinish (t_conn);
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
68 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
69 }
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 error ("PQ connection attempt failed");
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 else
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 // init name converter-map (kind of "bootstrapping")
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
76 for (int i = 0; i < OCT_PQ_NUM_CONVERTERS; i++)
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
77 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
78 name_conv_map[conv_ptrs[i]->name.c_str ()] = conv_ptrs[i];
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
79
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
80 // unqualified name, may be replaced later with user-defined type
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
81 name_conv_map[conv_ptrs[i]->name.c_str () + pq_bpl] = conv_ptrs[i];
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
82 }
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
83
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
84 if (octave_pq_get_postgres_oid () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
85 octave_pq_fill_base_types () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
86 octave_pq_get_composite_types () ||
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
87 octave_pq_get_enum_types ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
88 {
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
89 PGconn *t_conn = conn;
11394
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 conn = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
92
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
93 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
94 PQfinish (t_conn);
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
95 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
96
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
97 error ("could not read types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
98 }
11659
7575dc1c0b06 Obtain connection information 'integer_datetimes'.
i7tiol
parents: 11645
diff changeset
99 else
11698
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
100 {
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
101 if (strcmp (PQparameterStatus (conn, "integer_datetimes"), "on"))
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
102 integer_datetimes = false;
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
103 else
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
104 integer_datetimes = true;
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
105 }
11394
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 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
108
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
109 octave_pq_connection_rep::~octave_pq_connection_rep (void)
11394
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 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
112 {
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
113 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
114 PQfinish (conn);
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
115 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
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 octave_pq_delete_non_constant_types ();
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
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
121 void octave_pq_connection_rep::octave_pq_close (void)
11394
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 if (conn)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
124 {
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
125 PGconn *t_conn = conn;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
126
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
127 conn = NULL;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
128
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
129 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
130 PQfinish (t_conn);
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
131 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
132
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
133 octave_pq_delete_non_constant_types ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
134 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
135 else
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
136 error ("PGconn object not open");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
137 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
138
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
139 void octave_pq_connection_rep::octave_pq_delete_non_constant_types (void)
11394
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 // In the first map, allocated types are usually referenced twice
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
142 // (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
143 // 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
144 // are only referenced once.
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 std::vector<oct_pq_conv_map_t::iterator> t_it_v;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
147
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
148 for (oct_pq_conv_map_t::iterator it = conv_map.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
149 it != conv_map.end ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
150 it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
151 if (it->second->is_not_constant)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
152 t_it_v.push_back (it);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
153
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
154 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
155 it != t_it_v.end (); it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
156 conv_map.erase (*it);
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 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
159
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
160 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
161 it != name_conv_map.end ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
162 it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
163 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
164 oct_pq_conv_t *conv = it->second;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
165
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
166 if (conv->is_not_constant)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
167 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
168 t_name_it_v.push_back (it);
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 delete conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
171 }
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
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
174 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
175 t_name_it_v.begin ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
176 it != t_name_it_v.end (); it++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
177 name_conv_map.erase (*it);
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
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
180 int octave_pq_connection_rep::octave_pq_get_postgres_oid (void)
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
181 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
182 Cell p, pt, rt (1, 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 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
185
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
186 std::string cmd ("select oid from pg_roles where rolname = 'postgres';"),
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
187 caller ("octave_pq_get_postgres_oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
188
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
189 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
190 if (! c.good ())
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 error ("could not read pg_roles");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
193 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
194 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
195
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
196 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
197 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
198 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
199
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
200 postgres = res.scalar_map_value ().contents ("data").cell_value ()(0).
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
201 int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
202 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
203 return 1;
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 return 0;
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
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
208 int octave_pq_connection_rep::octave_pq_fill_base_types (void)
11394
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 // assert postgres oid had been determined
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
211 if (! postgres.int_value ()) return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
212
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
213 Cell p (1, 1), pt (1, 1), rt (3, 1);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
214 p(0) = postgres;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
215 pt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
216 rt(0) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
217 rt(1) = octave_value ("name");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
218 rt(2) = octave_value ("oid");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
219
11698
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
220 std::string cmd ("select oid, typname, typarray from pg_type where (typowner = $1 AND typtype = 'b' AND typarray != 0) OR typname = 'record' OR typname = 'unknown';"),
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
221 caller ("octave_pq_fill_base_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
222
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
223 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
224 if (! c.good ())
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 pg_type");
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 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
231 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
232 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
233
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
234 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
235 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
236 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
237 error
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
238 ("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
239 return 1;
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
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
242 // 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
243 typedef std::map<std::string, int, bool (*) (const std::string &,
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
244 const std::string &)>
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
245 bt_map_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
246 bt_map_t bt_map (&map_string_cmp);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
247 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
248 bt_map[tpls(i, 1).string_value ()] = i;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
249 if (error_state)
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 error ("octave_pq_fill_base_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
252 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
253 }
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 for (int i = 0; i < OCT_PQ_NUM_CONVERTERS; i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
256 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
257 bt_map_t::iterator bt_it;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
258 if ((bt_it = bt_map.find (conv_ptrs[i]->name.c_str () + pq_bpl)) ==
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
259 bt_map.end ())
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
260 {
11698
b3cbebad8a26 Fix segfault after internal error. Add converter for type 'unknown'.
i7tiol
parents: 11659
diff changeset
261 error ("octave_pq_fill_base_types: type %s not found in pg_type",
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
262 conv_ptrs[i]->name.c_str () + pq_bpl);
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
263 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
264 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
265 // fill in oid and aoid into static records of converters
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
266 conv_ptrs[i]->oid = tpls(bt_it->second, 0).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
267 conv_ptrs[i]->aoid = tpls(bt_it->second, 2).int_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
268
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
269 // 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
270 // also with aoid
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
271 conv_map[conv_ptrs[i]->oid] = conv_ptrs[i];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
272 if (conv_ptrs[i]->aoid != 0)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
273 conv_map[conv_ptrs[i]->aoid] = conv_ptrs[i];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
274 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
275 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
276 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
277 error ("octave_pq_fill_base_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
278 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
279 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
280
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
281 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
282 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
283
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
284 int octave_pq_connection_rep::octave_pq_get_composite_types (void)
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
285 {
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
286 Cell p, pt, rt;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
287
12181
73d73ef1c0bf Fix error due to typo in query in pq_connection.cc (bug #40707).
i7tiol
parents: 11698
diff changeset
288 std::string cmd ("select pg_type.oid, pg_type.typname, pg_type.typarray, pg_namespace.nspname, pg_type_is_visible(pg_type.oid) as visible, array_agg(pg_attribute.atttypid), array_agg(pg_attribute.attnum) from (pg_type join pg_namespace on pg_type.typnamespace = pg_namespace.oid) join pg_attribute on pg_type.typrelid = pg_attribute.attrelid where pg_type.typtype = 'c' and pg_attribute.attnum > 0 group by pg_type.oid, pg_type.typname, pg_type.typarray, pg_type.typrelid, pg_namespace.nspname, visible;"),
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
289 caller ("octave_pq_get_composite_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
290
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
291 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
292 if (! c.good ())
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: could not read pg_type");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
295 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
296 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
297
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
298 octave_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
299 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
300 return 1;
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 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
303 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
304 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
305 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
306 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
307 }
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 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
310 {
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
311 Oid oid = tpls(i, 0).uint_value ();
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
312 Oid aoid = tpls(i, 2).uint_value ();
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
313 std::string name = tpls(i, 1).string_value ();
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
314 std::string nspace = tpls(i, 3).string_value ();
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
315 bool visible = tpls(i, 4).bool_value ();
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
316 Cell r_el_oids =
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
317 tpls(i, 5).scalar_map_value ().contents ("data").cell_value ();
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
318 Cell r_el_pos =
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
319 tpls(i, 6).scalar_map_value ().contents ("data").cell_value ();
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
320 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
321 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
322 error ("octave_pq_get_composite_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
323 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
324 }
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
325 octave_idx_type nel = r_el_oids.numel ();
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
326 if (nel != r_el_pos.numel ())
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
327 {
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
328 error ("octave_pq_get_composite_types: internal error, inconsistent content of pg_attribute?");
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
329
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
330 return 1;
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
331 }
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
332 oct_pq_el_oids_t el_oids;
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
333 el_oids.resize (nel);
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
334 oct_pq_conv_cache_t conv_cache;
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
335 conv_cache.resize (nel);
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
336 for (octave_idx_type i = 0; i < nel; i++)
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
337 {
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
338 // "column" number (attnum) is one-based, so subtract 1
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
339 octave_idx_type pos = r_el_pos(i).idx_type_value () - 1;
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
340 if (! error_state)
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
341 {
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
342 if (pos >= nel)
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
343 {
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
344 error ("octave_pq_get_composite_types: internal error (?system catalog erroneous?): column position %i greater than ncols %i for type %s, namespace %s",
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
345 pos, nel, name.c_str (), nspace.c_str ());
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
346 return 1;
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
347 }
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
348
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
349 el_oids[pos] = r_el_oids(i).uint_value ();
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
350
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
351 conv_cache[pos] = NULL;
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
352 }
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
353 }
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
354 if (error_state)
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
355 {
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
356 error ("octave_pq_get_composite_types: could not fill in element oids.");
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
357
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
358 return 1;
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
359 }
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
360
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
361 // must be allocated and filled before creating the name map
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
362 // 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
363 // key
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
364 oct_pq_conv_t *t_conv = new oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
365 t_conv->oid = oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
366 t_conv->aoid = aoid;
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
367 t_conv->el_oids = el_oids;
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
368 t_conv->conv_cache = conv_cache;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
369 t_conv->is_composite = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
370 t_conv->is_enum = false;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
371 t_conv->is_not_constant = true;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
372 t_conv->name = nspace.append (".").append (name);
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
373 t_conv->to_octave_str = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
374 t_conv->to_octave_bin = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
375 t_conv->from_octave_str = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
376 t_conv->from_octave_bin = NULL;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
377
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
378 oct_pq_conv_t *&by_oid = conv_map[oid],
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
379 *&by_name = name_conv_map[t_conv->name.c_str ()];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
380 if (by_oid || by_name)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
381 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
382 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
383 oid, by_oid, t_conv->name.c_str (), by_name);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
384 if (! by_oid) conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
385 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
386 delete t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
387 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
388 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
389
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
390 by_oid = by_name = t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
391
11645
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
392 oct_pq_conv_t *t_conv_v = NULL; // silence inadequate warning by
bd5a8f1bdfb8 Clean out harmless warnings and one unnecessarily returned column.
i7tiol
parents: 11550
diff changeset
393 // initializing it here
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
394
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
395 if (visible)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
396 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
397 t_conv_v = new oct_pq_conv_t (*t_conv);
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
398
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
399 t_conv_v->el_oids = el_oids;
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
400
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
401 t_conv_v->conv_cache = conv_cache;
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
402
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
403 t_conv_v->name = name;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
404
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
405 name_conv_map[t_conv_v->name.c_str ()] = t_conv_v;;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
406 }
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
407
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
408 if (aoid)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
409 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
410 oct_pq_conv_t *&by_aoid = conv_map[aoid];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
411 if (by_aoid)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
412 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
413 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
414 conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
415 name_conv_map.erase (t_conv->name.c_str ());
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
416 delete t_conv;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
417 if (visible)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
418 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
419 name_conv_map.erase (t_conv_v->name.c_str ());
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
420 delete t_conv_v;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
421 }
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
422 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
423 }
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 by_aoid = by_oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
426 }
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 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
429
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
430 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
431 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
432
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
433 int octave_pq_connection_rep::octave_pq_get_enum_types (void)
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
434 {
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
435 Cell p, pt, rt;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
436
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
437 std::string cmd ("select pg_type.oid, pg_type.typname, pg_type.typarray, pg_namespace.nspname, pg_type_is_visible(pg_type.oid) from pg_type join pg_namespace on pg_type.typnamespace = pg_namespace.oid where pg_type.typtype = 'e';"),
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
438 caller ("octave_pq_get_enum_types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
439
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
440 command c (*this, cmd, p, pt, rt, caller);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
441 if (! c.good ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
442 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
443 error ("octave_pq_get_enum_types: could not read pg_type");
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_value res = c.process_single_result ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
448 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
449 return 1;
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 Cell tpls = res.scalar_map_value ().contents ("data").cell_value ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
452 if (error_state)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
453 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
454 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
455 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
456 }
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 for (int i = 0; i < tpls.rows (); i++)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
459 {
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
460 Oid oid = tpls(i, 0).uint_value ();
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
461 Oid aoid = tpls(i, 2).uint_value ();
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
462 std::string name = tpls(i, 1).string_value ();
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
463 std::string nspace = tpls(i, 3).string_value ();
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
464 bool visible = tpls(i, 4).bool_value ();
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
465 if (error_state)
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 error ("octave_pq_get_enum_types: could not read returned result");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
468 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
469 }
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 // must be allocated and filled before creating the name map
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
472 // 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
473 // key
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
474 oct_pq_conv_t *t_conv = new oct_pq_conv_t;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
475 t_conv->oid = oid;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
476 t_conv->aoid = aoid;
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
477 t_conv->el_oids = oct_pq_el_oids_t ();
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
478 t_conv->conv_cache = oct_pq_conv_cache_t ();
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
479 t_conv->is_composite = false;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
480 t_conv->is_enum = true;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
481 t_conv->is_not_constant = true;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
482 t_conv->name = nspace.append (".").append (name);
11410
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
483 t_conv->to_octave_str = &to_octave_str_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
484 t_conv->to_octave_bin = &to_octave_bin_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
485 t_conv->from_octave_str = &from_octave_str_text;
c20550232685 Conversion of enum types implemented.
i7tiol
parents: 11394
diff changeset
486 t_conv->from_octave_bin = &from_octave_bin_text;
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
487
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
488 // we trust there is always an array type in the table
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
489 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
490 *&by_name = name_conv_map[t_conv->name.c_str ()];
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
491 if (by_oid || by_aoid || by_name)
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
492 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
493 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
494 if (! by_oid) conv_map.erase (oid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
495 if (! by_aoid) conv_map.erase (aoid);
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
496 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
497 delete t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
498 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
499 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
500
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
501 by_oid = by_aoid = by_name = t_conv;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
502
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
503 if (visible)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
504 {
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
505 oct_pq_conv_t *t_conv_v = new oct_pq_conv_t (*t_conv);
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
506
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
507 t_conv_v->el_oids = 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
508
11480
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
509 t_conv_v->conv_cache = oct_pq_conv_cache_t ();
d14a23884d9c Cache map lookups of converters for composite type elements.
i7tiol
parents: 11474
diff changeset
510
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
511 t_conv_v->name = name;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
512
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
513 name_conv_map[t_conv_v->name.c_str ()] = t_conv_v;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
514 }
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
515 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
516
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
517 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
518 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
519
12612
2257648e8ce1 avoid using const_cast, new release 2.3.2
i7tiol
parents: 12181
diff changeset
520 int octave_pq_connection_rep::octave_pq_refresh_types (void)
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
521 {
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
522 octave_pq_delete_non_constant_types ();
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
523
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
524 // refresh unqualified base type names, may be replaced later with
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
525 // user-defined types
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
526 for (int i = 0; i < OCT_PQ_NUM_CONVERTERS; i++)
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
527 name_conv_map[conv_ptrs[i]->name.c_str () + pq_bpl] = conv_ptrs[i];
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
528
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
529 if (octave_pq_get_composite_types () || octave_pq_get_enum_types ())
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
530 {
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
531 PGconn *t_conn = conn;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
532
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
533 conn = NULL;
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
534
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
535 if (t_conn)
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
536 {
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
537 BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
11429
61ea672a060a Consider schemas in type specifications by name.
i7tiol
parents: 11422
diff changeset
538 PQfinish (t_conn);
11422
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
539 END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
540 }
b1f26b72b61a Large object import/export also from/to pipes.
i7tiol
parents: 11410
diff changeset
541
11394
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
542 error ("octave_pq_refresh_types: could not read types");
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
543 return 1;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
544 }
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
545 else
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
546 return 0;
9aee227e296c Populated new database package with initial postgresql interface.
i7tiol
parents:
diff changeset
547 }