Processing queries

Table of Contents

Executing sentences
Managing data models
Managing values

Executing sentences

Building commands

Before invoking a query you have to build the structure containing the command and you can do this with <LINK> <EMPHASIS>gda_command_new ()</EMPHASIS></LINK>.

The command type we most commonly use is <LINK>GDA_COMMAND_TYPE_SQL</LINK> because we will only focus on SQL queries[3]

<PROGRAMLISTINGCO> <AREASPEC> <AREA></AREA> <AREA></AREA> </AREASPEC>
          typedef enum {
                  GDA_COMMAND_OPTION_IGNORE_ERRORS  = 1,
                  GDA_COMMAND_OPTION_STOP_ON_ERRORS = 1 << 1,
                  GDA_COMMAND_OPTION_BAD_OPTION     = 1 << 2
          } <LINK>GdaCommandOptions</LINK>;
          
<CALLOUTLIST> <CALLOUT> <PARA> Ignores all errors and executes all sentences returning data models. For failed sentences, it returns an empty data model. </PARA> </CALLOUT> <CALLOUT>

Stops when finding and error and doesn't return data models.

</CALLOUT>
</CALLOUTLIST>
</PROGRAMLISTINGCO>

Here you see an example of creating a command:

<PROGRAMLISTINGCO> <AREASPEC> <AREA></AREA> <AREA></AREA> <AREA></AREA> </AREASPEC>
          gint
          execute_sql_non_query (GdaConnection *connection, const gchar * buffer)
          {
            GdaCommand *command;
            gint number;
          
            command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL, GDA_COMMAND_OPTION_STOP_ON_ERRORS);
            number  = gda_connection_execute_non_query (connection, command, NULL);
          
            gda_command_free (command);
          
            return (number);
          }
          
<CALLOUTLIST> <CALLOUT> <PARA> Our function. You can give it several comma-separated sentences. </PARA> </CALLOUT> <CALLOUT>

We will see it <LINK>later</LINK>.

</CALLOUT>
<CALLOUT>

It is a good practice to free the commands.

</CALLOUT>
</CALLOUTLIST>
</PROGRAMLISTINGCO>

Making <EMPHASIS>non queries</EMPHASIS>

<EMPHASIS>Non queries</EMPHASIS> are queries that does not return data, only the number of rows affected, as a DELETE or an UPDATE. We use <LINK><EMPHASIS> gda_connection_execute_non_query()</EMPHASIS></LINK>

        gint
        execute_sql_non_query (GdaConnection *connection, const gchar * buffer)
        {
          GdaCommand *command;
          gint number;
        
          command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL, GDA_COMMAND_OPTION_STOP_ON_ERRORS);
          number  = gda_connection_execute_non_query (connection, command, NULL);
        
          gda_command_free (command);
        
          return (number);
        }
        

Making normal queries

Normal queries are queries that return data (<LINK>data models</LINK>). You have two ways to do this:

<ITEMIZEDLIST> <LISTITEM>

<LINK> gda_data_model_execute_single_command()</LINK>

</LISTITEM>
<LISTITEM>

<LINK> gda_data_model_execute_command()</LINK>

</LISTITEM>
</ITEMIZEDLIST>

You can use the first way when you want to invoke only a single command. Second way is used to execute several comma-separated sentences. It is recommended to use <LINK> gda_connection_execute_single_command ()</LINK>. Here you see an example:

<PROGRAMLISTINGCO> <AREASPEC> <AREA></AREA> <AREA></AREA> </AREASPEC>
          gboolean
          execute_sql_command (GdaConnection *connection, const gchar * buffer)
          {
            GdaCommand *command;
            GList *list;
            GList *node;
            gboolean errors=FALSE;
          
            GdaDataModel *dm;
          
          
            command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL, GDA_COMMAND_OPTION_STOP_ON_ERRORS);
            list = gda_connection_execute_command (connection, command, NULL);
            if (list!=NULL)
              for (node=g_list_first(list); node != NULL; node=g_list_next(node))
                {
                  dm=(GdaDataModel *) node->data;
                  if (dm == NULL)
                    {
                      errors=TRUE;
                    }
                  else
                    {
                      show_table (dm);
                      g_object_unref(dm);
                    }
                }
            else
              {
                errors=TRUE;
              }
            gda_command_free (command);
          
            return (errors);
          }
          
<CALLOUTLIST> <CALLOUT> <PARA> Executes the query and obtains a list of <LINK>data models</LINK> </PARA> </CALLOUT> <CALLOUT> <PARA> Loop for moving through the list of data models. If you use <LINK> gda_connection_execute_single_command()</LINK>, you should not need to use a loop, because this function would return a <LINK>data model</LINK>. </PARA> </CALLOUT> </CALLOUTLIST> </PROGRAMLISTINGCO>


[3] There are other command types, as XML and so on.