QOF Command Line Interface
[Query Object Framework]


Detailed Description

Includes common functions for all QOF CLI programs and provides generic functions to implement command line and interactive shell options.

QOF provides an outline CLI that is easily patched from the qof-generator project to make it easier to keep various QOF projects updated.

This CLI is easily extended to support your own functions and options and includes macros to help you keep up to date with changes in main QOF options. It is recommended that you do not edit this file, instead please feed patches back to the QOF-devel mailing list at http://lists.sourceforge.net/mailman/listinfo/qof-devel so that other projects can be updated.


Files

file  qof-main.c
 Common functions for the QOF external framework.
file  qof-main.h
 Common functions for the QOF external framework.

Data Structures

struct  QofMain_s
 The qof-main context struct. More...

Defines

#define _GNU_SOURCE
#define MAX_LINE   79
#define ERR_INDENT   strlen(PACKAGE) + 2
 Indent error messages as paragraphs.
#define QOF_DATE_STRING_LENGTH   MAX_DATE_LENGTH
#define QOF_MAIN_CLI   "QOF-mod-command-line"
#define CATEGORY_NAME   "category"
 Category name.
#define QSF_COMPRESS   "compression_level"
#define QSF_ENCODING   "encoding_string"
#define QSF_DATE_CONVERT   "convert_date_to_time"
#define QOF_SQL_SUPPORTED   "^SELECT|INSERT"
#define QOF_CLI_OPTIONS
 Common QOF CLI options.
#define QOF_MAIN_OP
#define QOF_OP_VARS
#define QOF_OP_INIT

Typedefs

typedef struct QofMain_s QofMainContext
 The qof-main context struct.

Functions

void qof_main_wrap_line (FILE *fp, gint indent, const gchar *template_str,...) __attribute__((format(printf
 Wrap long lines in popt-style.
gchar * qof_main_make_utf8 (gchar *string)
 Convert strings received from the wrapped objects into UTF-8.
static void qof_main_run_sql (QofMainContext *context)
static void qof_main_run_query (QofMainContext *context)
void qof_main_free (QofMainContext *context)
static void find_param_cb (QofParam *param, gpointer user_data)
static void build_database_list (QofIdTypeConst obj_type, QofMainContext *context)
static void select_cb (QofObject *obj, gpointer data)
void qof_main_moderate_query (QofMainContext *context)
 Assemble the components of the query.
static void option_cb (QofBackendOption *option, gpointer data)
void qof_mod_compression (gint64 gz_level, QofMainContext *context)
void qof_mod_encoding (const gchar *encoding, QofMainContext *context)
void qof_mod_convert_deprecated (gint64 convert, QofMainContext *context)
void qof_cmd_xmlfile (QofMainContext *context)
static void qof_main_list (QofObject *obj, gpointer G_GNUC_UNUSED data)
void qof_main_select (QofMainContext *context)
void qof_cmd_list (void)
 Lists all databases supported by the current QOF framework.
static void explain_cb (QofParam *param, gpointer G_GNUC_UNUSED user_data)
void qof_cmd_explain (QofMainContext *context)
void qof_mod_category (const gchar *category, QofMainContext *data)
 Shorthand to only query objects that are set to the specified category.
glong qof_mod_get_local_offset (void)
 Get the gmt_off offset for this locale.
void qof_mod_database (const gchar *database, QofMainContext *data)
 Shorthand to only query objects within one specific supported database.
void qof_mod_time (const gchar *date_time, QofMainContext *data)
 Shorthand to only query objects that contain the specified date.
void qof_mod_exclude (const gchar *exclude, QofMainContext *data)
 Shorthand to exclude a supported database from the query.
void qof_mod_sql (const gchar *sql_query, QofMainContext *data)
 Specify a SQL query on the command line.
void qof_mod_sql_file (const gchar *sql_file, QofMainContext *data)
 Specify one or more SQL queries contained in a file.
void qof_mod_write (const gchar *write_file, QofMainContext *data)
 Write the results of any query to the file.
void qof_main_show_error (QofSession *session)
 Output error messages from QOF.
GSList * qof_main_get_param_list (QofIdTypeConst object_type, QofType param_type)
 List of all parameters for this object of one QOF type.

Variables

static QofLogModule log_module = "QOF-mod-command-line"


Define Documentation

#define CATEGORY_NAME   "category"

Category name.

The name of the parameter that holds the category of the entity.

Many CLI data sources categorise data by user-editable category strings. If your program does not, simply implement a modified QOF_CLI_OPTIONS in your code without the category option:

{"category", 'c', POPT_ARG_STRING, &category, qof_op_category,
_("Shorthand to only query objects that are set to the specified category."),
"string"},

Definition at line 118 of file qof-main.h.

#define QOF_CLI_OPTIONS

Common QOF CLI options.

These are definitions for popt support in the CLI. Every program's popt table should start with QOF_CLI_OPTIONS or a replacement to insert the standard options into it. Also enables autohelp. End your popt option list with POPT_TABLEEND. If you want to remove any of these options, simply copy QOF_CLI_OPTIONS into a macro of your own and remove the options you do not need.

Definition at line 433 of file qof-main.h.

#define QOF_DATE_STRING_LENGTH   MAX_DATE_LENGTH

Maximum length of the UTC timestamp used by QSF

QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ"

Definition at line 100 of file qof-main.h.

#define QOF_MAIN_CLI   "QOF-mod-command-line"

Debug module for qof-main

Definition at line 103 of file qof-main.h.

#define QOF_MAIN_OP

Value:

_(qof_op_noop, = 0) \
        _(qof_op_list,)     \
        _(qof_op_xmlfile,)  \
        _(qof_op_category,) \
        _(qof_op_database,) \
        _(qof_op_time,) \
        _(qof_op_exclude,)  \
        _(qof_op_sql,)      \
        _(qof_op_sql_file,) \
        _(qof_op_write, )   \
        _(qof_op_explain,)  \
        _(qof_op_vers,)     \
        _(qof_op_compress,) \
        _(qof_op_debug,)
use only if you have no extended options, otherwise use as a template.

Definition at line 470 of file qof-main.h.

#define QOF_OP_INIT

Value:

exclude = NULL;    \
        category = NULL;   \
        database = NULL;   \
        sql_file = NULL;   \
        write_file = NULL; \
        sql_query = NULL;  \
        filename = NULL;
initialise the standard QOF CLI option variables.

A simple convenience macro.

Definition at line 499 of file qof-main.h.

#define QOF_OP_VARS

Value:

const gchar *exclude,  *date_time,  *category,  *database; \
        const gchar *sql_file, *write_file, *sql_query, *filename;
Define the variables for the standard QOF CLI options.

If you remove any QOF CLI options, ensure you also remove the option variable and it's initialiser.

Definition at line 491 of file qof-main.h.

#define QOF_SQL_SUPPORTED   "^SELECT|INSERT"

The SQL commands supported by QOF

A regular expression used to exclude unsupported commands from SQL files. Anything that does not match the expression will be silently ignored. This allows genuine SQL dump files to be parsed without errors.

A QOF object is similar to a definition of a SQL table.
A QOF entity is similar to an instance of a SQL record.
A QOF parameter is similar to data in a SQL field.

Certain SQL commands have no QOF equivalent and should always be ignored silently:

  • ALTER (the object parameters cannot be changed at runtime)
  • CREATE (new tables - new objects - cannot be created at runtime)
  • DROP (an object cannot be "de-registered" without re-compiling)
  • FLUSH (QOF has no permissions system)
  • GRANT
  • KILL
  • LOCK
  • OPTIMIZE
  • REVOKE
  • USE (QOF only has one database, itself.)

Definition at line 159 of file qof-main.h.

Referenced by qof_mod_sql_file().

#define QSF_COMPRESS   "compression_level"

backend configuration index string for QSF

The identifier for the configuration option within QSF supported by the CLI. Matches the QofBackendOption->option_name in the KvpFrame holding the options.

Definition at line 127 of file qof-main.h.

#define QSF_DATE_CONVERT   "convert_date_to_time"

convert deprecated date fields into times.

Definition at line 133 of file qof-main.h.

#define QSF_ENCODING   "encoding_string"

backend configuration encoding string

Definition at line 130 of file qof-main.h.


Typedef Documentation

typedef struct QofMain_s QofMainContext

The qof-main context struct.

Intended as a core type for QOF-based CLI programs, wrap your own context struct around qof_main_context


Function Documentation

void qof_cmd_explain ( QofMainContext context  ) 

Print a list of available parameters for a database.

Used with qof_mod_database to print a list of QofParam for the QofObject set in context->database.

Definition at line 473 of file qof-main.c.

References QofMain_s::database, and QofMain_s::error.

00474 {
00475         if (context->error)
00476                 return;
00477         fprintf (stdout, _("\nParameters of the %s database:\n\n"),
00478                 context->database);
00479         qof_class_param_foreach (context->database, explain_cb, NULL);
00480         fprintf (stdout, _("\nThank you for using %s\n\n"), PACKAGE);
00481 }

void qof_cmd_list ( void   ) 

Lists all databases supported by the current QOF framework.

Prints the name and description for each object type registered with this instance of QOF. No options are used.

Definition at line 445 of file qof-main.c.

References qof_main_wrap_line().

00446 {
00447         qof_main_wrap_line (stdout, 0,
00448         /* Translators: This line is wrapped by the program - 
00449         please make sure you do NOT add line endings here. */
00450                 _("\n%s: You can use the supported database names with '%s -d' "
00451                         "and in SQL queries (as the table name) with '%s -s|f'. "
00452                         "Descriptions are shown only for readability.\n"),
00453                 PACKAGE, PACKAGE, PACKAGE);
00454         fprintf (stdout, "%-20s%-20s\n", _("Name"), _("Description"));
00455         qof_object_foreach_type (qof_main_list, NULL);
00456         qof_main_wrap_line (stdout, 0,
00457         /* Translators: This line is wrapped by the program -
00458         please make sure you do NOT add line endings here. */
00459                 _("\nUse '%s -d <database> --explain' to see the list of fields "
00460                         "within any supported database."), PACKAGE);
00461         fprintf (stdout, _("\nThank you for using %s\n\n"), PACKAGE);
00462 }

void qof_cmd_xmlfile ( QofMainContext context  ) 

query the QSF XML data

Definition at line 383 of file qof-main.c.

References QofMain_s::database, QofMain_s::encoding, ERR_INDENT, QofMain_s::exclude, QofMain_s::export_session, QofMain_s::filename, QofMain_s::gz_level, QofMain_s::input_session, qof_main_moderate_query(), qof_main_show_error(), qof_main_wrap_line(), qof_mod_compression(), qof_mod_encoding(), and QofMain_s::write_file.

00384 {
00385         QofSession *input_session, *export_session;
00386 
00387         ENTER (" ");
00388         input_session = context->input_session;
00389         if (0 == safe_strcmp (context->exclude, context->database)
00390                 && (context->exclude != NULL))
00391         {
00392                 qof_main_wrap_line (stderr, ERR_INDENT,
00393                 /* Translators: This line is wrapped by the program - 
00394                 please make sure you do NOT add line endings here. */
00395                         _("%s: Error: Cannot exclude database \"%s\" with option -e "
00396                                 "because option -d is set to include the database: \"%s\". "
00397                                 "Use the \'-l\' command to see the full list of supported "
00398                                 "databases.\n"), PACKAGE, context->exclude,
00399                         context->database);
00400                 qof_session_end (input_session);
00401                 LEAVE (" conflicting options");
00402                 return;
00403         }
00404         qof_session_begin (input_session, context->filename, TRUE, FALSE);
00405         qof_main_show_error (input_session);
00406         if (0 != safe_strcmp (QOF_STDOUT, context->filename))
00407                 qof_session_load (input_session, NULL);
00408         qof_main_show_error (input_session);
00409         export_session = qof_session_new ();
00410         context->export_session = export_session;
00411         if (context->write_file)
00412         {
00413                 qof_session_begin (export_session, context->write_file, TRUE,
00414                         TRUE);
00415                 qof_mod_compression (context->gz_level, context);
00416         }
00417         else
00418                 qof_session_begin (export_session, QOF_STDOUT, TRUE, FALSE);
00419         qof_main_show_error (export_session);
00420         /* ensure encoding value is set in the new export_session */
00421         qof_mod_encoding (context->encoding, context);
00422         qof_main_moderate_query (context);
00423         qof_session_save (export_session, NULL);
00424         qof_main_show_error (export_session);
00425         qof_main_show_error (input_session);
00426         qof_session_end (input_session);
00427         qof_session_end (export_session);
00428         LEAVE (" ");
00429 }

void qof_main_free ( QofMainContext context  ) 

Free qof_main_context values when work is done.

Definition at line 162 of file qof-main.c.

References QofMain_s::category, QofMain_s::database, QofMain_s::filename, QofMain_s::sql_file, and QofMain_s::write_file.

Referenced by gpe_expense_close().

00163 {
00164         g_free (context->filename);
00165         g_free (context->write_file);
00166         g_free (context->sql_file);
00167         g_free (context->database);
00168         g_free (context->category);
00169 }

GSList* qof_main_get_param_list ( QofIdTypeConst  object_type,
QofType  param_type 
)

List of all parameters for this object of one QOF type.

Return a GSList of all parameters of this object that are a particular QOF type, QOF_TYPE_STRING, QOF_TYPE_BOOLEAN etc.

The returned GSList should be freed by the caller.

Note:
The return list is a singly linked list - GSList - not the doubly-linked list - GList - returned by qof_class_get_referenceList.
Parameters:
object_type object->e_type for the relevant object.
param_type The type of parameter to match, QOF_TYPE_STRING etc.
Returns:
GSList of all matching parameters or NULL if none exist.

gchar * qof_main_make_utf8 ( gchar *  string  ) 

Convert strings received from the wrapped objects into UTF-8.

Deprecated:
use qof_util_make_utf8 from QOF 0.7.3
A wrapper for g_locale_to_utf8 that removes the extra arguments. If the string is already valid UTF-8, it is returned unchanged.

Returns:
the converted string or the original, unchanged, string on error or if the string is already UTF-8.

Definition at line 103 of file qof-main.c.

Referenced by gpe_currency_lookup().

00104 {
00105         gchar *value;
00106 
00107         if (!string)
00108                 return NULL;
00109         if (g_utf8_validate (string, -1, NULL))
00110                 return string;
00111         value = g_locale_to_utf8 (string, -1, NULL, NULL, NULL);
00112         if (!value)
00113         {
00114                 PWARN (" unable to convert from locale %s", string);
00115                 PINFO ("trying to convert from ISO-8859-15.");
00116                 value = g_convert (string, -1, "UTF-8", "ISO-8859-15",
00117                         NULL, NULL, NULL);
00118                 if (!value)
00119                 {
00120                         PERR (" conversion failed");
00121                         return string;
00122                 }
00123                 return value;
00124         }
00125         return value;
00126 }

void qof_main_moderate_query ( QofMainContext context  ) 

Assemble the components of the query.

If any SQL statements are found, run separately from any -c, -d or -t options.

All queries are additive: Successive queries add more entities to the result set but no entity is set more than once.

Definition at line 250 of file qof-main.c.

References QofMain_s::database, QofMain_s::exclude, QofMain_s::query, QofMain_s::sql_list, and QofMain_s::sql_str.

Referenced by qof_cmd_xmlfile().

00251 {
00252         GSList *date_param_list, *category_param_list;
00253         gboolean all;
00254 
00255         ENTER (" ");
00256         all = TRUE;
00257         context->query = qof_query_create ();
00258         date_param_list = NULL;
00259         category_param_list = NULL;
00260         while (context->sql_list)
00261         {
00262                 PINFO ("running sql_list");
00263                 context->sql_str = g_strdup (context->sql_list->data);
00264                 qof_main_run_sql (context);
00265                 qof_main_run_query (context);
00266                 if (context->query)
00267                         qof_query_clear (context->query);
00268                 g_free (context->sql_str);
00269                 context->sql_str = NULL;
00270                 all = FALSE;
00271                 context->sql_list = g_list_next (context->sql_list);
00272         }
00273         if (0 < g_list_length (context->sql_list))
00274         {
00275                 context->sql_str = NULL;
00276                 g_list_free (context->sql_list);
00277                 all = FALSE;
00278         }
00279         if (context->sql_str != NULL)
00280         {
00281                 PINFO ("running sql_str");
00282                 qof_main_run_sql (context);
00283                 qof_main_run_query (context);
00284                 if (context->query)
00285                         qof_query_clear (context->query);
00286                 all = FALSE;
00287         }
00288         if ((context->exclude != NULL)
00289                 && (qof_class_is_registered (context->exclude)))
00290         {
00291                 qof_object_foreach_type (select_cb, context);
00292                 all = FALSE;
00293         }
00294         if ((context->database != NULL)
00295                 && (qof_class_is_registered (context->database)))
00296         {
00297                 build_database_list (context->database, context);
00298                 all = FALSE;
00299         }
00300         if (all == TRUE)
00301                 qof_object_foreach_type (select_cb, context);
00302         LEAVE (" ");
00303 }

void qof_main_show_error ( QofSession *  session  ) 

Output error messages from QOF.

QOF will set errors in the QofSession. The application determines how to output those messages and for the CLI, this will be to stderr. Not all these messages are implemented in any one QOF CLI.

Parameters:
session Any current session.

Definition at line 629 of file qof-main.c.

References ERR_INDENT, and qof_main_wrap_line().

Referenced by qof_cmd_xmlfile().

00630 {
00631         const gchar *fmt;
00632 
00633         if (qof_error_check (session))
00634         {
00635                 fmt = "%s: %s\n";
00636                 qof_main_wrap_line (stderr, ERR_INDENT, fmt, PACKAGE,
00637                         qof_error_get_message (session));
00638         }
00639 }

void qof_main_wrap_line ( FILE *  fp,
gint  indent,
const gchar *  template_str,
  ... 
)

Wrap long lines in popt-style.

Defaults to a line width of 79 characters. Indents lines following the first according to the value of indent.

Parameters:
fp A file stream, including stdout or stderr.
indent The number of characters to indent from the left. Values over or equal to 79 or less than zero are adjusted.
template_str String to be wrapped, containing positional parameters, as specified in the Single Unix Specification. Can be translated but should not contain newline characters except at the beginning or end of the message.
Note:
Once wrapped, the line has a newline appended. Adding a newline to the incoming string will generate a blank line.

Definition at line 56 of file qof-main.c.

Referenced by qof_cmd_list(), qof_cmd_xmlfile(), qof_main_show_error(), and qof_mod_sql_file().

00058 {
00059         gint line_length, msg_length;
00060         va_list wraps;
00061         gchar *message;
00062 
00063         line_length = MAX_LINE;
00064         /* note the modulus. Don't use CLAMP here */
00065         /* indent != line_length or particularly close to it. */
00066         indent = indent >= line_length ? indent % line_length : indent;
00067         indent = indent < 0 ? 0 : indent;
00068         message = NULL;
00069         g_return_if_fail (template);
00070         va_start (wraps, template);
00071         message = g_strdup_vprintf (template, wraps);
00072         va_end (wraps);
00073         g_return_if_fail (message);
00074         msg_length = strlen (message);
00075         while (msg_length > line_length)
00076         {
00077                 gchar *chunk;
00078                 gchar format[16];
00079 
00080                 chunk = message + line_length - 1;
00081                 while (chunk > message && !g_ascii_isspace (*chunk))
00082                         chunk--;
00083                 if (chunk == message)
00084                         break;                          /* give up */
00085                 while (chunk > (message + 1) && g_ascii_isspace (*chunk))
00086                         chunk--;
00087                 chunk++;
00088                 g_sprintf (format, "%%.%ds\n%%%ds", (gint) (chunk - message),
00089                         indent);
00090                 g_fprintf (fp, format, message, "");
00091                 message = chunk;
00092                 while (g_ascii_isspace (*message) && *message)
00093                         message++;
00094                 msg_length = strlen (message);
00095                 if (line_length == MAX_LINE)
00096                         line_length -= indent;
00097         }
00098         if (msg_length)
00099                 g_fprintf (fp, "%s\n", message);
00100 }

void qof_mod_category ( const gchar *  category,
QofMainContext data 
)

Shorthand to only query objects that are set to the specified category.

Modifies the QOF query to only query objects that are set to category.

Definition at line 484 of file qof-main.c.

References QofMain_s::category.

00485 {
00486         data->category = g_strdup (category);
00487 }

void qof_mod_compression ( gint64  gz_level,
QofMainContext context 
)

Pass the requested compression to QSF

Parameters:
gz_level Integer between 0 and 9, 9 highest compression, 0 for none.
context The QofMain context.

Definition at line 327 of file qof-main.c.

References QofMain_s::export_session, and QofMain_s::gz_level.

Referenced by qof_cmd_xmlfile().

00328 {
00329         KvpFrame *be_config;
00330         QofBook *book;
00331         QofBackend *be;
00332 
00333         ENTER (" compression=%" G_GINT64_FORMAT, gz_level);
00334         if ((gz_level > 0) && (gz_level <= 9))
00335         {
00336                 book = qof_session_get_book (context->export_session);
00337                 be = qof_book_get_backend (book);
00338                 be_config = qof_backend_get_config (be);
00339                 context->gz_level = gz_level;
00340                 qof_backend_option_foreach (be_config, option_cb, context);
00341                 qof_backend_load_config (be, be_config);
00342         }
00343         LEAVE (" ");
00344 }

void qof_mod_convert_deprecated ( gint64  convert,
QofMainContext context 
)

configure handling of deprecated date fields.

Definition at line 364 of file qof-main.c.

References QofMain_s::convert, and QofMain_s::export_session.

00365 {
00366         KvpFrame *be_config;
00367         QofBook *book;
00368         QofBackend *be;
00369         gboolean set;
00370 
00371         set = (convert == 0) ? FALSE : TRUE;
00372         ENTER (" convert deprecated date values? %i No if 0.", set);
00373         book = qof_session_get_book (context->export_session);
00374         be = qof_book_get_backend (book);
00375         be_config = qof_backend_get_config (be);
00376         context->convert = convert;
00377         qof_backend_option_foreach (be_config, option_cb, context);
00378         qof_backend_load_config (be, be_config);
00379         LEAVE (" ");
00380 }

void qof_mod_database ( const gchar *  database,
QofMainContext data 
)

Shorthand to only query objects within one specific supported database.

Used to only query objects within the specified database.

Definition at line 504 of file qof-main.c.

References QofMain_s::database.

00505 {
00506         if (qof_class_is_registered (database))
00507                 data->database = g_strdup (database);
00508 }

void qof_mod_encoding ( const gchar *  encoding,
QofMainContext context 
)

Pass an encoding string to the backend.

Definition at line 347 of file qof-main.c.

References QofMain_s::encoding, and QofMain_s::export_session.

Referenced by qof_cmd_xmlfile().

00348 {
00349         KvpFrame *be_config;
00350         QofBook *book;
00351         QofBackend *be;
00352 
00353         ENTER (" encode to %s", encoding);
00354         book = qof_session_get_book (context->export_session);
00355         be = qof_book_get_backend (book);
00356         be_config = qof_backend_get_config (be);
00357         context->encoding = encoding;
00358         qof_backend_option_foreach (be_config, option_cb, context);
00359         qof_backend_load_config (be, be_config);
00360         LEAVE (" ");
00361 }

void qof_mod_exclude ( const gchar *  exclude,
QofMainContext data 
)

Shorthand to exclude a supported database from the query.

Excludes the (single) specified database from the query.

Definition at line 559 of file qof-main.c.

References QofMain_s::exclude.

00560 {
00561         if (qof_class_is_registered (exclude))
00562                 data->exclude = g_strdup (exclude);
00563 }

glong qof_mod_get_local_offset ( void   ) 

Get the gmt_off offset for this locale.

User specified strings can be assumed to be in localtime, but values are stored as UTC. This offset allows the application to modify the minimum and maximum time settings for queries so that the user gets the expected results.

If the timezone is +0100 and the date is 24th July 2006, values could be stored as 11pm on 23rd July 2006 UTC. qof_mod_get_local_offset returns -86400. Add this value to the minimum and maximum time passed to the query to ensure queries select expected timeframe: 2006-07-23T23:00:00Z to 2006-07-24T22:59:59Z.

Returns:
the number of seconds difference between localtime and UTC.

Definition at line 490 of file qof-main.c.

Referenced by qof_mod_time().

00491 {
00492         glong local_offset;
00493         struct tm local;
00494         time_t now;
00495 
00496         local_offset = 0; /* UTC */
00497         now = time (NULL);
00498         local = *localtime_r (&now, &local);
00499         local_offset -= local.tm_gmtoff;
00500         return local_offset;
00501 }

void qof_mod_sql ( const gchar *  sql_query,
QofMainContext data 
)

Specify a SQL query on the command line.

For SELECT, the returned list is a list of all of the instances of 'SomeObj' that match the query. The 'SORT' term is optional. The 'WHERE' term is optional; but if you don't include 'WHERE', you will get a list of all of the object instances. The Boolean operations 'AND' and 'OR' together with parenthesis can be used to construct arbitrarily nested predicates.

For INSERT, the returned list is a list containing the newly created instance of 'SomeObj'.

Date queries handle full date and time strings, using the format exported by the QSF backend. To query dates and times, convert user input into UTC time using qof_date_print and QOF_DATE_FORMAT_UTC

If the param is a KVP frame, then we use a special markup to indicate frame values. The markup should look like /some/kvp/path:value. Thus, for example,
SELECT * FROM SomeObj WHERE (param_a < '/some/kvp:10.0')
will search for the object where param_a is a KVP frame, and this KVP frame contains a path '/some/kvp' and the value stored at that path is floating-point and that float value is less than 10.0.

Parameters:
sql_query Examples:
"select * from pilot_address"

"select * from pilot_expenses where type_of_expense = 'Mileage';"

"SELECT * from pilot_datebook where start_time > '2004-04-06T00:00Z' and end_time < '2005-04-05T23:59:59Z';"

"insert into pilot_todo (description, date_due, todo_priority) values ('put the cat out', '2005-11-24T21:30:00Z', 1)"

Parameters:
data The QofMain context.

Definition at line 566 of file qof-main.c.

References QofMain_s::sql_str.

00567 {
00568         data->sql_str = g_strdup (sql_query);
00569 }

void qof_mod_sql_file ( const gchar *  sql_file,
QofMainContext data 
)

Specify one or more SQL queries contained in a file.

The rules for single SQL commands also apply with regard to the lack of explicit support for joins and the pending support for selecting only certain parameters from a certain object.

See qof_mod_sql for information on the queries supported.

Definition at line 572 of file qof-main.c.

References ERR_INDENT, qof_main_wrap_line(), QOF_SQL_SUPPORTED, QofMain_s::sql_file, and QofMain_s::sql_list.

00573 {
00574         FILE *filehandle;
00575 #ifndef HAVE_GETLINE
00576         gchar lineptr[1024];
00577 #else
00578         gchar *lineptr;
00579 #endif
00580         gchar *buf;
00581         size_t n;
00582         QofQuery *q;
00583         regex_t *r;
00584         gint reg_exp_check;
00585         const gchar *fmt;
00586         static gchar *pattern = QOF_SQL_SUPPORTED;
00587 
00588         ENTER (" ");
00589         data->sql_file = g_strdup (sql_file);
00590         n = 0;
00591         q = NULL;
00592         data->sql_list = NULL;
00593         filehandle = fopen (sql_file, "r");
00594         if (!filehandle)
00595         {
00596                 fmt = _("%s: There was an error reading the file '%s'.\n");
00597                 qof_main_wrap_line (stderr, ERR_INDENT, fmt, PACKAGE, sql_file);
00598                 return;
00599         }
00600         r = g_new (regex_t, 1);
00601 #ifndef HAVE_GETLINE
00602         while (NULL != (fgets (lineptr, sizeof (lineptr), filehandle)))
00603 #else
00604         lineptr = NULL;
00605         while (0 < getline (&lineptr, &n, filehandle))
00606 #endif
00607         {
00608                 reg_exp_check =
00609                         regcomp (r, pattern, REG_ICASE | REG_NOSUB | REG_EXTENDED);
00610                 g_return_if_fail (reg_exp_check == 0);
00611                 if (0 != regexec (r, lineptr, 0, NULL, 0))
00612                         continue;
00613                 buf = g_strdup (g_strchomp (lineptr));
00614                 data->sql_list = g_list_prepend (data->sql_list, buf);
00615         }
00616         regfree (r);
00617         g_free (r);
00618         fclose (filehandle);
00619         LEAVE (" sql_list=%d", g_list_length (data->sql_list));
00620 }

void qof_mod_time ( const gchar *  date_time,
QofMainContext data 
)

Shorthand to only query objects that contain the specified date.

Used to modify the QOF query to only query objects that contain at least one parameter containing a QOF_TYPE_TIME that matches the range specified. Dates need to be specified as YY-MM-DD, i.e. QOF_DATE_FORMAT_ISO.

You can specify a UTC timestring, just as normally output by QSF, but the time will not be matched when using the shorthand option, only the year, month and day.

For more precise time matches or to set a defined period that doesn't follow whole calendar months, (e.g. the UK financial year) use a SQL statement:

"SELECT * from pilot_datebook where start_time > '2004-04-06T00:00Z'
and end_time < '2005-04-05T23:59:59Z';"

Partial matches are allowed, so YY-MM matches any object where a date is within the specified month and year, YY matches any object where a date is within the specified year.

The query range starts at midnight on the first day of the range and ends at 1 second to midnight on the last day of the range.

Definition at line 511 of file qof-main.c.

References QofMain_s::max_qt, QofMain_s::min_qt, and qof_mod_get_local_offset().

00512 {
00513         QofDate *qd;
00514         gboolean all_year, all_month;
00515         gint adding_days;
00516         gchar *info;
00517 
00518         /* incoming date is assumed to be localtime */
00519         ENTER (" date_time=%s", date_time);
00520         all_month = all_year = FALSE;
00521         g_return_if_fail (date_time);
00522         qd = qof_date_parse (date_time, QOF_DATE_FORMAT_ISO);
00523         if (!qd)
00524                 qd = qof_date_parse (date_time, QOF_DATE_FORMAT_UTC);
00525         info = qof_date_print (qd, QOF_DATE_FORMAT_ISO8601);
00526         PINFO (" parsed start_time=%s", info);
00527         g_free (info);
00528         /* set first second of day, UTC */
00529         qof_date_set_day_start (qd);
00530         data->min_qt = qof_date_to_qtime (qd);
00531         /* adjust for incoming localtime */
00532         qof_time_add_secs (data->min_qt, 
00533                 qof_mod_get_local_offset());
00534         /* year specified but no month or day, select the entire year */
00535         if (strlen (date_time) == 4)
00536         {
00537                 PINFO (" match entire year %s", date_time);
00538                 /* go to end of this year, not first day of next. */
00539                 adding_days = qof_date_isleap(qd->qd_year) ? 365 : 364;
00540                 qof_date_adddays (qd, adding_days);
00541         }
00542         /* month specified, but no day, select entire month */
00543         if (strlen (date_time) == 7)
00544         {
00545                 PINFO (" match entire month %s", date_time);
00546                 adding_days = qof_date_get_mday (qd->qd_mon, qd->qd_year);
00547                 qof_date_adddays (qd, adding_days - 1);
00548         }
00549         /* set last second of day */
00550         qof_date_set_day_end (qd);
00551         data->max_qt = qof_date_to_qtime (qd);
00552         /* adjust for incoming localtime */
00553         qof_time_add_secs (data->max_qt, 
00554                 qof_mod_get_local_offset());
00555         LEAVE (" ");
00556 }

void qof_mod_write ( const gchar *  write_file,
QofMainContext data 
)

Write the results of any query to the file.

filename of the file to be written out.

Definition at line 623 of file qof-main.c.

References QofMain_s::write_file.

00624 {
00625         data->write_file = g_strdup (write_file);
00626 }


Generated on Wed Jul 2 14:17:53 2008 for gpe-expenses by  doxygen 1.5.6