GRASS GIS 8 Programmer's Manual  8.2.2dev(2023)-3d2c704037
dbmi_client/table.c
Go to the documentation of this file.
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 */
32 int db_table_exists(const char *drvname, const char *dbname, const char *tabname)
33 {
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  }
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 */
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));
112  return -1;
113  }
114 
115  nrows = db_get_num_rows(&cursor);
116  db_close_cursor(&cursor);
117 
118  return nrows;
119 }
int db_list_tables(dbDriver *, dbString **, int *, int)
List available tables for given connection.
Definition: c_list_tabs.c:39
Definition: lz4.c:487
int db_open_select_cursor(dbDriver *, dbString *, dbCursor *, int)
Open select cursor.
Definition: c_openselect.c:37
char * db_get_string(const dbString *)
Get string.
Definition: string.c:140
int count
int db_get_table_number_of_rows(dbDriver *driver, dbString *sql)
Get number of rows of table.
dbDriver * db_start_driver_open_database(const char *, const char *)
Open driver/database connection.
Definition: db.c:28
#define NULL
Definition: ccmath.h:32
int db_close_database_shutdown_driver(dbDriver *)
Close driver/database connection.
Definition: db.c:62
int int G_strcasecmp(const char *, const char *)
String compare ignoring case (upper or lower)
Definition: strings.c:47
int db_get_num_rows(dbCursor *)
Get number of selected rows.
Definition: c_rows.c:26
const struct driver * driver
Definition: driver/init.c:25
void db_free_string_array(dbString *, int)
Free allocated dbString array.
Definition: string.c:163
Definition: driver.h:22
#define DB_SEQUENTIAL
Definition: dbmi.h:123
int db_table_exists(const char *drvname, const char *dbname, const char *tabname)
Check if table exists.
void G_warning(const char *,...) __attribute__((format(printf
#define _(str)
Definition: glocale.h:10
int G_debug(int, const char *,...) __attribute__((format(printf
int db_close_cursor(dbCursor *)
Close cursor.
Definition: c_close_cur.c:27
#define DB_OK
Definition: dbmi.h:71