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(). |
|
|
|