GnuCash c935c2f+
Loading...
Searching...
No Matches
Public Member Functions
GncDbiProviderImpl< T > Class Template Reference
Inheritance diagram for GncDbiProviderImpl< T >:
GncDbiProvider

Public Member Functions

StrVec get_table_list (dbi_conn conn, const std::string &table)
 
void append_col_def (std::string &ddl, const GncSqlColumnInfo &info)
 
StrVec get_index_list (dbi_conn conn)
 
void drop_index (dbi_conn conn, const std::string &index)
 
void append_col_def (std::string &ddl, const GncSqlColumnInfo &info)
 
void append_col_def (std::string &ddl, const GncSqlColumnInfo &info)
 
void append_col_def (std::string &ddl, const GncSqlColumnInfo &info)
 
StrVec get_table_list (dbi_conn conn, const std::string &table)
 
StrVec get_table_list (dbi_conn conn, const std::string &table)
 
StrVec get_table_list (dbi_conn conn, const std::string &table)
 
StrVec get_index_list (dbi_conn conn)
 
StrVec get_index_list (dbi_conn conn)
 
StrVec get_index_list (dbi_conn conn)
 
void drop_index (dbi_conn conn, const std::string &index)
 

Detailed Description

template<DbType T>
class GncDbiProviderImpl< T >

Definition at line 40 of file gnc-dbiproviderimpl.hpp.

Member Function Documentation

◆ append_col_def() [1/4]

template<DbType T>
void GncDbiProviderImpl< T >::append_col_def ( std::string &  ddl,
const GncSqlColumnInfo info 
)
virtual

Implements GncDbiProvider.

◆ append_col_def() [2/4]

void GncDbiProviderImpl< DbType::DBI_SQLITE >::append_col_def ( std::string &  ddl,
const GncSqlColumnInfo info 
)
virtual

Implements GncDbiProvider.

Definition at line 56 of file gnc-dbiproviderimpl.hpp.

58{
59 const char* type_name = nullptr;
60
61 if (info.m_type == BCT_INT)
62 {
63 type_name = "integer";
64 }
65 else if (info.m_type == BCT_INT64)
66 {
67 type_name = "bigint";
68 }
69 else if (info.m_type == BCT_DOUBLE)
70 {
71 type_name = "float8";
72 }
73 else if (info.m_type == BCT_STRING || info.m_type == BCT_DATE
74 || info.m_type == BCT_DATETIME)
75 {
76 type_name = "text";
77 }
78 else
79 {
80 PERR ("Unknown column type: %d\n", info.m_type);
81 type_name = "";
82 }
83 ddl += (info.m_name + " " + type_name);
84 if (info.m_size != 0)
85 {
86 ddl += "(" + std::to_string(info.m_size) + ")";
87 }
88 if (info.m_primary_key)
89 {
90 ddl += " PRIMARY KEY";
91 }
92 if (info.m_autoinc)
93 {
94 ddl += " AUTOINCREMENT";
95 }
96 if (info.m_not_null)
97 {
98 ddl += " NOT NULL";
99 }
100}
#define PERR(format, args...)
Log a serious error.
Definition qoflog.h:244

◆ append_col_def() [3/4]

void GncDbiProviderImpl< DbType::DBI_MYSQL >::append_col_def ( std::string &  ddl,
const GncSqlColumnInfo info 
)
virtual

Implements GncDbiProvider.

Definition at line 104 of file gnc-dbiproviderimpl.hpp.

106{
107 const char* type_name = nullptr;
108
109 if (info.m_type == BCT_INT)
110 {
111 type_name = "integer";
112 }
113 else if (info.m_type == BCT_INT64)
114 {
115 type_name = "bigint";
116 }
117 else if (info.m_type == BCT_DOUBLE)
118 {
119 type_name = "double";
120 }
121 else if (info.m_type == BCT_STRING)
122 {
123 type_name = "varchar";
124 }
125 else if (info.m_type == BCT_DATE)
126 {
127 type_name = "date";
128 }
129 else if (info.m_type == BCT_DATETIME)
130 {
131 type_name = "DATETIME NULL DEFAULT '1970-01-01 00:00:00'";
132 }
133 else
134 {
135 PERR ("Unknown column type: %d\n", info.m_type);
136 type_name = "";
137 }
138 ddl += info.m_name + " " + type_name;
139 if (info.m_size != 0 && info.m_type == BCT_STRING)
140 {
141 ddl += "(" + std::to_string(info.m_size) + ")";
142 }
143 if (info.m_unicode)
144 {
145 ddl += " CHARACTER SET utf8";
146 }
147 if (info.m_primary_key)
148 {
149 ddl += " PRIMARY KEY";
150 }
151 if (info.m_autoinc)
152 {
153 ddl += " AUTO_INCREMENT";
154 }
155 if (info.m_not_null)
156 {
157 ddl += " NOT NULL";
158 }
159}

◆ append_col_def() [4/4]

void GncDbiProviderImpl< DbType::DBI_PGSQL >::append_col_def ( std::string &  ddl,
const GncSqlColumnInfo info 
)
virtual

Implements GncDbiProvider.

Definition at line 163 of file gnc-dbiproviderimpl.hpp.

165{
166 const char* type_name = nullptr;
167
168 if (info.m_type == BCT_INT)
169 {
170 if (info.m_autoinc)
171 {
172 type_name = "serial";
173 }
174 else
175 {
176 type_name = "integer";
177 }
178 }
179 else if (info.m_type == BCT_INT64)
180 {
181 type_name = "int8";
182 }
183 else if (info.m_type == BCT_DOUBLE)
184
185 {
186 type_name = "double precision";
187 }
188 else if (info.m_type == BCT_STRING)
189 {
190 type_name = "varchar";
191 }
192 else if (info.m_type == BCT_DATE)
193 {
194 type_name = "date";
195 }
196 else if (info.m_type == BCT_DATETIME)
197 {
198 type_name = "timestamp without time zone";
199 }
200 else
201 {
202 PERR ("Unknown column type: %d\n", info.m_type);
203 type_name = "";
204 }
205 ddl += info.m_name + " " + type_name;
206 if (info.m_size != 0 && info.m_type == BCT_STRING)
207 {
208 ddl += "(" + std::to_string(info.m_size) + ")";
209 }
210 if (info.m_primary_key)
211 {
212 ddl += " PRIMARY KEY";
213 }
214 if (info.m_not_null)
215 {
216 ddl += " NOT NULL";
217 }
218}

◆ drop_index() [1/2]

template<DbType P>
void GncDbiProviderImpl< P >::drop_index ( dbi_conn  conn,
const std::string &  index 
)
virtual

Implements GncDbiProvider.

Definition at line 363 of file gnc-dbiproviderimpl.hpp.

364{
365 dbi_result result = dbi_conn_queryf (conn, "DROP INDEX %s", index.c_str());
366 if (result)
367 dbi_result_free (result);
368}

◆ drop_index() [2/2]

void GncDbiProviderImpl< DbType::DBI_MYSQL >::drop_index ( dbi_conn  conn,
const std::string &  index 
)
virtual

Implements GncDbiProvider.

Definition at line 371 of file gnc-dbiproviderimpl.hpp.

372{
373
374 auto sep = index.find(' ', 0);
375 if (index.find(' ', sep + 1) != std::string::npos)
376 {
377 PWARN("Drop index error: invalid MySQL index format (<index> <table>): %s",
378 index.c_str());
379 return;
380 }
381
382 auto result = dbi_conn_queryf (conn, "DROP INDEX %s ON %s",
383 index.substr(0, sep).c_str(),
384 index.substr(sep + 1).c_str());
385 if (result)
386 dbi_result_free (result);
387}
#define PWARN(format, args...)
Log a warning.
Definition qoflog.h:250

◆ get_index_list() [1/4]

template<DbType T>
StrVec GncDbiProviderImpl< T >::get_index_list ( dbi_conn  conn)
virtual

Implements GncDbiProvider.

◆ get_index_list() [2/4]

StrVec GncDbiProviderImpl< DbType::DBI_SQLITE >::get_index_list ( dbi_conn  conn)
virtual

Implements GncDbiProvider.

Definition at line 291 of file gnc-dbiproviderimpl.hpp.

292{
293 StrVec retval;
294 const char* errmsg;
295 dbi_result result = dbi_conn_query (conn,
296 "SELECT name FROM sqlite_master WHERE type = 'index' AND name NOT LIKE 'sqlite_autoindex%'");
297 if (dbi_conn_error (conn, &errmsg) != DBI_ERROR_NONE)
298 {
299 PWARN ("Index Table Retrieval Error: %s\n", errmsg);
300 return retval;
301 }
302 while (dbi_result_next_row (result) != 0)
303 {
304 std::string index_name {dbi_result_get_string_idx (result, 1)};
305 retval.push_back(index_name);
306 }
307 dbi_result_free (result);
308 return retval;
309}

◆ get_index_list() [3/4]

StrVec GncDbiProviderImpl< DbType::DBI_MYSQL >::get_index_list ( dbi_conn  conn)
virtual

Implements GncDbiProvider.

Definition at line 312 of file gnc-dbiproviderimpl.hpp.

313{
314 StrVec retval;
315 const char* errmsg;
316 auto tables = get_table_list(conn, "");
317 for (auto table_name : tables)
318 {
319 auto result = dbi_conn_queryf (conn,
320 "SHOW INDEXES IN %s WHERE Key_name != 'PRIMARY'",
321 table_name.c_str());
322 if (dbi_conn_error (conn, &errmsg) != DBI_ERROR_NONE)
323 {
324 PWARN ("Index Table Retrieval Error: %s on table %s\n",
325 errmsg, table_name.c_str());
326 continue;
327 }
328
329 while (dbi_result_next_row (result) != 0)
330 {
331 std::string index_name {dbi_result_get_string_idx (result, 3)};
332 retval.push_back(index_name + " " + table_name);
333 }
334 dbi_result_free (result);
335 }
336
337 return retval;
338}

◆ get_index_list() [4/4]

StrVec GncDbiProviderImpl< DbType::DBI_PGSQL >::get_index_list ( dbi_conn  conn)
virtual

Implements GncDbiProvider.

Definition at line 341 of file gnc-dbiproviderimpl.hpp.

342{
343 StrVec retval;
344 const char* errmsg;
345 PINFO ("Retrieving postgres index list\n");
346 auto result = dbi_conn_query (conn,
347 "SELECT relname FROM pg_class AS a INNER JOIN pg_index AS b ON (b.indexrelid = a.oid) INNER JOIN pg_namespace AS c ON (a.relnamespace = c.oid) WHERE reltype = '0' AND indisprimary = 'f' AND nspname = 'public'");
348 if (dbi_conn_error (conn, &errmsg) != DBI_ERROR_NONE)
349 {
350 PWARN("Index Table Retrieval Error: %s\n", errmsg);
351 return retval;
352 }
353 while (dbi_result_next_row (result) != 0)
354 {
355 std::string index_name {dbi_result_get_string_idx (result, 1)};
356 retval.push_back(index_name);
357 }
358 dbi_result_free (result);
359 return retval;
360}
#define PINFO(format, args...)
Print an informational note.
Definition qoflog.h:256

◆ get_table_list() [1/4]

template<DbType T>
StrVec GncDbiProviderImpl< T >::get_table_list ( dbi_conn  conn,
const std::string &  table 
)
virtual

Implements GncDbiProvider.

◆ get_table_list() [2/4]

StrVec GncDbiProviderImpl< DbType::DBI_SQLITE >::get_table_list ( dbi_conn  conn,
const std::string &  table 
)
virtual

Implements GncDbiProvider.

Definition at line 237 of file gnc-dbiproviderimpl.hpp.

239{
240 /* Return the list, but remove the tables that sqlite3 adds for
241 * its own use. */
242 std::string dbname (dbi_conn_get_option (conn, "dbname"));
243 auto list = conn_get_table_list (conn, dbname, table);
244 auto end = std::remove(list.begin(), list.end(), "sqlite_sequence");
245 list.erase(end, list.end());
246 return list;
247}

◆ get_table_list() [3/4]

StrVec GncDbiProviderImpl< DbType::DBI_MYSQL >::get_table_list ( dbi_conn  conn,
const std::string &  table 
)
virtual

Implements GncDbiProvider.

Definition at line 250 of file gnc-dbiproviderimpl.hpp.

252{
253 std::string dbname (dbi_conn_get_option (conn, "dbname"));
254 dbname.insert((std::string::size_type)0, 1, '`');
255 dbname += '`';
256 return conn_get_table_list (conn, dbname, table);
257}

◆ get_table_list() [4/4]

StrVec GncDbiProviderImpl< DbType::DBI_PGSQL >::get_table_list ( dbi_conn  conn,
const std::string &  table 
)
virtual

Implements GncDbiProvider.

Definition at line 260 of file gnc-dbiproviderimpl.hpp.

262{
263 const char* query_no_regex = "SELECT relname FROM pg_class WHERE relname"
264 "!~ '^(pg|sql)_' AND relkind = 'r' ORDER BY relname";
265 std::string query_with_regex = "SELECT relname FROM pg_class WHERE relname LIKE '";
266 query_with_regex += table + "' AND relkind = 'r' ORDER BY relname";
267 dbi_result result;
268 if (table.empty())
269 result = dbi_conn_query (conn, query_no_regex);
270 else
271 result = dbi_conn_query (conn, query_with_regex.c_str());
272
273 StrVec list;
274 const char* errmsg;
275 if (dbi_conn_error (conn, &errmsg) != DBI_ERROR_NONE)
276 {
277 PWARN ("Table List Retrieval Error: %s\n", errmsg);
278 return list;
279 }
280
281 while (dbi_result_next_row (result) != 0)
282 {
283 std::string index_name {dbi_result_get_string_idx (result, 1)};
284 list.push_back(index_name);
285 }
286 dbi_result_free (result);
287 return list;
288}

The documentation for this class was generated from the following file: