Top level “methods”

*done* const char* sqlite3_libversion(void)
*done* int sqlite3_libversion_number(void)
*done* int sqlite3_threadsave(void)
*done* int sqlite3_complete(const char*sql);
*done* int sqlite3_complete16(const void *sql);

*done* sqlite3_int64 sqlite3_memory_used(void);
*done* sqlite3_int64 sqtlie3_memory_highwater(int resetFlag);
*done* void sqlite3_randomness(int N, void *p)

*future* int sqlite3_enabled_shared_cache(int); # TODO maybe
*future* int sqlite3_release_memory(int);   // maybe, hook into gc calls ?
*future* void sqlite3_soft_heap_limit(int);
*future* char* sqlite3_temp_directory;

UTF-8 vs. UTF-16


in cases where there is a xxx16() method in the C api, the ruby methods add a flag to the method.

Core 'Objects'

sqlite3 (typdef struct sqlite3) -> main database handle
-------
*done* int   sqlite3_open_v2(*filename, sqlite3**, flags, NULL)
*done* int   sqlite3_open16
*done* int   sqlite3_extended_result_codes(sqlite3, int onoff) # default to turning this on
*skipped* called during rb_raise
*skipped* const char *sqlite3_errmsg(sqlite3*);
*skipped* const void *sqlite3_errmsg16(sqlite3*);
*done* int   sqlite3_close(sqlite3 *)
*skipped* int   sqlite3_exec -> don't use, wrap in ruby exec
*done* sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*)
*done* int   sqlite3_get_autocommit(sqlite3*)
*done* int   sqlite3_changes(sqlite3*)
*done* int   sqlite3_total_changes(sqlite3*)
*skipped* int   sqlite3_errcode(sqlite3 *db)
*done* int sqlite3_prepare_v2(sqlite3* db, sql, nbyte, sqlite3_stmt**, const char **tail)

int sqlite3_prepare16_v2(sqlite3* db, sql, nbyte, sqlite3_stmt**, const char **tail)

// not yet, but implement if/when a purchase of sqlite3 encryption works
TODO: int sqlite3_key(sqlite3* db, const void *pKey, int nKey);
TODO: int sqlite3_rekey(sqlite3* db, const void *pKey, int nKey);

TODO: int   sqlite3_busy_timeout(sqlite3*)
*done* void  sqlite3_progress_hander(sqlite3*, int, int(*)(void*), void*)

*done* tracing should be an IO object, if it is true then send it to STDERR
*done* tracing should also yield a block like a transaction so that during the block the db has tracing turned on.
*done* sqlite3_trace

TODO: create Table and Column classes
TODO: int sqlite3_table_column_metadata();

for later implementation
________________________
sqlite3_enable_load_extensions
sqlite3_load_extension
sqlite3_interrupt
sqlite3_busy_handler(sqlite3*, function pointer, void *)

*skip - experimental* sqlite3_profile
*Skip - experimental* sqlite3_limit(sqlite3*, int id, int newVal) -- maybe implement
*skip - experimental* sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
*skip - experimental* sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
*skip - experimental* sqlite3_update_hook(sqlite3*, function ponter, void*);

sqlite3_stmt (typedef struct sqlite3_stmt) -> handle for statements
------------
*done* const char *sqlite3_sql(sqlite3_stmt *pStmt)
*done* int sqlite3_bind_parameter_count(sqlite3_stmt*);

*done* sqlite3_bind_double(sqlite3_stmt*, int, double);
*done* sqlite3_bind_int(sqlite3_stmt*, int, int);
*done* sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
*done* sqlite3_bind_null(sqlite3_stmt*, int);
*done* sqlite3_bind_text(sqlite3_stmt*, int, constc char*, int n, void(*)(void*));
* skipping *sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
*done* const char*  sqlite3_bind_parameter_name(sqlite3_stmt*, int )
*done* sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
*done* sqlite3_clear_bindings(sqlite3_stmt*);
*done* sqlite3_column_count(sqlite3_stmt *pStmt);
*done* sqlite3_column_name(sqlite3_stmt*, int N);
*skip - used internally* sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
*done* sqlite3_column_database_name(sqlite3_stmt*, int);
*done* sqlite3_column_table_name(sqlite3_stmt*, int);
*done* sqlite3_column_origin_name(sqlite3_stmt*, int);
*done* sqlite3_step(sqlite3_stmt*);
*done - as 'close' *int sqlite3_finalize(sqlite3_stmt *pStmt);
*done* int sqlite3_reset(sqlite3_stmt *pStmt);
*done - same as sqlite3_column_count* sqlite3_data_count(sqlite3_stmt *pStmt);
*do not use* sqlite3_value* sqlite3_column_value(sqlite3_stmt*, int iCol);

sqlite3_bind_text16(sqlite3_stmt*, int, constc char*, int, void(*)(void*));
* done *sqlite3_column_database_name16(sqlite3_stmt*, int);
* done *sqlite3_column_table_name16(sqlite3_stmt*, int);
* done *sqlite3_column_origin_name16(sqlite3_stmt*, int);
sqlite3_column_name16(sqlite3_stmt*, int N);

*done* sqlite3_column_decltype(sqlite3_stmt*, int);
sqlite3_column_decltype16(sqlite3_stmt*, int);

// use this to find the type and then call the appropriate method afterwards.
*done* sqlite3_column_type(sqlite3_stmt*, int iCol);

# binding by name or index, if passed in an array to the bind() method then
# bind by index, if passed in a hash, bind by name, using hte keys of the hash
*done* sqlite3_bind_blob(sqlite3_stmt*, int, const void *, int n, void(*)(void*));
*done* sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);

sqlite3_blob
------------
// BLOB
*done* sqlite3_blob_open(sqlite3*, *db, *table, *column, rowid, flags, **blob);
*done* sqlite3_blob_close(sqlite3_blob*)
*done* sqlite3_blob_bytes(sqlite3_blob*)
*done* sqlite3_blob_read(sqlite3_blob*, *to_buffer, bytes_to_read, starting_at_offset); 
*done* sqlite3_blob_write(sqlite3_blob*, *from_buffer, bytes_to_write, starting_at_offset);

Result Codes

*done* Convert to Individual Exceptions and allow the top level module generate them
based upon integer value