2007 January 27
The author disclaims copyright to this source code. In place of a legal notice, here is a blessing:
May you do good and not evil. May you find forgiveness for yourself and forgive others. May you share freely, never taking more than you give.
 Usage:
  SQLite function:
       SELECT import_sql(filename);
  C function:
       int impexp_import_sql(sqlite3 *db,
                             char *filename);
       Reads SQL commands from filename and executes them
       against the current database. Returns the number
       of changes to the current database.
  SQLite function:
       SELECT export_sql(filename, [mode, tablename, ...]);
  C function:
       int impexp_export_sql(sqlite3 *db, char *filename, int mode, ...);
       Writes SQL to filename similar to SQLite's shell
       ".dump" meta command. Mode selects the output format:
       Mode 0 (default): dump schema and data using the
       optional table names following the mode argument.
       Mode 1: dump data only using the optional table
       names following the mode argument.
       Mode 2: dump schema and data using the optional
       table names following the mode argument; each
       table name is followed by a WHERE clause, i.e.
       "mode, table1, where1, table2, where2, ..."
       Mode 3: dump data only, same rules as in mode 2.
       Returns approximate number of lines written or
       -1 when an error occurred.
       Bit 1 of mode:      when 1 dump data only
       Bits 8..9 of mode:  blob quoting mode
           0   default
         256   ORACLE
         512   SQL Server
         768   MySQL
  SQLite function:
       SELECT export_csv(filename, hdr, prefix1, tablename1, schema1, ...]);
  C function:
       int impexp_export_csv(sqlite3 *db, char *filename, int hdr, ...);
                             [char *prefix1, char *tablename1,
                             char *schema1, ...]
       Writes entire tables as CSV to provided filename. A header
       row is written when the hdr parameter is true. The
       rows are optionally introduced with a column made up of
       the prefix (non-empty string) for the respective table.
       If "schema" is NULL, "sqlite_master" is used, otherwise
       specify e.g. "sqlite_temp_master" for temporary tables or
       "att.sqlite_master" for the attached database "att".
          CREATE TABLE A(a,b);
          INSERT INTO A VALUES(1,2);
          INSERT INTO A VALUES(3,'foo');
          CREATE TABLE B(c);
          INSERT INTO B VALUES('hello');
          SELECT export_csv('out.csv', 0, 'aa', 'A', NULL, 'bb', 'B', NULL);
          -- CSV output
          "aa",1,2
          "aa",3,"foo"
          "bb","hello"
          SELECT export_csv('out.csv', 1, 'aa', 'A', NULL, 'bb', 'B', NULL);
          -- CSV output
          "aa","a","b"
          "aa",1,2
          "aa",3,"foo"
          "bb","c"
          "bb","hello"
  SQLite function:
       SELECT export_xml(filename, appendflag, indent,
                         [root, item, tablename, schema]+);
  C function:
       int impexp_export_xml(sqlite3 *db, char *filename,
                             int append, int indent, char *root,
                             char *item, char *tablename, char *schema);
       Writes a table as simple XML to provided filename. The
       rows are optionally enclosed with the "root" tag,
       the row data is enclosed in "item" tags. If "schema"
       is NULL, "sqlite_master" is used, otherwise specify
       e.g. "sqlite_temp_master" for temporary tables or
       "att.sqlite_master" for the attached database "att".
          <item>
           <columnname TYPE="INTEGER|REAL|NULL|TEXT|BLOB">value</columnname>
           ...
          </item>
       e.g.
          CREATE TABLE A(a,b);
          INSERT INTO A VALUES(1,2.1);
          INSERT INTO A VALUES(3,'foo');
          INSERT INTO A VALUES('',NULL);
          INSERT INTO A VALUES(X'010203','<blob>');
          SELECT export_xml('out.xml', 0, 2, 'TBL_A', 'ROW', 'A');
          -- XML output
            <TBL_A>
              <ROW>
                <a TYPE="INTEGER">1</a>
                <b TYPE="REAL">2.1</b>
              </ROW>
              <ROW>
                <a TYPE="INTEGER">3</a>
                <b TYPE="TEXT">foo</b>
              </ROW>
              <ROW>
                <a TYPE="TEXT"></a>
                <b TYPE="NULL"></b>
              </ROW>
              <ROW>
                <a TYPE="BLOB">&x01;&x02;&x03;</a>
                <b TYPE="TEXT"><blob></b>
              </ROW>
            </TBL_A>
       Quoting of XML entities is performed only on the data,
       not on column names and root/item tags.
  SQLite function:
       SELECT export_json(filename, sql);
  C function:
       int impexp_export_json(sqlite3 *db, char *sql,
                              impexp_putc pfunc, void *parg);
       Executes arbitrary SQL statements and formats
       the result in JavaScript Object Notation (JSON).
       The layout of the result is:
        object {results, sql}
         results[] object {columns, rows, changes, last_insert_rowid, error}
          columns[]
           object {name, decltype, type }     (sqlite3_column_*)
          rows[][]                            (sqlite3_column_*)
          changes                             (sqlite3_changes)
          last_insert_rowid                   (sqlite3_last_insert_rowid)
          error                               (sqlite3_errmsg)
         sql                                  (SQL text)
       For each single SQL statement in "sql" an object in the
       "results" array is produced.
       The function pointer for the output function to
       "impexp_export_json" has a signature compatible
       with fputc(3).
 On Win32 the filename argument may be specified as NULL in order
 to open a system file dialog for interactive filename selection.
 
Definition in file impexp.c.#include <sqlite3ext.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stddef.h>
#include <unistd.h>
#include "impexp.h"
Go to the source code of this file.
| Data Structures | |
| struct | DUMP_DATA | 
| Structure for dump callback. More... | |
| struct | json_pfs | 
| JSON output helper structure. More... | |
| Defines | |
| #define | ISSPACE(c) ((c) && (strchr(space_chars, (c)) != 0)) | 
| Functions | |
| char * | one_input_line (FILE *fin) | 
| Read one line of input into dynamically allocated buffer which the caller must free with sqlite3_free(). | |
| int | ends_with_semicolon (const char *str, int n) | 
| Test if string ends with a semicolon. | |
| int | all_whitespace (const char *str) | 
| Test if string contains entirely whitespace or SQL comment. | |
| int | process_input (sqlite3 *db, FILE *fin) | 
| Process contents of FILE pointer as SQL commands. | |
| void | quote_func (sqlite3_context *context, int argc, sqlite3_value **argv) | 
| SQLite function to quote SQLite value depending on optional quote mode. | |
| void | quote_csv_func (sqlite3_context *context, int argc, sqlite3_value **argv) | 
| SQLite function to quote an SQLite value in CSV format. | |
| void | indent_xml_func (sqlite3_context *context, int argc, sqlite3_value **argv) | 
| SQLite function to make XML indentation. | |
| void | quote_xml_func (sqlite3_context *context, int argc, sqlite3_value **argv) | 
| SQLite function to quote a string for XML. | |
| void | import_func (sqlite3_context *ctx, int nargs, sqlite3_value **args) | 
| SQLite function to read and process SQL commands from a file. | |
| int | impexp_import_sql (sqlite3 *db, char *filename) | 
| Reads SQL commands from filename and executes them against the current database. | |
| void | indent (DUMP_DATA *dd) | 
| Write indentation to dump. | |
| int | table_dump (DUMP_DATA *dd, char **errp, int fmt, const char *query,...) | 
| Execute SQL to dump contents of one table. | |
| void | append_free (char **in) | 
| Free dynamically allocated string buffer. | |
| char * | append (char **in, char const *append, char quote) | 
| Append a string to dynamically allocated string buffer with optional quoting. | |
| void | quote_xml_str (DUMP_DATA *dd, char *str) | 
| Quote string for XML output during dump. | |
| int | dump_cb (void *udata, int nargs, char **args, char **cols) | 
| Callback for sqlite3_exec() to dump one data row. | |
| int | schema_dump (DUMP_DATA *dd, char **errp, const char *query,...) | 
| Execute SQL on sqlite_master table in order to dump data. | |
| void | export_func (sqlite3_context *ctx, int nargs, sqlite3_value **args) | 
| SQLite function for SQL output, see impexp_export_sql. | |
| void | export_csv_func (sqlite3_context *ctx, int nargs, sqlite3_value **args) | 
| SQLite function for CSV output, see impexp_export_csv. | |
| void | export_xml_func (sqlite3_context *ctx, int nargs, sqlite3_value **args) | 
| SQLite function for XML output, see impexp_export_xml. | |
| int | impexp_export_sql (sqlite3 *db, char *filename, int mode,...) | 
| Writes SQL to filename similar to SQLite's shell ".dump" meta command. | |
| int | impexp_export_csv (sqlite3 *db, char *filename, int hdr,...) | 
| Writes entire tables as CSV to provided filename. | |
| int | impexp_export_xml (sqlite3 *db, char *filename, int append, int indnt, char *root, char *item, char *tablename, char *schema) | 
| Writes a table as simple XML to provided filename. | |
| void | json_pstr (const char *string, json_pfs *pfs) | 
| Write string using JSON output function. | |
| void | json_pstrq (const char *string, json_pfs *pfs) | 
| Quote and write string using JSON output function. | |
| void | json_pstrc (const char *string, json_pfs *pfs) | 
| Conditionally quote and write string using JSON output function. | |
| void | json_pb64 (const unsigned char *blk, int len, json_pfs *pfs) | 
| Write a blob as base64 string using JSON output function. | |
| int | json_output (sqlite3 *db, char *sql, impexp_putc pfunc, void *parg) | 
| Execute SQL and write output as JSON. | |
| void | export_json_func (sqlite3_context *ctx, int nargs, sqlite3_value **args) | 
| SQLite function for JSON output, see impexp_export_json. | |
| int | impexp_export_json (sqlite3 *db, char *sql, impexp_putc pfunc, void *parg) | 
| Executes arbitrary SQL statements and formats the result in JavaScript Object Notation (JSON). | |
| int | sqlite3_extension_init (sqlite3 *db, char **errmsg, const sqlite3_api_routines *api) | 
| Initializer for SQLite extension load mechanism. | |
| int | impexp_init (sqlite3 *db) | 
| Registers the SQLite functions. | |
| Variables | |
| const char | space_chars [] = " \f\n\r\t\v" | 
| 
 | 
| 
 | 
| 
 | 
| Test if string contains entirely whitespace or SQL comment. 
 
 
 Definition at line 301 of file impexp.c. References ISSPACE. Referenced by process_input(). | 
| 
 | ||||||||||||||||
| Append a string to dynamically allocated string buffer with optional quoting. 
 
 
 Definition at line 1034 of file impexp.c. References append(). Referenced by append(), and impexp_export_xml(). | 
| 
 | 
| Free dynamically allocated string buffer. 
 
 | 
| 
 | ||||||||||||||||||||
| Callback for sqlite3_exec() to dump one data row. 
 
 
 Definition at line 1151 of file impexp.c. References append(), append_free(), DUMP_DATA::db, DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, table_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. Referenced by schema_dump(). | 
| 
 | ||||||||||||
| Test if string ends with a semicolon. 
 
 
 Definition at line 286 of file impexp.c. References ISSPACE. Referenced by process_input(). | 
| 
 | ||||||||||||||||
| SQLite function for CSV output, see impexp_export_csv. 
 
 Definition at line 1596 of file impexp.c. References DUMP_DATA::db, DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, schema_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function for SQL output, see impexp_export_sql. 
 
 Definition at line 1499 of file impexp.c. References DUMP_DATA::db, DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, schema_dump(), table_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function for JSON output, see impexp_export_json. 
 
 Definition at line 2405 of file impexp.c. References impexp_putc, and json_output(). Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function for XML output, see impexp_export_xml. 
 
 Definition at line 1690 of file impexp.c. References DUMP_DATA::db, indent(), DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, quote_xml_str(), schema_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||||||
| Writes entire tables as CSV to provided filename. A header row is written when the hdr parameter is true. The rows are optionally introduced with a column made up of the prefix (non-empty string) for the respective table. If "schema" is NULL, "sqlite_master" is used, otherwise specify e.g. "sqlite_temp_master" for temporary tables or "att.sqlite_master" for the attached database "att". 
 
 
 
   CREATE TABLE A(a,b);
   INSERT INTO A VALUES(1,2);
   INSERT INTO A VALUES(3,'foo')
   CREATE TABLE B(c);
   INSERT INTO B VALUES('hello');
   SELECT export_csv('out.csv', 0, 'aa', 'A', NULL, 'bb', 'B', NULL);
   -- CSV output
   "aa",1,2
   "aa",3,"foo"
   "bb","hello"
   SELECT export_csv('out.csv', 1, 'aa', 'A', NULL, 'bb', 'B', NULL);
   -- CSV output
   "aa","a","b"
   "aa",1,2
   "aa",3,"foo"
   "bb","c"
   "bb","hello"
 Definition at line 1890 of file impexp.c. References DUMP_DATA::db, DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, schema_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. | 
| 
 | ||||||||||||||||||||
| Executes arbitrary SQL statements and formats the result in JavaScript Object Notation (JSON). 
 
 
 
 
  object {results, sql}
    results[] object {columns, rows, changes, last_insert_rowid, error}
      columns[]
        object {name, decltype, type }    (sqlite3_column_*)
      rows[][]                            (sqlite3_column_*)
      changes                             (sqlite3_changes)
      last_insert_rowid                   (sqlite3_last_insert_rowid)
      error                               (sqlite3_errmsg)
    sql                                   (SQL text)
 For each single SQL statement in "sql" an object in the "results" array is produced. Definition at line 2458 of file impexp.c. References impexp_putc, and json_output(). | 
| 
 | ||||||||||||||||||||
| Writes SQL to filename similar to SQLite's shell ".dump" meta command. Mode selects the output format. 
 
 Mode 1: dump data only using the optional table names following the mode argument. Mode 2: dump schema and data using the optional table names following the mode argument; each table name is followed by a WHERE clause, i.e. "mode, table1, where1, table2, where2, ..." Mode 3: dump data only, same rules as in mode 2. Other flags in mode: 
 
       Bit 1 of mode:      when 1 dump data only
       Bits 8..9 of mode:  blob quoting mode
           0   default
         256   ORACLE
         512   SQL Server
         768   MySQL
 Definition at line 1804 of file impexp.c. References DUMP_DATA::db, DUMP_DATA::nlines, DUMP_DATA::out, schema_dump(), table_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. | 
| 
 | ||||||||||||||||||||||||||||||||||||
| Writes a table as simple XML to provided filename. The rows are optionally enclosed with the "root" tag, the row data is enclosed in "item" tags. If "schema" is NULL, "sqlite_master" is used, otherwise specify e.g. "sqlite_temp_master" for temporary tables or "att.sqlite_master" for the attached database "att". 
 
 <item> <columnname TYPE="INTEGER|REAL|NULL|TEXT|BLOB">value</columnname> ... </item> Example: 
  CREATE TABLE A(a,b);
  INSERT INTO A VALUES(1,2.1);
  INSERT INTO A VALUES(3,'foo');
  INSERT INTO A VALUES('',NULL);
  INSERT INTO A VALUES(X'010203','<blob>');
  SELECT export_xml('out.xml', 0, 2, 'TBL_A', 'ROW', 'A');
  -- XML output
    <TBL_A>
       <ROW>
          <a TYPE="INTEGER">1</a>
          <b TYPE="REAL">2.1</b>
       </ROW>
       <ROW>
          <a TYPE="INTEGER">3</a>
          <b TYPE="TEXT">foo</b>
       </ROW>
       <ROW>
          <a TYPE="TEXT"></a>
          <b TYPE="NULL"></b>
       </ROW>
       <ROW>
          <a TYPE="BLOB">&x01;&x02;&x03;</a>
          <b TYPE="TEXT"><blob></b>
       </ROW>
     </TBL_A>
 Quoting of XML entities is performed only on the data, not on column names and root/item tags. Definition at line 1974 of file impexp.c. References append(), DUMP_DATA::db, indent(), DUMP_DATA::indent, DUMP_DATA::nlines, DUMP_DATA::out, DUMP_DATA::quote_mode, quote_xml_str(), schema_dump(), DUMP_DATA::where, and DUMP_DATA::with_schema. | 
| 
 | ||||||||||||
| Reads SQL commands from filename and executes them against the current database. Returns the number of changes to the current database. 
 
 Definition at line 869 of file impexp.c. References process_input(). | 
| 
 | 
| Registers the SQLite functions. 
 
 
 
 import_sql(filename) export_sql(filename, [mode, tablename, ...]) export_csv(filename, hdr, prefix1, tablename1, schema1, ...) export_xml(filename, appendflg, indent, [root, item, tablename, schema]+) export_json(filename, sql) On Win32 the filename argument may be specified as NULL in order to open a system file dialog for interactive filename selection. Definition at line 2521 of file impexp.c. References sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function to read and process SQL commands from a file. 
 
 Definition at line 822 of file impexp.c. References process_input(). Referenced by sqlite3_extension_init(). | 
| 
 | 
| Write indentation to dump. 
 
 Definition at line 932 of file impexp.c. References DUMP_DATA::indent, and DUMP_DATA::out. Referenced by export_xml_func(), and impexp_export_xml(). | 
| 
 | ||||||||||||||||
| SQLite function to make XML indentation. 
 
 Definition at line 629 of file impexp.c. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||||||
| Execute SQL and write output as JSON. 
 
 
 Definition at line 2261 of file impexp.c. References impexp_putc, json_pb64(), json_pstr(), json_pstrc(), json_pstrq(), json_pfs::parg, and json_pfs::pfunc. Referenced by export_json_func(), and impexp_export_json(). | 
| 
 | ||||||||||||||||
| Write a blob as base64 string using JSON output function. 
 
 Definition at line 2208 of file impexp.c. References impexp_putc, json_pstr(), json_pfs::parg, and json_pfs::pfunc. Referenced by json_output(). | 
| 
 | ||||||||||||
| Write string using JSON output function. 
 
 Definition at line 2053 of file impexp.c. References json_pfs::parg, and json_pfs::pfunc. Referenced by json_output(), json_pb64(), json_pstrc(), and json_pstrq(). | 
| 
 | ||||||||||||
| Conditionally quote and write string using JSON output function. 
 
 Definition at line 2191 of file impexp.c. References json_pstr(), and json_pstrq(). Referenced by json_output(). | 
| 
 | ||||||||||||
| Quote and write string using JSON output function. 
 
 Definition at line 2068 of file impexp.c. References impexp_putc, json_pstr(), json_pfs::parg, and json_pfs::pfunc. Referenced by json_output(), and json_pstrc(). | 
| 
 | 
| Read one line of input into dynamically allocated buffer which the caller must free with sqlite3_free(). 
 
 
 Definition at line 229 of file impexp.c. Referenced by process_input(). | 
| 
 | ||||||||||||
| Process contents of FILE pointer as SQL commands. 
 
 
 Definition at line 341 of file impexp.c. References all_whitespace(), ends_with_semicolon(), ISSPACE, and one_input_line(). Referenced by impexp_import_sql(), and import_func(). | 
| 
 | ||||||||||||||||
| SQLite function to quote an SQLite value in CSV format. 
 
 Definition at line 540 of file impexp.c. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function to quote SQLite value depending on optional quote mode. 
 
 
argv[0] - value to be quoted Definition at line 420 of file impexp.c. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||||||
| SQLite function to quote a string for XML. 
 
 Definition at line 653 of file impexp.c. Referenced by sqlite3_extension_init(). | 
| 
 | ||||||||||||
| Quote string for XML output during dump. 
 
 Definition at line 1104 of file impexp.c. References DUMP_DATA::out. Referenced by export_xml_func(), and impexp_export_xml(). | 
| 
 | ||||||||||||||||||||
| Execute SQL on sqlite_master table in order to dump data. 
 
 
 Definition at line 1455 of file impexp.c. References DUMP_DATA::db, and dump_cb(). Referenced by export_csv_func(), export_func(), export_xml_func(), impexp_export_csv(), impexp_export_sql(), and impexp_export_xml(). | 
| 
 | ||||||||||||||||
| Initializer for SQLite extension load mechanism. 
 
 
 Definition at line 2477 of file impexp.c. References export_csv_func(), export_func(), export_json_func(), export_xml_func(), import_func(), indent_xml_func(), quote_csv_func(), quote_func(), and quote_xml_func(). | 
| 
 | ||||||||||||||||||||||||
| Execute SQL to dump contents of one table. 
 
 
 Definition at line 952 of file impexp.c. References DUMP_DATA::db, DUMP_DATA::nlines, DUMP_DATA::out, and DUMP_DATA::quote_mode. Referenced by dump_cb(), export_func(), and impexp_export_sql(). | 
| 
 | 
| 
 |