print.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*****************************************************************************
  2. *
  3. * MODULE: SQL statement parser library
  4. *
  5. * AUTHOR(S): lex.l and yac.y were originaly 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. } else if ( nptr->node_type == SQLP_NODE_VALUE ) {
  37. switch ( nptr->value.type ) {
  38. case SQLP_NULL:
  39. fprintf( stderr, "val: NULL\n" );
  40. break;
  41. case SQLP_D:
  42. fprintf( stderr, "val: %e\n", nptr->value.d);
  43. break;
  44. case SQLP_I:
  45. fprintf( stderr, "val: %d\n", nptr->value.i);
  46. break;
  47. case SQLP_S:
  48. fprintf( stderr, "val: '%s'\n", nptr->value.s);
  49. break;
  50. }
  51. } else { /* SQLP_NODE_COLUMN */
  52. fprintf( stderr, "col: %s\n", nptr->column_name);
  53. }
  54. }
  55. int sqpPrintStmt(SQLPSTMT *st)
  56. {
  57. int i;
  58. fprintf( stderr, "********** SQL PARSER RESULT **********\n" );
  59. fprintf( stderr, "INPUT: %s\n", sqlpStmt->stmt );
  60. fprintf( stderr, "COMMAND: ");
  61. switch ( sqlpStmt->command )
  62. {
  63. case (SQLP_ADD_COLUMN):
  64. fprintf( stderr, "ADD COLUMN\n");
  65. break;
  66. case (SQLP_CREATE):
  67. fprintf( stderr, "CREATE\n");
  68. break;
  69. case (SQLP_DROP):
  70. fprintf( stderr, "DROP\n");
  71. break;
  72. case (SQLP_DROP_COLUMN):
  73. fprintf( stderr, "DROP COLUMN\n");
  74. break;
  75. case (SQLP_INSERT):
  76. fprintf( stderr, "INSERT\n");
  77. break;
  78. case (SQLP_UPDATE):
  79. fprintf( stderr, "UPDATE\n");
  80. break;
  81. case (SQLP_SELECT):
  82. fprintf( stderr, "SELECT\n");
  83. break;
  84. case (SQLP_DELETE):
  85. fprintf( stderr, "DELETE\n");
  86. break;
  87. default:
  88. fprintf( stderr, "UNKNOWN\n");
  89. }
  90. fprintf( stderr, "TABLE: %s\n", sqlpStmt->table);
  91. /* columns */
  92. for (i=0; i < st->nCol; i++)
  93. {
  94. if ( sqlpStmt->command == SQLP_CREATE )
  95. {
  96. fprintf( stderr, "COLUMN %2d: ", i+1);
  97. switch ( sqlpStmt->ColType[i] )
  98. {
  99. case (SQLP_VARCHAR):
  100. fprintf( stderr, "type:varchar width:%d", sqlpStmt->ColWidth[i] );
  101. break;
  102. case (SQLP_INTEGER):
  103. fprintf( stderr, "type:integer" );
  104. break;
  105. case (SQLP_DOUBLE):
  106. fprintf( stderr, "type:double" );
  107. break;
  108. case (SQLP_DATE):
  109. fprintf( stderr, "type:date" );
  110. break;
  111. case (SQLP_TIME):
  112. fprintf( stderr, "type:time" );
  113. break;
  114. default:
  115. fprintf( stderr, "type:unknown" );
  116. break;
  117. }
  118. fprintf( stderr, " name:%s\n", sqlpStmt->Col[i].s);
  119. }
  120. else
  121. {
  122. fprintf( stderr, "COLUMN %2d: %s\n", i+1, sqlpStmt->Col[i].s);
  123. }
  124. }
  125. /* values */
  126. for (i=0; i < st->nVal; i++)
  127. {
  128. fprintf( stderr, "VALUE %2d ", i+1);
  129. switch ( sqlpStmt->Val[i].type )
  130. {
  131. case (SQLP_S):
  132. fprintf( stderr, "(string) : %s\n", sqlpStmt->Val[i].s );
  133. break;
  134. case (SQLP_I):
  135. fprintf( stderr, "(integer): %d\n", sqlpStmt->Val[i].i );
  136. break;
  137. case (SQLP_D):
  138. fprintf( stderr, "(float) : %f\n", sqlpStmt->Val[i].d );
  139. break;
  140. case (SQLP_NULL):
  141. fprintf( stderr, "(unknown) : null\n" );
  142. break;
  143. case (SQLP_EXPR):
  144. fprintf(stderr, "(expression) :\n" );
  145. print_node( sqlpStmt->Val[i].expr, 0 );
  146. break;
  147. default:
  148. fprintf( stderr, "unknown\n" );
  149. break;
  150. }
  151. }
  152. if ( sqlpStmt->upperNodeptr ) {
  153. fprintf( stderr, "WHERE:\n");
  154. print_node ( sqlpStmt->upperNodeptr, 0 );
  155. }
  156. if ( sqlpStmt->command == SQLP_SELECT ) {
  157. if ( sqlpStmt->orderDir ) {
  158. fprintf( stderr, "ORDER BY: %s %s\n", sqlpStmt->orderCol, sqlpStmt->orderDir == 1 ? "ASC" : "DESC" );
  159. } else {
  160. fprintf( stderr, "ORDER BY: %s\n", sqlpStmt->orderCol );
  161. }
  162. }
  163. fprintf( stderr, "***************************************\n" );
  164. return (1);
  165. }