123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- /**********************************************************
- * MODULE: mysql
- * AUTHOR(S): Radim Blazek (radim.blazek@gmail.com)
- * PURPOSE: MySQL database driver
- * COPYRIGHT: (C) 2001 by the GRASS Development Team
- * This program is free software under the
- * GNU General Public License (>=v2).
- * Read the file COPYING that comes with GRASS
- * for details.
- **********************************************************/
- #include <stdlib.h>
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/dbmi.h>
- #include <grass/glocale.h>
- #include "globals.h"
- #include "proto.h"
- int db__driver_fetch(dbCursor * cn, int position, int *more)
- {
- cursor *c;
- dbToken token;
- dbTable *table;
- int i;
- /* get cursor token */
- token = db_get_cursor_token(cn);
- /* get the cursor by its token */
- if (!(c = (cursor *) db_find_token(token))) {
- db_d_append_error(_("Cursor not found"));
- db_d_report_error();
- return DB_FAILED;
- }
- /* fetch on position */
- switch (position) {
- case DB_NEXT:
- c->row = mysql_fetch_row(c->res);
- break;
- case DB_CURRENT:
- break;
- case DB_PREVIOUS:
- case DB_FIRST:
- case DB_LAST:
- default:
- db_d_append_error(_("Cursor position is not supported "
- "by MySQL driver"));
- db_d_report_error();
- return DB_FAILED;
- }
- G_debug(3, "nrows = %d", c->nrows);
- if (c->row == NULL) {
- *more = 0;
- return DB_OK;
- }
- *more = 1;
- /* get the data out of the descriptor into the table */
- table = db_get_cursor_table(cn);
- for (i = 0; i < c->ncols; i++) {
- int col, sqltype, mysqltype;
- dbColumn *column;
- dbValue *value;
- char *val;
- col = c->cols[i]; /* known column */
- column = db_get_table_column(table, i);
- mysqltype = db_get_column_host_type(column);
- sqltype = db_get_column_sqltype(column);
- value = db_get_column_value(column);
- db_zero_string(&value->s);
- value->t.year = 0;
- value->t.month = 0;
- value->t.day = 0;
- value->t.hour = 0;
- value->t.minute = 0;
- value->t.seconds = 0.0;
- val = c->row[i];
- if (!val) {
- value->isNull = 1;
- continue;
- }
- else {
- value->isNull = 0;
- }
- G_debug(3, "col %d, mysqltype %d, sqltype %d, val = '%s'",
- col, mysqltype, sqltype, c->row[col]);
- /* defined in /usr/include/mysql/mysql_com.h */
- switch (mysqltype) {
- int ns;
- case MYSQL_TYPE_TINY:
- case MYSQL_TYPE_SHORT:
- case MYSQL_TYPE_LONG:
- case MYSQL_TYPE_INT24:
- case MYSQL_TYPE_LONGLONG:
- case MYSQL_TYPE_YEAR:
- value->i = atoi(val);
- break;
- case MYSQL_TYPE_FLOAT:
- case MYSQL_TYPE_DOUBLE:
- value->d = atof(val);
- break;
- /* MySQL TIMESTAMP < 4.1: YYYYMMDDHHMMSS TIMESTAMP(14)
- * YYMMDDHHMMSS TIMESTAMP(12)
- * YYMMDDHHMM TIMESTAMP(10)
- * YYYYMMDD TIMESTAMP(8)
- * YYMMDD TIMESTAMP(6)
- * YYMM TIMESTAMP(4)
- * YY YY
- * MySQL TIMESTAMP >= 4.1: 'YYYY-MM-DD HH:MM:SS' (19 chars) */
- case MYSQL_TYPE_TIMESTAMP:
- {
- char valbuf[25], buf[10];
- memset(valbuf, 0, 25);
- strcpy(valbuf, val);
- switch (strlen(val)) {
- case 2:
- case 4:
- case 6:
- case 10:
- case 12:
- strncpy(buf, val, 2);
- buf[2] = 0;
- value->t.year = atoi(buf);
- strncpy(buf, val + 2, 2);
- buf[2] = 0;
- value->t.month = atoi(buf);
- strncpy(buf, val + 4, 2);
- buf[2] = 0;
- value->t.day = atoi(buf);
- strncpy(buf, val + 6, 2);
- buf[2] = 0;
- value->t.hour = atoi(buf);
- strncpy(buf, val + 8, 2);
- buf[2] = 0;
- value->t.minute = atoi(buf);
- strncpy(buf, val + 10, 2);
- buf[2] = 0;
- value->t.seconds = atof(buf);
- break;
- case 8:
- case 14:
- strncpy(buf, val, 4);
- buf[4] = 0;
- value->t.year = atoi(buf);
- strncpy(buf, val + 4, 2);
- buf[2] = 0;
- value->t.month = atoi(buf);
- strncpy(buf, val + 6, 2);
- buf[2] = 0;
- value->t.day = atoi(buf);
- strncpy(buf, val + 8, 2);
- buf[2] = 0;
- value->t.hour = atoi(buf);
- strncpy(buf, val + 10, 2);
- buf[2] = 0;
- value->t.minute = atoi(buf);
- strncpy(buf, val + 12, 2);
- buf[2] = 0;
- value->t.seconds = atof(buf);
- break;
- case 19:
- ns = sscanf(val, "%4d-%2d-%2d %2d:%2d:%lf",
- &(value->t.year), &(value->t.month),
- &(value->t.day), &(value->t.hour),
- &(value->t.minute), &(value->t.seconds));
- if (ns != 6) {
- db_d_append_error("%s %s",
- _("Unable to scan timestamp: "),
- val);
- db_d_report_error();
- return DB_FAILED;
- }
- break;
- default:
- db_d_append_error("%s %s",
- _("Unknown timestamp format: "),
- val);
- db_d_report_error();
- return DB_FAILED;
- }
- }
- break;
- /* MySQL DATE: 'YYYY-MM-DD' */
- case MYSQL_TYPE_DATE:
- ns = sscanf(val, "%4d-%2d-%2d", &(value->t.year),
- &(value->t.month), &(value->t.day));
- if (ns != 3) {
- db_d_append_error("%s %s",
- _("Unable to scan date: "),
- val);
- db_d_report_error();
- return DB_FAILED;
- }
- break;
- /* MySQL DATETIME: 'HH:MM:SS' */
- case MYSQL_TYPE_TIME:
- ns = sscanf(val, "%2d:%2d:%lf", &(value->t.hour),
- &(value->t.minute), &(value->t.seconds));
- if (ns != 3) {
- db_d_append_error("%s %s",
- _("Unable to scan time: "),
- val);
- db_d_report_error();
- return DB_FAILED;
- }
- break;
- /* MySQL DATETIME: 'YYYY-MM-DD HH:MM:SS' */
- case MYSQL_TYPE_DATETIME:
- ns = sscanf(val, "%4d-%2d-%2d %2d:%2d:%lf",
- &(value->t.year), &(value->t.month),
- &(value->t.day), &(value->t.hour),
- &(value->t.minute), &(value->t.seconds));
- if (ns != 6) {
- db_d_append_error("%s %s",
- _("Unable to scan datetime:"),
- val);
- db_d_report_error();
- return DB_FAILED;
- }
- break;
- case MYSQL_TYPE_STRING:
- case MYSQL_TYPE_VAR_STRING:
- case MYSQL_TYPE_SET:
- case MYSQL_TYPE_ENUM:
- case MYSQL_TYPE_BLOB:
- db_set_string(&(value->s), val);
- break;
- }
- }
- G_debug(3, "Row fetched");
- return DB_OK;
- }
- int db__driver_get_num_rows(cn)
- dbCursor *cn;
- {
- cursor *c;
- dbToken token;
- /* get cursor token */
- token = db_get_cursor_token(cn);
- /* get the cursor by its token */
- if (!(c = (cursor *) db_find_token(token))) {
- db_d_append_error(_("Cursor not found"));
- db_d_report_error();
- return DB_FAILED;
- }
- return (c->nrows);
- }
|