| Class | Amalgalite::SQLite3::Database |
| In: |
lib/amalgalite/sqlite3/database/status.rb
ext/amalgalite3.c |
| Parent: | Object |
Encapsulate an SQLite3 database
Create a new SQLite3 database with a UTF-8 encoding.
/**
* Document-method: open
*
* call-seq:
* Amalagliate::SQLite3::Database.open( filename, flags = READWRITE | CREATE ) -> Database
*
* Create a new SQLite3 database with a UTF-8 encoding.
*
*/
VALUE am_sqlite3_database_open(int argc, VALUE *argv, VALUE class)
{
VALUE self = am_sqlite3_database_alloc(class);
VALUE rFlags;
VALUE rFilename;
int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
char* filename;
int rc;
am_sqlite3* am_db;
/* at least a filename argument is required */
rb_scan_args( argc, argv, "11", &rFilename, &rFlags );
/* convert flags to the sqlite version */
flags = ( Qnil == rFlags ) ? flags : FIX2INT(rFlags);
filename = StringValuePtr(rFilename);
/* extract the sqlite3 wrapper struct */
Data_Get_Struct(self, am_sqlite3, am_db);
/* open the sqlite3 database */
rc = sqlite3_open_v2( filename, &(am_db->db), flags, 0);
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure to open database %s : [SQLITE_ERROR %d] : %s\n",
filename, rc, sqlite3_errmsg(am_db->db));
}
/* by default turn on the extended result codes */
rc = sqlite3_extended_result_codes( am_db->db, 1);
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure to set extended result codes %s : [SQLITE_ERROR %d] : %s\n",
filename, rc, sqlite3_errmsg(am_db->db));
}
return self;
}
Create a new SQLite3 database with a UTF-16 encoding
/**
* call-seq:
* Amalgalite::SQLite3::Database.open16( filename ) -> SQLite3::Database
*
* Create a new SQLite3 database with a UTF-16 encoding
*
*/
VALUE am_sqlite3_database_open16(VALUE class, VALUE rFilename)
{
VALUE self = am_sqlite3_database_alloc(class);
char* filename = StringValuePtr(rFilename);
am_sqlite3* am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_open16( filename, &(am_db->db) );
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure to open UTF-16 database %s : [SQLITE_ERROR %d] : %s\n",
filename, rc, sqlite3_errmsg( am_db->db ));
}
/* by default turn on the extended result codes */
rc = sqlite3_extended_result_codes( am_db->db, 1);
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure to set extended result codes on UTF-16 database %s : [SQLITE_ERROR %d] : %s\n",
filename, rc, sqlite3_errmsg16(am_db->db));
}
return self;
}
return true if the database is in autocommit mode, otherwise return false
/**
* call-seq:
* database.autocommit? -> true or false
*
* return true if the database is in autocommit mode, otherwise return false
*
*/
VALUE am_sqlite3_database_is_autocommit(VALUE self)
{
am_sqlite3 *am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_get_autocommit( am_db->db );
return ( 0 == rc ) ? Qfalse : Qtrue ;
}
Close the database
/**
* call-seq:
* database.close
*
* Close the database
*/
VALUE am_sqlite3_database_close(VALUE self)
{
am_sqlite3 *am_db;
int rc = 0;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_close( am_db->db );
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure to close database : [SQLITE_ERROR %d] : %s\n",
rc, sqlite3_errmsg( am_db->db ));
}
return self;
}
return the last error code that happened in the database
/**
* call-seq:
* database.last_error_code -> Integer
*
* return the last error code that happened in the database
*
*/
VALUE am_sqlite3_database_last_error_code(VALUE self)
{
am_sqlite3 *am_db;
int code;
Data_Get_Struct(self, am_sqlite3, am_db);
code = sqlite3_errcode( am_db->db );
return INT2FIX( code );
}
return the last error message that happened in the database
/**
* call-seq:
* database.last_error_message -> String
*
* return the last error message that happened in the database
*
*/
VALUE am_sqlite3_database_last_error_message(VALUE self)
{
am_sqlite3 *am_db;
const char *message;
Data_Get_Struct(self, am_sqlite3, am_db);
message = sqlite3_errmsg( am_db->db );
return rb_str_new2( message );
}
Return the rowid of the last row inserted into the database from this database connection.
/**
* call-seq:
* database.last_insert_rowid -> Integer
*
* Return the rowid of the last row inserted into the database from this
* database connection.
*/
VALUE am_sqlite3_database_last_insert_rowid(VALUE self)
{
am_sqlite3 *am_db;
sqlite3_int64 last_id;
Data_Get_Struct(self, am_sqlite3, am_db);
last_id = sqlite3_last_insert_rowid( am_db->db );
return SQLINT64_2NUM( last_id );
}
Create a new SQLite3 statement.
/**
* call-seq:
* database.prepare( sql ) -> SQLite3::Statement
*
* Create a new SQLite3 statement.
*/
VALUE am_sqlite3_database_prepare(VALUE self, VALUE rSQL)
{
VALUE sql = StringValue( rSQL );
VALUE stmt = am_sqlite3_statement_alloc(cAS_Statement);
am_sqlite3 *am_db;
am_sqlite3_stmt *am_stmt;
const char *tail;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
Data_Get_Struct(stmt, am_sqlite3_stmt, am_stmt);
rc = sqlite3_prepare_v2( am_db->db, RSTRING(sql)->ptr, RSTRING(sql)->len,
&(am_stmt->stmt), &tail);
if ( SQLITE_OK != rc) {
rb_raise(eAS_Error, "Failure to prepare statement %s : [SQLITE_ERROR %d] : %s\n",
RSTRING(sql)->ptr, rc, sqlite3_errmsg(am_db->db));
am_sqlite3_statement_free( am_stmt );
}
if ( tail != NULL ) {
am_stmt->remaining_sql = rb_str_new2( tail );
rb_gc_register_address( &(am_stmt->remaining_sql) );
} else {
am_stmt->remaining_sql = Qnil;
}
return stmt;
}
This registers an object to be called with every profile event in SQLite.
This is an experimental api and is subject to change or removal.
/**
* call-seq:
* database.register_profile_tap( tap_obj )
*
* This registers an object to be called with every profile event in SQLite.
*
* This is an experimental api and is subject to change or removal.
*
*/
VALUE am_sqlite3_database_register_profile_tap(VALUE self, VALUE tap)
{
am_sqlite3 *am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
/* Qnil, unregister the item and tell the garbage collector we are done with
* it.
*/
if ( tap == Qnil ) {
sqlite3_profile( am_db->db, NULL, NULL );
rb_gc_unregister_address( &(am_db->profile_obj) );
am_db->profile_obj = Qnil;
/* register the item and store the reference to the object in the am_db
* structure. We also have to tell the Ruby garbage collector that we
* point to the Ruby object from C.
*/
} else {
am_db->profile_obj = tap;
rb_gc_register_address( &(am_db->profile_obj) );
sqlite3_profile( am_db->db, amalgalite_xProfile, (void *)am_db->profile_obj );
}
return Qnil;
}
This registers an object to be called with every trace event in SQLite.
This is an experimental api and is subject to change, or removal.
/**
* call-seq:
* database.register_trace_tap( tap_obj )
*
* This registers an object to be called with every trace event in SQLite.
*
* This is an experimental api and is subject to change, or removal.
*
*/
VALUE am_sqlite3_database_register_trace_tap(VALUE self, VALUE tap)
{
am_sqlite3 *am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
/* Qnil, unregister the item and tell the garbage collector we are done with
* it.
*/
if ( Qnil == tap ) {
sqlite3_trace( am_db->db, NULL, NULL );
rb_gc_unregister_address( &(am_db->trace_obj) );
am_db->trace_obj = Qnil;
/* register the item and store the reference to the object in the am_db
* structure. We also have to tell the Ruby garbage collector that we
* point to the Ruby object from C.
*/
} else {
am_db->trace_obj = tap;
rb_gc_register_address( &(am_db->trace_obj) );
sqlite3_trace( am_db->db, amalgalite_xTrace, (void *)am_db->trace_obj );
}
return Qnil;
}
return the number of rows changed with the most recent INSERT, UPDATE or DELETE statement.
/**
* call-seq:
* database.row_changes -> Integer
*
* return the number of rows changed with the most recent INSERT, UPDATE or
* DELETE statement.
*
*/
VALUE am_sqlite3_database_row_changes(VALUE self)
{
am_sqlite3 *am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_changes( am_db->db );
return INT2FIX(rc);
}
return the DBstatus object for the sqlite database
# File lib/amalgalite/sqlite3/database/status.rb, line 66
66: def status
67: @status ||= DBStatus.new( self )
68: end
Returns a hash containing the meta information about the column. The available keys are:
| declared_data_type: | the declared data type of the column |
| collation_sequence_name: | the name of the collation sequence for the column |
| not_null_constraint: | True if the column has a NOT NULL constraint |
| primary_key: | True if the column is part of a primary key |
| auto_increment: | True if the column is AUTO INCREMENT |
/**
* call-seq:
* datatabase.table_column_metadata( db_name, table_name, column_name) -> Hash
*
* Returns a hash containing the meta information about the column. The
* available keys are:
*
* declared_data_type:: the declared data type of the column
* collation_sequence_name:: the name of the collation sequence for the column
* not_null_constraint:: True if the column has a NOT NULL constraint
* primary_key:: True if the column is part of a primary key
* auto_increment:: True if the column is AUTO INCREMENT
*
*/
VALUE am_sqlite3_database_table_column_metadata(VALUE self, VALUE db_name, VALUE tbl_name, VALUE col_name)
{
am_sqlite3 *am_db;
int rc;
/* input */
const char *zDbName = StringValuePtr( db_name );
const char *zTableName = StringValuePtr( tbl_name );
const char *zColumnName = StringValuePtr( col_name );
/* output */
const char *pzDataType = NULL;
const char *pzCollSeq = NULL;
int pNotNull, pPrimaryKey, pAutoinc;
VALUE rHash = rb_hash_new();
VALUE rStr = Qnil;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_table_column_metadata( am_db->db,
zDbName, zTableName, zColumnName,
&pzDataType, &pzCollSeq,
&pNotNull, &pPrimaryKey, &pAutoinc);
if ( SQLITE_OK != rc ) {
rb_raise(eAS_Error, "Failure retrieveing column meta data for table '%s' column '%s' : [SQLITE_ERROR %d] : %s\n",
zTableName, zColumnName, rc, sqlite3_errmsg( am_db-> db ));
}
rStr = ( NULL == pzDataType) ? Qnil : rb_str_new2( pzDataType );
rb_hash_aset( rHash, rb_str_new2("declared_data_type"), rStr );
rStr = ( NULL == pzCollSeq) ? Qnil : rb_str_new2( pzCollSeq );
rb_hash_aset( rHash, rb_str_new2("collation_sequence_name"), rStr );
rb_hash_aset( rHash, rb_str_new2("not_null_constraint"), ( pNotNull ? Qtrue : Qfalse ));
rb_hash_aset( rHash, rb_str_new2("primary_key"), ( pPrimaryKey ? Qtrue : Qfalse ));
rb_hash_aset( rHash, rb_str_new2("auto_increment"), ( pAutoinc ? Qtrue : Qfalse ));
return rHash;
}
return the number of rows changed by INSERT, UPDATE or DELETE statements in the database connection since the connection was opened.
/**
* call-seq:
* database.total_changes -> Integer
*
* return the number of rows changed by INSERT, UPDATE or DELETE statements
* in the database connection since the connection was opened.
*
*/
VALUE am_sqlite3_database_total_changes(VALUE self)
{
am_sqlite3 *am_db;
int rc;
Data_Get_Struct(self, am_sqlite3, am_db);
rc = sqlite3_total_changes( am_db->db );
return INT2FIX(rc);
}