/********************************************************
* ADO.NET 2.0 Data Provider for SQLite Version 3.X
* Written by Joe Mistachkin (joe@mistachkin.com)
*
* Released to the public domain, use at your own risk!
********************************************************/
namespace System.Data.SQLite
{
#region ISQLiteNativeModule Interface
///
/// This interface represents a virtual table implementation written in
/// native code.
///
public interface ISQLiteNativeModule
{
///
///
/// This method is called to create a new instance of a virtual table
/// in response to a CREATE VIRTUAL TABLE statement. The db parameter
/// is a pointer to the SQLite database connection that is executing
/// the CREATE VIRTUAL TABLE statement. The pAux argument is the copy
/// of the client data pointer that was the fourth argument to the
/// sqlite3_create_module() or sqlite3_create_module_v2() call that
/// registered the virtual table module. The argv parameter is an
/// array of argc pointers to null terminated strings. The first
/// string, argv[0], is the name of the module being invoked. The
/// module name is the name provided as the second argument to
/// sqlite3_create_module() and as the argument to the USING clause of
/// the CREATE VIRTUAL TABLE statement that is running. The second,
/// argv[1], is the name of the database in which the new virtual table
/// is being created. The database name is "main" for the primary
/// database, or "temp" for TEMP database, or the name given at the
/// end of the ATTACH statement for attached databases. The third
/// element of the array, argv[2], is the name of the new virtual
/// table, as specified following the TABLE keyword in the CREATE
/// VIRTUAL TABLE statement. If present, the fourth and subsequent
/// strings in the argv[] array report the arguments to the module name
/// in the CREATE VIRTUAL TABLE statement.
///
///
/// The job of this method is to construct the new virtual table object
/// (an sqlite3_vtab object) and return a pointer to it in *ppVTab.
///
///
/// As part of the task of creating a new sqlite3_vtab structure, this
/// method must invoke sqlite3_declare_vtab() to tell the SQLite core
/// about the columns and datatypes in the virtual table. The
/// sqlite3_declare_vtab() API has the following prototype:
///
///
///
/// int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)
///
///
///
/// The first argument to sqlite3_declare_vtab() must be the same
/// database connection pointer as the first parameter to this method.
/// The second argument to sqlite3_declare_vtab() must a
/// zero-terminated UTF-8 string that contains a well-formed CREATE
/// TABLE statement that defines the columns in the virtual table and
/// their data types. The name of the table in this CREATE TABLE
/// statement is ignored, as are all constraints. Only the column names
/// and datatypes matter. The CREATE TABLE statement string need not to
/// be held in persistent memory. The string can be deallocated and/or
/// reused as soon as the sqlite3_declare_vtab() routine returns.
///
///
///
/// The native database connection handle.
///
///
/// The original native pointer value that was provided to the
/// sqlite3_create_module(), sqlite3_create_module_v2() or
/// sqlite3_create_disposable_module() functions.
///
///
/// The number of arguments from the CREATE VIRTUAL TABLE statement.
///
///
/// The array of string arguments from the CREATE VIRTUAL TABLE
/// statement.
///
///
/// Upon success, this parameter must be modified to point to the newly
/// created native sqlite3_vtab derived structure.
///
///
/// Upon failure, this parameter must be modified to point to the error
/// message, with the underlying memory having been obtained from the
/// sqlite3_malloc() function.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xCreate(
IntPtr pDb,
IntPtr pAux,
int argc,
IntPtr argv,
ref IntPtr pVtab,
ref IntPtr pError
);
///////////////////////////////////////////////////////////////////////
///
///
/// The xConnect method is very similar to xCreate. It has the same
/// parameters and constructs a new sqlite3_vtab structure just like
/// xCreate. And it must also call sqlite3_declare_vtab() like xCreate.
///
///
/// The difference is that xConnect is called to establish a new
/// connection to an existing virtual table whereas xCreate is called
/// to create a new virtual table from scratch.
///
///
/// The xCreate and xConnect methods are only different when the
/// virtual table has some kind of backing store that must be
/// initialized the first time the virtual table is created. The
/// xCreate method creates and initializes the backing store. The
/// xConnect method just connects to an existing backing store.
///
///
/// As an example, consider a virtual table implementation that
/// provides read-only access to existing comma-separated-value (CSV)
/// files on disk. There is no backing store that needs to be created
/// or initialized for such a virtual table (since the CSV files
/// already exist on disk) so the xCreate and xConnect methods will be
/// identical for that module.
///
///
/// Another example is a virtual table that implements a full-text
/// index. The xCreate method must create and initialize data
/// structures to hold the dictionary and posting lists for that index.
/// The xConnect method, on the other hand, only has to locate and use
/// an existing dictionary and posting lists that were created by a
/// prior xCreate call.
///
///
/// The xConnect method must return SQLITE_OK if it is successful in
/// creating the new virtual table, or SQLITE_ERROR if it is not
/// successful. If not successful, the sqlite3_vtab structure must not
/// be allocated. An error message may optionally be returned in *pzErr
/// if unsuccessful. Space to hold the error message string must be
/// allocated using an SQLite memory allocation function like
/// sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
/// attempt to free the space using sqlite3_free() after the error has
/// been reported up to the application.
///
///
/// The xConnect method is required for every virtual table
/// implementation, though the xCreate and xConnect pointers of the
/// sqlite3_module object may point to the same function the virtual
/// table does not need to initialize backing store.
///
///
///
/// The native database connection handle.
///
///
/// The original native pointer value that was provided to the
/// sqlite3_create_module(), sqlite3_create_module_v2() or
/// sqlite3_create_disposable_module() functions.
///
///
/// The number of arguments from the CREATE VIRTUAL TABLE statement.
///
///
/// The array of string arguments from the CREATE VIRTUAL TABLE
/// statement.
///
///
/// Upon success, this parameter must be modified to point to the newly
/// created native sqlite3_vtab derived structure.
///
///
/// Upon failure, this parameter must be modified to point to the error
/// message, with the underlying memory having been obtained from the
/// sqlite3_malloc() function.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xConnect(
IntPtr pDb,
IntPtr pAux,
int argc,
IntPtr argv,
ref IntPtr pVtab,
ref IntPtr pError
);
///////////////////////////////////////////////////////////////////////
///
///
/// SQLite uses the xBestIndex method of a virtual table module to
/// determine the best way to access the virtual table. The xBestIndex
/// method has a prototype like this:
///
///
/// int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
///
///
/// The SQLite core communicates with the xBestIndex method by filling
/// in certain fields of the sqlite3_index_info structure and passing a
/// pointer to that structure into xBestIndex as the second parameter.
/// The xBestIndex method fills out other fields of this structure
/// which forms the reply. The sqlite3_index_info structure looks like
/// this:
///
///
/// struct sqlite3_index_info {
/// /* Inputs */
/// const int nConstraint; /* Number of entries in aConstraint */
/// const struct sqlite3_index_constraint {
/// int iColumn; /* Column on left-hand side of
/// * constraint */
/// unsigned char op; /* Constraint operator */
/// unsigned char usable; /* True if this constraint is usable */
/// int iTermOffset; /* Used internally - xBestIndex should
/// * ignore */
/// } *const aConstraint; /* Table of WHERE clause constraints */
/// const int nOrderBy; /* Number of terms in the ORDER BY
/// * clause */
/// const struct sqlite3_index_orderby {
/// int iColumn; /* Column number */
/// unsigned char desc; /* True for DESC. False for ASC. */
/// } *const aOrderBy; /* The ORDER BY clause */
/// /* Outputs */
/// struct sqlite3_index_constraint_usage {
/// int argvIndex; /* if greater than zero, constraint is
/// * part of argv to xFilter */
/// unsigned char omit; /* Do not code a test for this
/// * constraint */
/// } *const aConstraintUsage;
/// int idxNum; /* Number used to identify the index */
/// char *idxStr; /* String, possibly obtained from
/// * sqlite3_malloc() */
/// int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if
/// * true */
/// int orderByConsumed; /* True if output is already ordered */
/// double estimatedCost; /* Estimated cost of using this index */
/// };
///
///
/// In addition, there are some defined constants:
///
///
/// #define SQLITE_INDEX_CONSTRAINT_EQ 2
/// #define SQLITE_INDEX_CONSTRAINT_GT 4
/// #define SQLITE_INDEX_CONSTRAINT_LE 8
/// #define SQLITE_INDEX_CONSTRAINT_LT 16
/// #define SQLITE_INDEX_CONSTRAINT_GE 32
/// #define SQLITE_INDEX_CONSTRAINT_MATCH 64
///
///
/// The SQLite core calls the xBestIndex method when it is compiling a
/// query that involves a virtual table. In other words, SQLite calls
/// this method when it is running sqlite3_prepare() or the equivalent.
/// By calling this method, the SQLite core is saying to the virtual
/// table that it needs to access some subset of the rows in the
/// virtual table and it wants to know the most efficient way to do
/// that access. The xBestIndex method replies with information that
/// the SQLite core can then use to conduct an efficient search of the
/// virtual table.
///
///
/// While compiling a single SQL query, the SQLite core might call
/// xBestIndex multiple times with different settings in
/// sqlite3_index_info. The SQLite core will then select the
/// combination that appears to give the best performance.
///
///
/// Before calling this method, the SQLite core initializes an instance
/// of the sqlite3_index_info structure with information about the
/// query that it is currently trying to process. This information
/// derives mainly from the WHERE clause and ORDER BY or GROUP BY
/// clauses of the query, but also from any ON or USING clauses if the
/// query is a join. The information that the SQLite core provides to
/// the xBestIndex method is held in the part of the structure that is
/// marked as "Inputs". The "Outputs" section is initialized to zero.
///
///
/// The information in the sqlite3_index_info structure is ephemeral
/// and may be overwritten or deallocated as soon as the xBestIndex
/// method returns. If the xBestIndex method needs to remember any part
/// of the sqlite3_index_info structure, it should make a copy. Care
/// must be take to store the copy in a place where it will be
/// deallocated, such as in the idxStr field with needToFreeIdxStr set
/// to 1.
///
///
/// Note that xBestIndex will always be called before xFilter, since
/// the idxNum and idxStr outputs from xBestIndex are required inputs
/// to xFilter. However, there is no guarantee that xFilter will be
/// called following a successful xBestIndex.
///
///
/// The xBestIndex method is required for every virtual table
/// implementation.
///
///
/// 2.3.1 Inputs
///
///
/// The main thing that the SQLite core is trying to communicate to the
/// virtual table is the constraints that are available to limit the
/// number of rows that need to be searched. The aConstraint[] array
/// contains one entry for each constraint. There will be exactly
/// nConstraint entries in that array.
///
///
/// Each constraint will correspond to a term in the WHERE clause or in
/// a USING or ON clause that is of the form
///
///
/// column OP EXPR
///
///
/// Where "column" is a column in the virtual table, OP is an operator
/// like "=" or "<", and EXPR is an arbitrary expression. So, for
/// example, if the WHERE clause contained a term like this:
///
///
/// a = 5
///
///
/// Then one of the constraints would be on the "a" column with
/// operator "=" and an expression of "5". Constraints need not have a
/// literal representation of the WHERE clause. The query optimizer
/// might make transformations to the WHERE clause in order to extract
/// as many constraints as it can. So, for example, if the WHERE clause
/// contained something like this:
///
///
/// x BETWEEN 10 AND 100 AND 999>y
///
///
/// The query optimizer might translate this into three separate
/// constraints:
///
///
/// x >= 10
/// x <= 100
/// y < 999
///
///
/// For each constraint, the aConstraint[].iColumn field indicates
/// which column appears on the left-hand side of the constraint. The
/// first column of the virtual table is column 0. The rowid of the
/// virtual table is column -1. The aConstraint[].op field indicates
/// which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map
/// integer constants into operator values. Columns occur in the order
/// they were defined by the call to sqlite3_declare_vtab() in the
/// xCreate or xConnect method. Hidden columns are counted when
/// determining the column index.
///
///
/// The aConstraint[] array contains information about all constraints
/// that apply to the virtual table. But some of the constraints might
/// not be usable because of the way tables are ordered in a join. The
/// xBestIndex method must therefore only consider constraints that
/// have an aConstraint[].usable flag which is true.
///
///
/// In addition to WHERE clause constraints, the SQLite core also tells
/// the xBestIndex method about the ORDER BY clause. (In an aggregate
/// query, the SQLite core might put in GROUP BY clause information in
/// place of the ORDER BY clause information, but this fact should not
/// make any difference to the xBestIndex method.) If all terms of the
/// ORDER BY clause are columns in the virtual table, then nOrderBy
/// will be the number of terms in the ORDER BY clause and the
/// aOrderBy[] array will identify the column for each term in the
/// order by clause and whether or not that column is ASC or DESC.
///
///
/// 2.3.2 Outputs
///
///
/// Given all of the information above, the job of the xBestIndex
/// method it to figure out the best way to search the virtual table.
///
///
/// The xBestIndex method fills the idxNum and idxStr fields with
/// information that communicates an indexing strategy to the xFilter
/// method. The information in idxNum and idxStr is arbitrary as far as
/// the SQLite core is concerned. The SQLite core just copies the
/// information through to the xFilter method. Any desired meaning can
/// be assigned to idxNum and idxStr as long as xBestIndex and xFilter
/// agree on what that meaning is.
///
///
/// The idxStr value may be a string obtained from an SQLite memory
/// allocation function such as sqlite3_mprintf(). If this is the case,
/// then the needToFreeIdxStr flag must be set to true so that the
/// SQLite core will know to call sqlite3_free() on that string when it
/// has finished with it, and thus avoid a memory leak.
///
///
/// If the virtual table will output rows in the order specified by the
/// ORDER BY clause, then the orderByConsumed flag may be set to true.
/// If the output is not automatically in the correct order then
/// orderByConsumed must be left in its default false setting. This
/// will indicate to the SQLite core that it will need to do a separate
/// sorting pass over the data after it comes out of the virtual table.
///
///
/// The estimatedCost field should be set to the estimated number of
/// disk access operations required to execute this query against the
/// virtual table. The SQLite core will often call xBestIndex multiple
/// times with different constraints, obtain multiple cost estimates,
/// then choose the query plan that gives the lowest estimate.
///
///
/// The aConstraintUsage[] array contains one element for each of the
/// nConstraint constraints in the inputs section of the
/// sqlite3_index_info structure. The aConstraintUsage[] array is used
/// by xBestIndex to tell the core how it is using the constraints.
///
///
/// The xBestIndex method may set aConstraintUsage[].argvIndex entries
/// to values greater than one. Exactly one entry should be set to 1,
/// another to 2, another to 3, and so forth up to as many or as few as
/// the xBestIndex method wants. The EXPR of the corresponding
/// constraints will then be passed in as the argv[] parameters to
/// xFilter.
///
///
/// For example, if the aConstraint[3].argvIndex is set to 1, then when
/// xFilter is called, the argv[0] passed to xFilter will have the EXPR
/// value of the aConstraint[3] constraint.
///
///
/// By default, the SQLite core double checks all constraints on each
/// row of the virtual table that it receives. If such a check is
/// redundant, the xBestFilter method can suppress that double-check by
/// setting aConstraintUsage[].omit.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// The native pointer to the sqlite3_index_info structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xBestIndex(
IntPtr pVtab,
IntPtr pIndex
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method releases a connection to a virtual table. Only the
/// sqlite3_vtab object is destroyed. The virtual table is not
/// destroyed and any backing store associated with the virtual table
/// persists. This method undoes the work of xConnect.
///
///
/// This method is a destructor for a connection to the virtual table.
/// Contrast this method with xDestroy. The xDestroy is a destructor
/// for the entire virtual table.
///
///
/// The xDisconnect method is required for every virtual table
/// implementation, though it is acceptable for the xDisconnect and
/// xDestroy methods to be the same function if that makes sense for
/// the particular virtual table.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xDisconnect(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method releases a connection to a virtual table, just like the
/// xDisconnect method, and it also destroys the underlying table
/// implementation. This method undoes the work of xCreate.
///
///
/// The xDisconnect method is called whenever a database connection
/// that uses a virtual table is closed. The xDestroy method is only
/// called when a DROP TABLE statement is executed against the virtual
/// table.
///
///
/// The xDestroy method is required for every virtual table
/// implementation, though it is acceptable for the xDisconnect and
/// xDestroy methods to be the same function if that makes sense for
/// the particular virtual table.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xDestroy(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// The xOpen method creates a new cursor used for accessing (read
/// and/or writing) a virtual table. A successful invocation of this
/// method will allocate the memory for the sqlite3_vtab_cursor (or a
/// subclass), initialize the new object, and make *ppCursor point to
/// the new object. The successful call then returns SQLITE_OK.
///
///
/// For every successful call to this method, the SQLite core will
/// later invoke the xClose method to destroy the allocated cursor.
///
///
/// The xOpen method need not initialize the pVtab field of the
/// sqlite3_vtab_cursor structure. The SQLite core will take care of
/// that chore automatically.
///
///
/// A virtual table implementation must be able to support an arbitrary
/// number of simultaneously open cursors.
///
///
/// When initially opened, the cursor is in an undefined state. The
/// SQLite core will invoke the xFilter method on the cursor prior to
/// any attempt to position or read from the cursor.
///
///
/// The xOpen method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// Upon success, this parameter must be modified to point to the newly
/// created native sqlite3_vtab_cursor derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xOpen(
IntPtr pVtab,
ref IntPtr pCursor
);
///////////////////////////////////////////////////////////////////////
///
///
/// The xClose method closes a cursor previously opened by xOpen. The
/// SQLite core will always call xClose once for each cursor opened
/// using xOpen.
///
///
/// This method must release all resources allocated by the
/// corresponding xOpen call. The routine will not be called again even
/// if it returns an error. The SQLite core will not use the
/// sqlite3_vtab_cursor again after it has been closed.
///
///
/// The xClose method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xClose(
IntPtr pCursor
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method begins a search of a virtual table. The first argument
/// is a cursor opened by xOpen. The next two argument define a
/// particular search index previously chosen by xBestIndex. The
/// specific meanings of idxNum and idxStr are unimportant as long as
/// xFilter and xBestIndex agree on what that meaning is.
///
///
/// The xBestIndex function may have requested the values of certain
/// expressions using the aConstraintUsage[].argvIndex values of the
/// sqlite3_index_info structure. Those values are passed to xFilter
/// using the argc and argv parameters.
///
///
/// If the virtual table contains one or more rows that match the
/// search criteria, then the cursor must be left point at the first
/// row. Subsequent calls to xEof must return false (zero). If there
/// are no rows match, then the cursor must be left in a state that
/// will cause the xEof to return true (non-zero). The SQLite engine
/// will use the xColumn and xRowid methods to access that row content.
/// The xNext method will be used to advance to the next row.
///
///
/// This method must return SQLITE_OK if successful, or an sqlite error
/// code if an error occurs.
///
///
/// The xFilter method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// Number used to help identify the selected index.
///
///
/// The native pointer to the UTF-8 encoded string containing the
/// string used to help identify the selected index.
///
///
/// The number of native pointers to sqlite3_value structures specified
/// in .
///
///
/// An array of native pointers to sqlite3_value structures containing
/// filtering criteria for the selected index.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xFilter(
IntPtr pCursor,
int idxNum,
IntPtr idxStr,
int argc,
IntPtr argv
);
///////////////////////////////////////////////////////////////////////
///
///
/// The xNext method advances a virtual table cursor to the next row of
/// a result set initiated by xFilter. If the cursor is already
/// pointing at the last row when this routine is called, then the
/// cursor no longer points to valid data and a subsequent call to the
/// xEof method must return true (non-zero). If the cursor is
/// successfully advanced to another row of content, then subsequent
/// calls to xEof must return false (zero).
///
///
/// This method must return SQLITE_OK if successful, or an sqlite error
/// code if an error occurs.
///
///
/// The xNext method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xNext(
IntPtr pCursor
);
///////////////////////////////////////////////////////////////////////
///
///
/// The xEof method must return false (zero) if the specified cursor
/// currently points to a valid row of data, or true (non-zero)
/// otherwise. This method is called by the SQL engine immediately
/// after each xFilter and xNext invocation.
///
///
/// The xEof method is required for every virtual table implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// Non-zero if no more rows are available; zero otherwise.
///
int xEof(
IntPtr pCursor
);
///////////////////////////////////////////////////////////////////////
///
///
/// The SQLite core invokes this method in order to find the value for
/// the N-th column of the current row. N is zero-based so the first
/// column is numbered 0. The xColumn method may return its result back
/// to SQLite using one of the following interface:
///
///
/// sqlite3_result_blob()
/// sqlite3_result_double()
/// sqlite3_result_int()
/// sqlite3_result_int64()
/// sqlite3_result_null()
/// sqlite3_result_text()
/// sqlite3_result_text16()
/// sqlite3_result_text16le()
/// sqlite3_result_text16be()
/// sqlite3_result_zeroblob()
///
///
/// If the xColumn method implementation calls none of the functions
/// above, then the value of the column defaults to an SQL NULL.
///
///
/// To raise an error, the xColumn method should use one of the
/// result_text() methods to set the error message text, then return an
/// appropriate error code. The xColumn method must return SQLITE_OK on
/// success.
///
///
/// The xColumn method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// The native pointer to the sqlite3_context structure to be used
/// for returning the specified column value to the SQLite core
/// library.
///
///
/// The zero-based index corresponding to the column containing the
/// value to be returned.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xColumn(
IntPtr pCursor,
IntPtr pContext,
int index
);
///////////////////////////////////////////////////////////////////////
///
///
/// A successful invocation of this method will cause *pRowid to be
/// filled with the rowid of row that the virtual table cursor pCur is
/// currently pointing at. This method returns SQLITE_OK on success. It
/// returns an appropriate error code on failure.
///
///
/// The xRowid method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab_cursor derived structure.
///
///
/// Upon success, this parameter must be modified to contain the unique
/// integer row identifier for the current row for the specified cursor.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xRowId(
IntPtr pCursor,
ref long rowId
);
///////////////////////////////////////////////////////////////////////
///
///
/// All changes to a virtual table are made using the xUpdate method.
/// This one method can be used to insert, delete, or update.
///
///
/// The argc parameter specifies the number of entries in the argv
/// array. The value of argc will be 1 for a pure delete operation or
/// N+2 for an insert or replace or update where N is the number of
/// columns in the table. In the previous sentence, N includes any
/// hidden columns.
///
///
/// Every argv entry will have a non-NULL value in C but may contain
/// the SQL value NULL. In other words, it is always true that
/// argv[i]!=0 for i between 0 and argc-1. However, it might be the
/// case that sqlite3_value_type(argv[i])==SQLITE_NULL.
///
///
/// The argv[0] parameter is the rowid of a row in the virtual table
/// to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.
///
///
/// The argv[1] parameter is the rowid of a new row to be inserted into
/// the virtual table. If argv[1] is an SQL NULL, then the
/// implementation must choose a rowid for the newly inserted row.
/// Subsequent argv[] entries contain values of the columns of the
/// virtual table, in the order that the columns were declared. The
/// number of columns will match the table declaration that the
/// xConnect or xCreate method made using the sqlite3_declare_vtab()
/// call. All hidden columns are included.
///
///
/// When doing an insert without a rowid (argc>1, argv[1] is an SQL
/// NULL), the implementation must set *pRowid to the rowid of the
/// newly inserted row; this will become the value returned by the
/// sqlite3_last_insert_rowid() function. Setting this value in all the
/// other cases is a harmless no-op; the SQLite engine ignores the
/// *pRowid return value if argc==1 or argv[1] is not an SQL NULL.
///
///
/// Each call to xUpdate will fall into one of cases shown below. Note
/// that references to argv[i] mean the SQL value held within the
/// argv[i] object, not the argv[i] object itself.
///
///
/// argc = 1
///
///
/// The single row with rowid equal to argv[0] is deleted. No
/// insert occurs.
///
///
/// argc > 1
/// argv[0] = NULL
///
///
/// A new row is inserted with a rowid argv[1] and column
/// values in argv[2] and following. If argv[1] is an SQL NULL,
/// the a new unique rowid is generated automatically.
///
///
/// argc > 1
/// argv[0] ? NULL
/// argv[0] = argv[1]
///
///
/// The row with rowid argv[0] is updated with new values in
/// argv[2] and following parameters.
///
///
/// argc > 1
/// argv[0] ? NULL
/// argv[0] ? argv[1]
///
///
/// The row with rowid argv[0] is updated with rowid argv[1]
/// and new values in argv[2] and following parameters. This
/// will occur when an SQL statement updates a rowid, as in
/// the statement:
///
///
/// UPDATE table SET rowid=rowid+1 WHERE ...;
///
///
/// The xUpdate method must return SQLITE_OK if and only if it is
/// successful. If a failure occurs, the xUpdate must return an
/// appropriate error code. On a failure, the pVTab->zErrMsg element
/// may optionally be replaced with error message text stored in memory
/// allocated from SQLite using functions such as sqlite3_mprintf() or
/// sqlite3_malloc().
///
///
/// If the xUpdate method violates some constraint of the virtual table
/// (including, but not limited to, attempting to store a value of the
/// wrong datatype, attempting to store a value that is too large or
/// too small, or attempting to change a read-only value) then the
/// xUpdate must fail with an appropriate error code.
///
///
/// There might be one or more sqlite3_vtab_cursor objects open and in
/// use on the virtual table instance and perhaps even on the row of
/// the virtual table when the xUpdate method is invoked. The
/// implementation of xUpdate must be prepared for attempts to delete
/// or modify rows of the table out from other existing cursors. If the
/// virtual table cannot accommodate such changes, the xUpdate method
/// must return an error code.
///
///
/// The xUpdate method is optional. If the xUpdate pointer in the
/// sqlite3_module for a virtual table is a NULL pointer, then the
/// virtual table is read-only.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// The number of new or modified column values contained in
/// .
///
///
/// The array of native pointers to sqlite3_value structures containing
/// the new or modified column values, if any.
///
///
/// Upon success, this parameter must be modified to contain the unique
/// integer row identifier for the row that was inserted, if any.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xUpdate(
IntPtr pVtab,
int argc,
IntPtr argv,
ref long rowId
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method begins a transaction on a virtual table. This is method
/// is optional. The xBegin pointer of sqlite3_module may be NULL.
///
///
/// This method is always followed by one call to either the xCommit or
/// xRollback method. Virtual table transactions do not nest, so the
/// xBegin method will not be invoked more than once on a single
/// virtual table without an intervening call to either xCommit or
/// xRollback. Multiple calls to other methods can and likely will
/// occur in between the xBegin and the corresponding xCommit or
/// xRollback.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xBegin(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method signals the start of a two-phase commit on a virtual
/// table. This is method is optional. The xSync pointer of
/// sqlite3_module may be NULL.
///
///
/// This method is only invoked after call to the xBegin method and
/// prior to an xCommit or xRollback. In order to implement two-phase
/// commit, the xSync method on all virtual tables is invoked prior to
/// invoking the xCommit method on any virtual table. If any of the
/// xSync methods fail, the entire transaction is rolled back.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xSync(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method causes a virtual table transaction to commit. This is
/// method is optional. The xCommit pointer of sqlite3_module may be
/// NULL.
///
///
/// A call to this method always follows a prior call to xBegin and
/// xSync.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xCommit(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method causes a virtual table transaction to rollback. This is
/// method is optional. The xRollback pointer of sqlite3_module may be
/// NULL.
///
///
/// A call to this method always follows a prior call to xBegin.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xRollback(
IntPtr pVtab
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method provides notification that the virtual table
/// implementation that the virtual table will be given a new name. If
/// this method returns SQLITE_OK then SQLite renames the table. If
/// this method returns an error code then the renaming is prevented.
///
///
/// The xRename method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// The number of arguments to the function being sought.
///
///
/// The name of the function being sought.
///
///
/// Upon success, this parameter must be modified to contain the
/// delegate responsible for implementing the specified function.
///
///
/// Upon success, this parameter must be modified to contain the
/// native user-data pointer associated with
/// .
///
///
/// Non-zero if the specified function was found; zero otherwise.
///
int xFindFunction(
IntPtr pVtab,
int nArg,
IntPtr zName,
ref SQLiteCallback callback,
ref IntPtr pClientData
);
///////////////////////////////////////////////////////////////////////
///
///
/// This method provides notification that the virtual table
/// implementation that the virtual table will be given a new name. If
/// this method returns SQLITE_OK then SQLite renames the table. If
/// this method returns an error code then the renaming is prevented.
///
///
/// The xRename method is required for every virtual table
/// implementation.
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// The native pointer to the UTF-8 encoded string containing the new
/// name for the virtual table.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xRename(
IntPtr pVtab,
IntPtr zNew
);
///////////////////////////////////////////////////////////////////////
///
///
/// These methods provide the virtual table implementation an
/// opportunity to implement nested transactions. They are always
/// optional and will only be called in SQLite version 3.7.7 and later.
///
///
/// When xSavepoint(X,N) is invoked, that is a signal to the virtual
/// table X that it should save its current state as savepoint N. A
/// subsequent call to xRollbackTo(X,R) means that the state of the
/// virtual table should return to what it was when xSavepoint(X,R) was
/// last called. The call to xRollbackTo(X,R) will invalidate all
/// savepoints with N>R; none of the invalided savepoints will be
/// rolled back or released without first being reinitialized by a call
/// to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
/// where N>=M.
///
///
/// None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
/// ever be called except in between calls to xBegin() and either
/// xCommit() or xRollback().
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// This is an integer identifier under which the the current state of
/// the virtual table should be saved.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xSavepoint(
IntPtr pVtab,
int iSavepoint
);
///////////////////////////////////////////////////////////////////////
///
///
/// These methods provide the virtual table implementation an
/// opportunity to implement nested transactions. They are always
/// optional and will only be called in SQLite version 3.7.7 and later.
///
///
/// When xSavepoint(X,N) is invoked, that is a signal to the virtual
/// table X that it should save its current state as savepoint N. A
/// subsequent call to xRollbackTo(X,R) means that the state of the
/// virtual table should return to what it was when xSavepoint(X,R) was
/// last called. The call to xRollbackTo(X,R) will invalidate all
/// savepoints with N>R; none of the invalided savepoints will be
/// rolled back or released without first being reinitialized by a call
/// to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
/// where N>=M.
///
///
/// None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
/// ever be called except in between calls to xBegin() and either
/// xCommit() or xRollback().
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// This is an integer used to indicate that any saved states with an
/// identifier greater than or equal to this should be deleted by the
/// virtual table.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xRelease(
IntPtr pVtab,
int iSavepoint
);
///////////////////////////////////////////////////////////////////////
///
///
/// These methods provide the virtual table implementation an
/// opportunity to implement nested transactions. They are always
/// optional and will only be called in SQLite version 3.7.7 and later.
///
///
/// When xSavepoint(X,N) is invoked, that is a signal to the virtual
/// table X that it should save its current state as savepoint N. A
/// subsequent call to xRollbackTo(X,R) means that the state of the
/// virtual table should return to what it was when xSavepoint(X,R) was
/// last called. The call to xRollbackTo(X,R) will invalidate all
/// savepoints with N>R; none of the invalided savepoints will be
/// rolled back or released without first being reinitialized by a call
/// to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
/// where N>=M.
///
///
/// None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
/// ever be called except in between calls to xBegin() and either
/// xCommit() or xRollback().
///
///
///
/// The native pointer to the sqlite3_vtab derived structure.
///
///
/// This is an integer identifier used to specify a specific saved
/// state for the virtual table for it to restore itself back to, which
/// should also have the effect of deleting all saved states with an
/// integer identifier greater than this one.
///
///
/// A standard SQLite return code.
///
SQLiteErrorCode xRollbackTo(
IntPtr pVtab,
int iSavepoint
);
}
#endregion
}