3 @brief Routines for maintaining a BuildSQLState.
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.
12 #include "opensrf/utils.h"
13 #include "opensrf/log.h"
14 #include "opensrf/string_array.h"
15 #include "openils/oils_buildq.h"
18 @brief Construct a new BuildSQLState.
19 @param dbhandle Handle for the database connection.
20 @return Pointer to the newly constructed BuildSQLState.
22 The calling code is responsible for freeing the BuildSQLState by calling BuildSQLStateFree().
24 BuildSQLState* buildSQLStateNew( dbi_conn dbhandle ) {
26 BuildSQLState* state = safe_malloc( sizeof( BuildSQLState ) );
27 state->dbhandle = dbhandle;
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;
36 state->defaults_usable = 0;
37 state->values_required = 0;
42 const char* sqlAddMsg( BuildSQLState* state, const char* msg, ... ) {
43 if( !state || ! state->error_msgs )
46 VA_LIST_TO_STRING( msg );
47 osrfStringArrayAdd( state->error_msgs, VA_BUF );
48 return osrfStringArrayGetString( state->error_msgs, state->error_msgs->size - 1 );
52 @brief Free a BuildSQLState.
53 @param state Pointer to the BuildSQLState to be freed.
55 We do @em not close the database connection.
57 void buildSQLStateFree( BuildSQLState* state ){
61 dbi_result_free( state->result );
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 );
79 @brief Free up any resources held by the BuildSQL module.
81 void buildSQLCleanup( void ) {