1 /*!
2  * \file db/dbmi_client/table.c
3  *
4  * \brief DBMI Library (client) - table management
5  *
6  * (C) 1999-2008 by the GRASS Development Team
7  *
8  * This program is free software under the GNU General Public
9  * License (>=v2). Read the file COPYING that comes with GRASS
10  * for details.
11  *
12  * \author Joel Jones (CERL/UIUC), Radim Blazek
13  */
14 
15 #include <stdlib.h>
16 #include <string.h>
17 #include <grass/gis.h>
18 #include <grass/dbmi.h>
19 #include <grass/glocale.h>
20 
21 /*!
22   \brief Check if table exists
23 
24   \param drvname driver name
25   \param dbname database name
26   \param tabname table name
27 
28   \return 1 exist
29   \return 0 doesn't exist
30   \return -1 error
31 */
db_table_exists(const char * drvname,const char * dbname,const char * tabname)32 int db_table_exists(const char *drvname, const char *dbname, const char *tabname)
33 {
34     dbDriver *driver;
35     dbString *names;
36     int i, count, found = 0;
37     int full = 0;
38     char buf[1000];
39     char *bufp, *c;
40 
41     if (strchr(tabname, '.'))
42 	full = 1;
43 
44     driver = db_start_driver_open_database(drvname, dbname);
45     if (driver == NULL) {
46 	G_warning(_("Unable open database <%s> by driver <%s>"), dbname,
47 		  drvname);
48 	return -1;
49     }
50 
51     /* The table tabname can be either fully qualified in form table.schema,
52      * or it can be only table name. If the name is fully qualified, compare whole name,
53      * if it is not, compare only table names */
54 
55     /* user tables */
56     if (db_list_tables(driver, &names, &count, 0) != DB_OK)
57 	return (-1);
58 
59     for (i = 0; i < count; i++) {
60 	strcpy(buf, db_get_string(&names[i]));
61 	bufp = buf;
62 	if (!full && (c = strchr(buf, '.'))) {
63 	    bufp = c + 1;
64 	}
65 	G_debug(2, "table = %s -> %s", buf, bufp);
66 	if (G_strcasecmp(tabname, bufp) == 0) {
67 	    found = 1;
68 	    break;
69 	}
70     }
71     db_free_string_array(names, count);
72 
73     if (!found) {		/* system tables */
74 	if (db_list_tables(driver, &names, &count, 1) != DB_OK)
75 	    return (-1);
76 
77 	for (i = 0; i < count; i++) {
78 	    strcpy(buf, db_get_string(&names[i]));
79 	    bufp = buf;
80 	    if (!full && (c = strchr(buf, '.'))) {
81 		bufp = c + 1;
82 	    }
83 	    if (G_strcasecmp(tabname, bufp) == 0) {
84 		found = 1;
85 		break;
86 	    }
87 	}
88 	db_free_string_array(names, count);
89     }
90     db_close_database_shutdown_driver(driver);
91 
92     return (found);
93 }
94 
95 /*!
96   \brief Get number of rows of table
97 
98   \param driver db driver
99   \param sql SQL statement
100 
101   \return number of records
102   \return -1
103 */
db_get_table_number_of_rows(dbDriver * driver,dbString * sql)104 int db_get_table_number_of_rows(dbDriver * driver, dbString * sql)
105 {
106     int nrows;
107     dbCursor cursor;
108 
109     if (db_open_select_cursor(driver, sql, &cursor, DB_SEQUENTIAL) != DB_OK) {
110 	G_warning(_("Unable to open select cursor: '%s'"), db_get_string(sql));
111 	db_close_database_shutdown_driver(driver);
112 	return -1;
113     }
114 
115     nrows = db_get_num_rows(&cursor);
116     db_close_cursor(&cursor);
117 
118     return nrows;
119 }
120