GRASS Programmer's Manual
6.4.2(2012)
|
00001 00002 /***************************************************************************** 00003 * 00004 * MODULE: SQL statement parser library 00005 * 00006 * AUTHOR(S): lex.l and yac.y were originaly taken from unixODBC and 00007 * probably written by Peter Harvey <pharvey@codebydesigns.com>, 00008 * modifications and other code by Radim Blazek 00009 * 00010 * PURPOSE: Parse input string containing SQL statement to 00011 * SQLPSTMT structure. 00012 * SQL parser may be used by simple database drivers. 00013 * 00014 * COPYRIGHT: (C) 2000 by the GRASS Development Team 00015 * 00016 * This program is free software under the GNU General Public 00017 * License (>=v2). Read the file COPYING that comes with GRASS 00018 * for details. 00019 * 00020 *****************************************************************************/ 00021 00022 #include <grass/sqlp.h> 00023 #include <stdio.h> 00024 00025 static void print_node(SQLPNODE * nptr, int level) 00026 { 00027 int i; 00028 00029 for (i = 0; i < level; i++) { 00030 fprintf(stderr, " "); 00031 } 00032 00033 if (nptr->node_type == SQLP_NODE_EXPRESSION) { 00034 fprintf(stderr, "op: %s\n", sqpOperatorName(nptr->oper)); 00035 if (nptr->left) { 00036 print_node(nptr->left, level + 1); 00037 } 00038 if (nptr->right) { 00039 print_node(nptr->right, level + 1); 00040 } 00041 } 00042 else if (nptr->node_type == SQLP_NODE_VALUE) { 00043 switch (nptr->value.type) { 00044 case SQLP_NULL: 00045 fprintf(stderr, "val: NULL\n"); 00046 break; 00047 case SQLP_D: 00048 fprintf(stderr, "val: %e\n", nptr->value.d); 00049 break; 00050 case SQLP_I: 00051 fprintf(stderr, "val: %d\n", nptr->value.i); 00052 break; 00053 case SQLP_S: 00054 fprintf(stderr, "val: '%s'\n", nptr->value.s); 00055 break; 00056 } 00057 } 00058 else { /* SQLP_NODE_COLUMN */ 00059 fprintf(stderr, "col: %s\n", nptr->column_name); 00060 } 00061 } 00062 00063 int sqpPrintStmt(SQLPSTMT * st) 00064 { 00065 int i; 00066 00067 fprintf(stderr, "********** SQL PARSER RESULT **********\n"); 00068 fprintf(stderr, "INPUT: %s\n", sqlpStmt->stmt); 00069 fprintf(stderr, "COMMAND: "); 00070 switch (sqlpStmt->command) { 00071 case (SQLP_ADD_COLUMN): 00072 fprintf(stderr, "ADD COLUMN\n"); 00073 break; 00074 case (SQLP_CREATE): 00075 fprintf(stderr, "CREATE\n"); 00076 break; 00077 case (SQLP_DROP): 00078 fprintf(stderr, "DROP\n"); 00079 break; 00080 case (SQLP_DROP_COLUMN): 00081 fprintf(stderr, "DROP COLUMN\n"); 00082 break; 00083 case (SQLP_INSERT): 00084 fprintf(stderr, "INSERT\n"); 00085 break; 00086 case (SQLP_UPDATE): 00087 fprintf(stderr, "UPDATE\n"); 00088 break; 00089 case (SQLP_SELECT): 00090 fprintf(stderr, "SELECT\n"); 00091 break; 00092 case (SQLP_DELETE): 00093 fprintf(stderr, "DELETE\n"); 00094 break; 00095 default: 00096 fprintf(stderr, "UNKNOWN\n"); 00097 } 00098 00099 fprintf(stderr, "TABLE: %s\n", sqlpStmt->table); 00100 00101 /* columns */ 00102 for (i = 0; i < st->nCol; i++) { 00103 if (sqlpStmt->command == SQLP_CREATE) { 00104 fprintf(stderr, "COLUMN %2d: ", i + 1); 00105 switch (sqlpStmt->ColType[i]) { 00106 case (SQLP_VARCHAR): 00107 fprintf(stderr, "type:varchar width:%d", 00108 sqlpStmt->ColWidth[i]); 00109 break; 00110 case (SQLP_INTEGER): 00111 fprintf(stderr, "type:integer"); 00112 break; 00113 case (SQLP_DOUBLE): 00114 fprintf(stderr, "type:double"); 00115 break; 00116 case (SQLP_DATE): 00117 fprintf(stderr, "type:date"); 00118 break; 00119 case (SQLP_TIME): 00120 fprintf(stderr, "type:time"); 00121 break; 00122 default: 00123 fprintf(stderr, "type:unknown"); 00124 break; 00125 } 00126 fprintf(stderr, " name:%s\n", sqlpStmt->Col[i].s); 00127 } 00128 else { 00129 fprintf(stderr, "COLUMN %2d: %s\n", i + 1, sqlpStmt->Col[i].s); 00130 } 00131 } 00132 00133 /* values */ 00134 for (i = 0; i < st->nVal; i++) { 00135 fprintf(stderr, "VALUE %2d ", i + 1); 00136 switch (sqlpStmt->Val[i].type) { 00137 case (SQLP_S): 00138 fprintf(stderr, "(string) : %s\n", sqlpStmt->Val[i].s); 00139 break; 00140 case (SQLP_I): 00141 fprintf(stderr, "(integer): %d\n", sqlpStmt->Val[i].i); 00142 break; 00143 case (SQLP_D): 00144 fprintf(stderr, "(float) : %f\n", sqlpStmt->Val[i].d); 00145 break; 00146 case (SQLP_NULL): 00147 fprintf(stderr, "(unknown) : null\n"); 00148 break; 00149 case (SQLP_EXPR): 00150 fprintf(stderr, "(expression) :\n"); 00151 print_node(sqlpStmt->Val[i].expr, 0); 00152 break; 00153 default: 00154 fprintf(stderr, "unknown\n"); 00155 break; 00156 } 00157 } 00158 00159 if (sqlpStmt->upperNodeptr) { 00160 fprintf(stderr, "WHERE:\n"); 00161 print_node(sqlpStmt->upperNodeptr, 0); 00162 } 00163 00164 00165 if (sqlpStmt->command == SQLP_SELECT) { 00166 if (sqlpStmt->orderDir) { 00167 fprintf(stderr, "ORDER BY: %s %s\n", sqlpStmt->orderCol, 00168 sqlpStmt->orderDir == 1 ? "ASC" : "DESC"); 00169 } 00170 else { 00171 fprintf(stderr, "ORDER BY: %s\n", sqlpStmt->orderCol); 00172 } 00173 } 00174 00175 00176 fprintf(stderr, "***************************************\n"); 00177 00178 return (1); 00179 }