]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/c-apps/oils_buildq.c
2f8fd23d515a392ef3283c97eff4b6e2f3739e01
[working/Evergreen.git] / Open-ILS / src / c-apps / oils_buildq.c
1 /**
2         @file buildquery.c
3         @brief Routines for maintaining a BuildSQLState.
4
5         A BuildSQLState shuttles information from the routines that load an abstract representation
6         of a query to the routines that build an SQL statement.
7 */
8
9 #include <stdlib.h>
10 #include <string.h>
11 #include <dbi/dbi.h>
12 #include "opensrf/utils.h"
13 #include "opensrf/log.h"
14 #include "opensrf/string_array.h"
15 #include "openils/oils_buildq.h"
16
17 /**
18         @brief Construct a new BuildSQLState.
19         @param dbhandle Handle for the database connection.
20         @return Pointer to the newly constructed BuildSQLState.
21
22         The calling code is responsible for freeing the BuildSQLState by calling BuildSQLStateFree().
23 */
24 BuildSQLState* buildSQLStateNew( dbi_conn dbhandle ) {
25
26         BuildSQLState* state   = safe_malloc( sizeof( BuildSQLState ) );
27         state->dbhandle        = dbhandle;
28         state->result          = NULL;
29         state->error           = 0;
30         state->error_msgs      = osrfNewStringArray( 16 );
31         state->sql             = buffer_init( 128 );
32         state->bindvar_list    = NULL;  // Don't build it until we need it
33         state->query_stack     = NULL;
34         state->expr_stack      = NULL;
35         state->indent          = 0;
36         state->defaults_usable = 0;
37         state->values_required = 0;
38
39         return state;
40 }
41
42 const char* sqlAddMsg( BuildSQLState* state, const char* msg, ... ) {
43         if( !state || ! state->error_msgs )
44                 return "";
45
46         VA_LIST_TO_STRING( msg );
47         osrfStringArrayAdd( state->error_msgs, VA_BUF );
48         return osrfStringArrayGetString( state->error_msgs, state->error_msgs->size - 1 );
49 }
50
51 /**
52         @brief Free a BuildSQLState.
53         @param state Pointer to the BuildSQLState to be freed.
54
55         We do @em not close the database connection.
56 */
57 void buildSQLStateFree( BuildSQLState* state ){
58         
59         if( state ) {
60                 if( state->result ) {
61                         dbi_result_free( state->result );
62                         state->result = NULL;
63                 }
64                 osrfStringArrayFree( state->error_msgs );
65                 buffer_free( state->sql );
66                 if( state->bindvar_list )
67                         osrfHashFree( state->bindvar_list );
68                 while( state->query_stack )
69                         pop_id( &state->query_stack );
70                 while( state->expr_stack )
71                         pop_id( &state->expr_stack );
72                 while( state->from_stack )
73                         pop_id( &state->from_stack );
74                 free( state );
75         }
76 }
77
78 /**
79         @brief Free up any resources held by the BuildSQL module.
80 */
81 void buildSQLCleanup( void ) {
82         storedQCleanup();
83 }