print.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*****************************************************************************
  2. *
  3. * MODULE: SQL statement parser library
  4. *
  5. * AUTHOR(S): lex.l and yac.y were originally taken from unixODBC and
  6. * probably written by Peter Harvey <pharvey@codebydesigns.com>,
  7. * modifications and other code by Radim Blazek
  8. *
  9. * PURPOSE: Parse input string containing SQL statement to
  10. * SQLPSTMT structure.
  11. * SQL parser may be used by simple database drivers.
  12. *
  13. * COPYRIGHT: (C) 2000 by the GRASS Development Team
  14. *
  15. * This program is free software under the GNU General Public
  16. * License (>=v2). Read the file COPYING that comes with GRASS
  17. * for details.
  18. *
  19. *****************************************************************************/
  20. #include <grass/sqlp.h>
  21. #include <stdio.h>
  22. static void print_node(SQLPNODE * nptr, int level)
  23. {
  24. int i;
  25. for (i = 0; i < level; i++) {
  26. fprintf(stderr, " ");
  27. }
  28. if (nptr->node_type == SQLP_NODE_EXPRESSION) {
  29. fprintf(stderr, "op: %s\n", sqpOperatorName(nptr->oper));
  30. if (nptr->left) {
  31. print_node(nptr->left, level + 1);
  32. }
  33. if (nptr->right) {
  34. print_node(nptr->right, level + 1);
  35. }
  36. }
  37. else if (nptr->node_type == SQLP_NODE_VALUE) {
  38. switch (nptr->value.type) {
  39. case SQLP_NULL:
  40. fprintf(stderr, "val: NULL\n");
  41. break;
  42. case SQLP_D:
  43. fprintf(stderr, "val: %e\n", nptr->value.d);
  44. break;
  45. case SQLP_I:
  46. fprintf(stderr, "val: %d\n", nptr->value.i);
  47. break;
  48. case SQLP_S:
  49. fprintf(stderr, "val: '%s'\n", nptr->value.s);
  50. break;
  51. }
  52. }
  53. else { /* SQLP_NODE_COLUMN */
  54. fprintf(stderr, "col: %s\n", nptr->column_name);
  55. }
  56. }
  57. int sqpPrintStmt(SQLPSTMT * st)
  58. {
  59. int i;
  60. fprintf(stderr, "********** SQL PARSER RESULT **********\n");
  61. fprintf(stderr, "INPUT: %s\n", sqlpStmt->stmt);
  62. fprintf(stderr, "COMMAND: ");
  63. switch (sqlpStmt->command) {
  64. case (SQLP_ADD_COLUMN):
  65. fprintf(stderr, "ADD COLUMN\n");
  66. break;
  67. case (SQLP_CREATE):
  68. fprintf(stderr, "CREATE\n");
  69. break;
  70. case (SQLP_DROP):
  71. fprintf(stderr, "DROP\n");
  72. break;
  73. case (SQLP_DROP_COLUMN):
  74. fprintf(stderr, "DROP COLUMN\n");
  75. break;
  76. case (SQLP_INSERT):
  77. fprintf(stderr, "INSERT\n");
  78. break;
  79. case (SQLP_UPDATE):
  80. fprintf(stderr, "UPDATE\n");
  81. break;
  82. case (SQLP_SELECT):
  83. fprintf(stderr, "SELECT\n");
  84. break;
  85. case (SQLP_DELETE):
  86. fprintf(stderr, "DELETE\n");
  87. break;
  88. default:
  89. fprintf(stderr, "UNKNOWN\n");
  90. }
  91. fprintf(stderr, "TABLE: %s\n", sqlpStmt->table);
  92. /* columns */
  93. for (i = 0; i < st->nCol; i++) {
  94. if (sqlpStmt->command == SQLP_CREATE) {
  95. fprintf(stderr, "COLUMN %2d: ", i + 1);
  96. switch (sqlpStmt->ColType[i]) {
  97. case (SQLP_VARCHAR):
  98. fprintf(stderr, "type:varchar width:%d",
  99. sqlpStmt->ColWidth[i]);
  100. break;
  101. case (SQLP_INTEGER):
  102. fprintf(stderr, "type:integer");
  103. break;
  104. case (SQLP_DOUBLE):
  105. fprintf(stderr, "type:double");
  106. break;
  107. case (SQLP_DATE):
  108. fprintf(stderr, "type:date");
  109. break;
  110. case (SQLP_TIME):
  111. fprintf(stderr, "type:time");
  112. break;
  113. default:
  114. fprintf(stderr, "type:unknown");
  115. break;
  116. }
  117. fprintf(stderr, " name:%s\n", sqlpStmt->Col[i].s);
  118. }
  119. else {
  120. fprintf(stderr, "COLUMN %2d: %s\n", i + 1, sqlpStmt->Col[i].s);
  121. }
  122. }
  123. /* values */
  124. for (i = 0; i < st->nVal; i++) {
  125. fprintf(stderr, "VALUE %2d ", i + 1);
  126. switch (sqlpStmt->Val[i].type) {
  127. case (SQLP_S):
  128. fprintf(stderr, "(string) : %s\n", sqlpStmt->Val[i].s);
  129. break;
  130. case (SQLP_I):
  131. fprintf(stderr, "(integer): %d\n", sqlpStmt->Val[i].i);
  132. break;
  133. case (SQLP_D):
  134. fprintf(stderr, "(float) : %f\n", sqlpStmt->Val[i].d);
  135. break;
  136. case (SQLP_NULL):
  137. fprintf(stderr, "(unknown) : null\n");
  138. break;
  139. case (SQLP_EXPR):
  140. fprintf(stderr, "(expression) :\n");
  141. print_node(sqlpStmt->Val[i].expr, 0);
  142. break;
  143. default:
  144. fprintf(stderr, "unknown\n");
  145. break;
  146. }
  147. }
  148. if (sqlpStmt->upperNodeptr) {
  149. fprintf(stderr, "WHERE:\n");
  150. print_node(sqlpStmt->upperNodeptr, 0);
  151. }
  152. if (sqlpStmt->command == SQLP_SELECT) {
  153. if (sqlpStmt->orderDir) {
  154. fprintf(stderr, "ORDER BY: %s %s\n", sqlpStmt->orderCol,
  155. sqlpStmt->orderDir == 1 ? "ASC" : "DESC");
  156. }
  157. else {
  158. fprintf(stderr, "ORDER BY: %s\n", sqlpStmt->orderCol);
  159. }
  160. }
  161. fprintf(stderr, "***************************************\n");
  162. return (1);
  163. }