17 #include <grass/dbmi.h>
18 #include <grass/glocale.h>
21 static int cmp(
const void *pa,
const void *pb)
59 const char *from_tblname,
const char *to_drvname,
60 const char *to_dbname,
const char *to_tblname,
61 const char *where,
const char *select,
const char *selcol,
62 int *ivals,
int nvals)
64 int col, ncols, sqltype, ctype, more, selcol_found;
67 dbHandle from_handle, to_handle;
68 dbString tblname, sql;
69 dbString value_string;
71 dbTable *table, *out_table;
76 dbDriver *from_driver, *to_driver;
79 G_debug(3,
"db_copy_table():\n from driver = %s, db = %s, table = %s\n"
80 " to driver = %s, db = %s, table = %s, where = %s, select = %s",
81 from_drvname, from_dbname, from_tblname, to_drvname, to_dbname,
82 to_tblname, where, select);
92 ivalues = (
int *)G_malloc(nvals *
sizeof(
int));
93 memcpy(ivalues, ivals, nvals *
sizeof(
int));
94 qsort((
void *)ivalues, nvals,
sizeof(
int), cmp);
99 if (from_driver ==
NULL) {
100 G_warning(_(
"Unable to start driver <%s>"), from_drvname);
105 G_warning(_(
"Unable to open database <%s> by driver <%s>"),
106 from_dbname, from_drvname);
112 if (strcmp(from_drvname, to_drvname) == 0
113 && strcmp(from_dbname, to_dbname) == 0) {
114 G_debug(3,
"Use the same driver");
115 to_driver = from_driver;
119 if (to_driver ==
NULL) {
120 G_warning(_(
"Unable to start driver <%s>"), to_drvname);
126 G_warning(_(
"Unable to open database <%s> by driver <%s>"),
127 to_dbname, to_drvname);
129 if (from_driver != to_driver) {
144 G_warning(_(
"Unable to get list tables in database <%s>"),
147 if (from_driver != to_driver)
153 for (i = 0; i < count; i++) {
156 if (strcmp(to_tblname, tblname) == 0) {
157 G_warning(_(
"Table <%s> already exists in database <%s>"),
158 to_tblname, to_dbname);
160 if (from_driver != to_driver)
199 G_warning(_(
"Unable to open select cursor: '%s'"),
202 if (from_driver != to_driver) {
207 G_debug(3,
"Select cursor opened");
211 G_debug(3,
"ncols = %d", ncols);
217 for (col = 0; col < ncols; col++) {
218 dbColumn *out_column;
230 if (ctype != DB_C_TYPE_INT)
247 if (selcol && !selcol_found)
251 G_warning(_(
"Unable to create table <%s>"),
254 if (from_driver != to_driver) {
276 G_warning(_(
"Unable to open select cursor: '%s'"),
279 if (from_driver != to_driver) {
284 G_debug(3,
"Select cursor opened");
288 G_debug(3,
"ncols = %d", ncols);
294 if (
db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
295 G_warning(_(
"Unable to fetch data from table <%s>"),
299 if (from_driver != to_driver) {
307 sprintf(buf,
"insert into %s values ( ", to_tblname);
310 for (col = 0; col < ncols; col++) {
320 if (!bsearch(&(value->i), ivalues, nvals,
sizeof(
int), cmp)) {
329 case DB_C_TYPE_STRING:
330 case DB_C_TYPE_DATETIME:
342 case DB_C_TYPE_DOUBLE:
351 G_warning(_(
"Unknown column type (column <%s>)"),
355 if (from_driver != to_driver) {
366 G_warning(
"Unable to insert new record: '%s'",
370 if (from_driver != to_driver) {
383 if (from_driver != to_driver) {
404 const char *from_tblname,
const char *to_drvname,
405 const char *to_dbname,
const char *to_tblname)
408 to_drvname, to_dbname, to_tblname,
427 const char *from_tblname,
const char *to_drvname,
428 const char *to_dbname,
const char *to_tblname,
432 to_drvname, to_dbname, to_tblname,
451 const char *from_tblname,
const char *to_drvname,
452 const char *to_dbname,
const char *to_tblname,
456 to_drvname, to_dbname, to_tblname,
477 const char *from_tblname,
const char *to_drvname,
478 const char *to_dbname,
const char *to_tblname,
479 const char *selcol,
int *ivals,
int nvals)
482 to_drvname, to_dbname, to_tblname,