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
