DBD-SQLite
view release on metacpan or search on metacpan
XPUSHs( sv_2mortal( newSVpv( sql, 0 ) ) );
/*
* The profile callback time is in units of nanoseconds,
* however the current implementation is only capable of
* millisecond resolution so the six least significant digits
* in the time are meaningless.
* (http://sqlite.org/c3ref/profile.html)
*/
XPUSHs( sv_2mortal( newSViv((IV)( elapsed / 1000000 )) ) );
PUTBACK;
n_retval = call_sv( callback, G_SCALAR );
SPAGAIN;
if ( n_retval != 1 ) {
warn( "callback returned %d arguments", n_retval );
}
for(i = 0; i < n_retval; i++) {
retval = POPi;
}
PUTBACK;
FREETMPS;
LEAVE;
}
int
sqlite_db_profile(pTHX_ SV *dbh, SV *func)
{
D_imp_dbh(dbh);
if (!DBIc_ACTIVE(imp_dbh)) {
sqlite_error(dbh, -2, "attempt to profile on inactive database handle");
return FALSE;
}
croak_if_db_is_null();
if (!SvOK(func)) {
/* remove previous callback */
sqlite3_profile( imp_dbh->db, NULL, NULL );
}
else {
SV *func_sv = newSVsv(func);
/* Copy the func ref so that it can be deallocated at disconnect */
av_push( imp_dbh->functions, func_sv );
/* Register the func within sqlite3 */
sqlite3_profile( imp_dbh->db,
sqlite_db_profile_dispatcher,
func_sv );
}
return TRUE;
}
/* Accesses the SQLite Online Backup API, and fills the currently loaded
* database from the passed filename.
* Usual usage of this would be when you're operating on the :memory:
* special database connection and want to copy it in from a real db.
*/
int
sqlite_db_backup_from_file(pTHX_ SV *dbh, char *filename)
{
D_imp_dbh(dbh);
#if SQLITE_VERSION_NUMBER >= 3006011
int rc;
sqlite3 *pFrom;
sqlite3_backup *pBackup;
if (!DBIc_ACTIVE(imp_dbh)) {
sqlite_error(dbh, -2, "attempt to backup from file on inactive database handle");
return FALSE;
}
croak_if_db_is_null();
rc = sqlite_open(filename, &pFrom);
if ( rc != SQLITE_OK ) {
return FALSE;
}
/* COMPAT: sqlite3_backup_* are only available for 3006011 or newer */
pBackup = sqlite3_backup_init(imp_dbh->db, "main", pFrom, "main");
if (pBackup) {
(void)sqlite3_backup_step(pBackup, -1);
(void)sqlite3_backup_finish(pBackup);
}
rc = sqlite3_errcode(imp_dbh->db);
(void)sqlite3_close(pFrom);
if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, form("sqlite_backup_from_file failed with error %s", sqlite3_errmsg(imp_dbh->db)));
return FALSE;
}
return TRUE;
#else
sqlite_error(dbh, SQLITE_ERROR, form("backup feature requires SQLite 3.6.11 and newer"));
return FALSE;
#endif
}
int
sqlite_db_backup_from_dbh(pTHX_ SV *dbh, SV *from)
{
D_imp_dbh(dbh);
#if SQLITE_VERSION_NUMBER >= 3006011
int rc;
sqlite3_backup *pBackup;
imp_dbh_t *imp_dbh_from = (imp_dbh_t *)DBIh_COM(from);
if (!DBIc_ACTIVE(imp_dbh)) {
sqlite_error(dbh, -2, "attempt to backup from file on inactive database handle");
return FALSE;
}
if (!DBIc_ACTIVE(imp_dbh_from)) {
sqlite_error(dbh, -2, "attempt to backup from inactive database handle");
return FALSE;
}
croak_if_db_is_null();
/* COMPAT: sqlite3_backup_* are only available for 3006011 or newer */
pBackup = sqlite3_backup_init(imp_dbh->db, "main", imp_dbh_from->db, "main");
if (pBackup) {
(void)sqlite3_backup_step(pBackup, -1);
(void)sqlite3_backup_finish(pBackup);
}
rc = sqlite3_errcode(imp_dbh->db);
if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, form("sqlite_backup_from_file failed with error %s", sqlite3_errmsg(imp_dbh->db)));
return FALSE;
}
return TRUE;
#else
sqlite_error(dbh, SQLITE_ERROR, form("backup feature requires SQLite 3.6.11 and newer"));
return FALSE;
#endif
}
/* Accesses the SQLite Online Backup API, and copies the currently loaded
* database into the passed filename.
* Usual usage of this would be when you're operating on the :memory:
* special database connection, and want to back it up to an on-disk file.
*/
int
sqlite_db_backup_to_file(pTHX_ SV *dbh, char *filename)
{
D_imp_dbh(dbh);
#if SQLITE_VERSION_NUMBER >= 3006011
int rc;
sqlite3 *pTo;
sqlite3_backup *pBackup;
if (!DBIc_ACTIVE(imp_dbh)) {
sqlite_error(dbh, -2, "attempt to backup to file on inactive database handle");
return FALSE;
}
croak_if_db_is_null();
rc = sqlite_open(filename, &pTo);
if ( rc != SQLITE_OK ) {
return FALSE;
}
/* COMPAT: sqlite3_backup_* are only available for 3006011 or newer */
pBackup = sqlite3_backup_init(pTo, "main", imp_dbh->db, "main");
if (pBackup) {
(void)sqlite3_backup_step(pBackup, -1);
(void)sqlite3_backup_finish(pBackup);
}
rc = sqlite3_errcode(pTo);
(void)sqlite3_close(pTo);
if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, form("sqlite_backup_to_file failed with error %s", sqlite3_errmsg(imp_dbh->db)));
return FALSE;
}
return TRUE;
#else
sqlite_error(dbh, SQLITE_ERROR, form("backup feature requires SQLite 3.6.11 and newer"));
return FALSE;
#endif
}
int
sqlite_db_backup_to_dbh(pTHX_ SV *dbh, SV *to)
{
D_imp_dbh(dbh);
#if SQLITE_VERSION_NUMBER >= 3006011
int rc;
sqlite3_backup *pBackup;
imp_dbh_t *imp_dbh_to = (imp_dbh_t *)DBIh_COM(to);
if (!DBIc_ACTIVE(imp_dbh)) {
sqlite_error(dbh, -2, "attempt to backup to file on inactive database handle");
return FALSE;
}
if (!DBIc_ACTIVE(imp_dbh_to)) {
sqlite_error(dbh, -2, "attempt to backup to inactive database handle");
return FALSE;
}
croak_if_db_is_null();
/* COMPAT: sqlite3_backup_* are only available for 3006011 or newer */
pBackup = sqlite3_backup_init(imp_dbh_to->db, "main", imp_dbh->db, "main");
if (pBackup) {
(void)sqlite3_backup_step(pBackup, -1);
(void)sqlite3_backup_finish(pBackup);
}
rc = sqlite3_errcode(imp_dbh_to->db);
if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, form("sqlite_backup_to_file failed with error %s", sqlite3_errmsg(imp_dbh->db)));
return FALSE;
}
return TRUE;
#else
sqlite_error(dbh, SQLITE_ERROR, form("backup feature requires SQLite 3.6.11 and newer"));
return FALSE;
#endif
}
int
sqlite_db_limit(pTHX_ SV *dbh, int id, int new_value)
{
D_imp_dbh(dbh);
return sqlite3_limit(imp_dbh->db, id, new_value);
}
int
sqlite_db_config(pTHX_ SV *dbh, int id, int new_value)
{
D_imp_dbh(dbh);
int ret;
int rc = -1;
switch (id) {
case SQLITE_DBCONFIG_LOOKASIDE:
sqlite_error(dbh, rc, "SQLITE_DBCONFIG_LOOKASIDE is not supported");
return FALSE;
case SQLITE_DBCONFIG_MAINDBNAME:
sqlite_error(dbh, rc, "SQLITE_DBCONFIG_MAINDBNAME is not supported");
return FALSE;
case SQLITE_DBCONFIG_ENABLE_FKEY:
case SQLITE_DBCONFIG_ENABLE_TRIGGER:
case SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER:
case SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION:
case SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE:
case SQLITE_DBCONFIG_ENABLE_QPSG:
case SQLITE_DBCONFIG_TRIGGER_EQP:
case SQLITE_DBCONFIG_RESET_DATABASE:
case SQLITE_DBCONFIG_DEFENSIVE:
case SQLITE_DBCONFIG_WRITABLE_SCHEMA:
case SQLITE_DBCONFIG_LEGACY_ALTER_TABLE:
case SQLITE_DBCONFIG_DQS_DML:
case SQLITE_DBCONFIG_DQS_DDL:
rc = sqlite3_db_config(imp_dbh->db, id, new_value, &ret);
break;
default:
sqlite_error(dbh, rc, form("Unknown config id: %d", id));
return FALSE;
}
if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, form("sqlite_db_config failed with error %s", sqlite3_errmsg(imp_dbh->db)));
return FALSE;
}
return ret;
}
int
sqlite_db_get_autocommit(pTHX_ SV *dbh)
{
D_imp_dbh(dbh);
return sqlite3_get_autocommit(imp_dbh->db);
}
int
sqlite_db_txn_state(pTHX_ SV *dbh, SV *schema)
{
( run in 2.005 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )