mirror of
https://github.com/DBD-SQLite/DBD-SQLite
synced 2025-06-08 22:58:17 -04:00
DBD::SQLite: added debug macros
This commit is contained in:
parent
1a976e892b
commit
39c5139fd3
1 changed files with 80 additions and 7 deletions
79
dbdimp.c
79
dbdimp.c
|
@ -6,6 +6,20 @@ DBISTATE_DECLARE;
|
||||||
|
|
||||||
#define SvPV_nolen_undef_ok(x) (SvOK(x) ? SvPV_nolen(x) : "undef")
|
#define SvPV_nolen_undef_ok(x) (SvOK(x) ? SvPV_nolen(x) : "undef")
|
||||||
|
|
||||||
|
/*-----------------------------------------------------*
|
||||||
|
* Debug Macros
|
||||||
|
*-----------------------------------------------------*/
|
||||||
|
|
||||||
|
#define DBD_SQLITE_CROAK_DEBUG
|
||||||
|
|
||||||
|
#ifdef DBD_SQLITE_CROAK_DEBUG
|
||||||
|
#define croak_if_db_is_null() if (!imp_dbh->db) croak("imp_dbh->db is NULL at line %d in %s", __LINE__, __FILE__)
|
||||||
|
#define croak_if_stmt_is_null() if (!imp_sth->stmt) croak("imp_sth->stmt is NULL at line %d in %s", __LINE__, __FILE__)
|
||||||
|
#else
|
||||||
|
#define croak_if_db_is_null()
|
||||||
|
#define croak_if_stmt_is_null()
|
||||||
|
#endif
|
||||||
|
|
||||||
/*-----------------------------------------------------*
|
/*-----------------------------------------------------*
|
||||||
* Helper Methods
|
* Helper Methods
|
||||||
*-----------------------------------------------------*/
|
*-----------------------------------------------------*/
|
||||||
|
@ -190,6 +204,8 @@ sqlite_db_commit(SV *dbh, imp_dbh_t *imp_dbh)
|
||||||
DBIc_on(imp_dbh, DBIcf_AutoCommit);
|
DBIc_on(imp_dbh, DBIcf_AutoCommit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
||||||
sqlite_trace(dbh, imp_dbh, 3, "COMMIT TRAN");
|
sqlite_trace(dbh, imp_dbh, 3, "COMMIT TRAN");
|
||||||
|
|
||||||
|
@ -213,6 +229,8 @@ sqlite_db_rollback(SV *dbh, imp_dbh_t *imp_dbh)
|
||||||
DBIc_on(imp_dbh, DBIcf_AutoCommit);
|
DBIc_on(imp_dbh, DBIcf_AutoCommit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
||||||
|
|
||||||
sqlite_trace(dbh, imp_dbh, 3, "ROLLBACK TRAN");
|
sqlite_trace(dbh, imp_dbh, 3, "ROLLBACK TRAN");
|
||||||
|
@ -250,6 +268,8 @@ sqlite_db_disconnect(SV *dbh, imp_dbh_t *imp_dbh)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite3_close(imp_dbh->db);
|
rc = sqlite3_close(imp_dbh->db);
|
||||||
if (rc != SQLITE_OK) {
|
if (rc != SQLITE_OK) {
|
||||||
/*
|
/*
|
||||||
|
@ -304,6 +324,8 @@ sqlite_db_STORE_attrib(SV *dbh, imp_dbh_t *imp_dbh, SV *keysv, SV *valuesv)
|
||||||
char *key = SvPV_nolen(keysv);
|
char *key = SvPV_nolen(keysv);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (strEQ(key, "AutoCommit")) {
|
if (strEQ(key, "AutoCommit")) {
|
||||||
if (SvTRUE(valuesv)) {
|
if (SvTRUE(valuesv)) {
|
||||||
/* commit tran? */
|
/* commit tran? */
|
||||||
|
@ -374,6 +396,9 @@ SV *
|
||||||
sqlite_db_last_insert_id(SV *dbh, imp_dbh_t *imp_dbh, SV *catalog, SV *schema, SV *table, SV *field, SV *attr)
|
sqlite_db_last_insert_id(SV *dbh, imp_dbh_t *imp_dbh, SV *catalog, SV *schema, SV *table, SV *field, SV *attr)
|
||||||
{
|
{
|
||||||
dTHX;
|
dTHX;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
return newSViv(sqlite3_last_insert_rowid(imp_dbh->db));
|
return newSViv(sqlite3_last_insert_rowid(imp_dbh->db));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,6 +426,8 @@ sqlite_st_prepare(SV *sth, imp_sth_t *imp_sth, char *statement, SV *attribs)
|
||||||
imp_sth->params = newAV();
|
imp_sth->params = newAV();
|
||||||
imp_sth->col_types = newAV();
|
imp_sth->col_types = newAV();
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite3_prepare_v2(imp_dbh->db, statement, -1, &(imp_sth->stmt), &extra);
|
rc = sqlite3_prepare_v2(imp_dbh->db, statement, -1, &(imp_sth->stmt), &extra);
|
||||||
if (rc != SQLITE_OK) {
|
if (rc != SQLITE_OK) {
|
||||||
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
||||||
|
@ -435,13 +462,16 @@ sqlite_st_execute(SV *sth, imp_sth_t *imp_sth)
|
||||||
int num_params = DBIc_NUM_PARAMS(imp_sth);
|
int num_params = DBIc_NUM_PARAMS(imp_sth);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sqlite_trace(sth, imp_sth, 3, form("executing %s", sqlite3_sql(imp_sth->stmt)));
|
|
||||||
|
|
||||||
if (!DBIc_ACTIVE(imp_dbh)) {
|
if (!DBIc_ACTIVE(imp_dbh)) {
|
||||||
sqlite_error(sth, -2, "attempt to execute on inactive database handle");
|
sqlite_error(sth, -2, "attempt to execute on inactive database handle");
|
||||||
return -2; /* -> undef in SQLite.xsi */
|
return -2; /* -> undef in SQLite.xsi */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
|
sqlite_trace(sth, imp_sth, 3, form("executing %s", sqlite3_sql(imp_sth->stmt)));
|
||||||
|
|
||||||
if (DBIc_ACTIVE(imp_sth)) {
|
if (DBIc_ACTIVE(imp_sth)) {
|
||||||
sqlite_trace(sth, imp_sth, 3, "execute still active, reset");
|
sqlite_trace(sth, imp_sth, 3, "execute still active, reset");
|
||||||
imp_sth->retval = sqlite3_reset(imp_sth->stmt);
|
imp_sth->retval = sqlite3_reset(imp_sth->stmt);
|
||||||
|
@ -574,6 +604,9 @@ sqlite_st_fetch(SV *sth, imp_sth_t *imp_sth)
|
||||||
int chopBlanks = DBIc_is(imp_sth, DBIcf_ChopBlanks);
|
int chopBlanks = DBIc_is(imp_sth, DBIcf_ChopBlanks);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
sqlite_trace(sth, imp_sth, 6, form("numFields == %d, nrow == %d", numFields, imp_sth->nrow));
|
sqlite_trace(sth, imp_sth, 6, form("numFields == %d, nrow == %d", numFields, imp_sth->nrow));
|
||||||
|
|
||||||
if (!DBIc_ACTIVE(imp_sth)) {
|
if (!DBIc_ACTIVE(imp_sth)) {
|
||||||
|
@ -656,6 +689,9 @@ sqlite_st_finish3(SV *sth, imp_sth_t *imp_sth, int is_destroy)
|
||||||
|
|
||||||
D_imp_dbh_from_sth;
|
D_imp_dbh_from_sth;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
/* warn("finish statement\n"); */
|
/* warn("finish statement\n"); */
|
||||||
if (!DBIc_ACTIVE(imp_sth))
|
if (!DBIc_ACTIVE(imp_sth))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -695,15 +731,19 @@ sqlite_st_destroy(SV *sth, imp_sth_t *imp_sth)
|
||||||
|
|
||||||
DBIc_ACTIVE_off(imp_sth);
|
DBIc_ACTIVE_off(imp_sth);
|
||||||
if (DBIc_ACTIVE(imp_dbh)) {
|
if (DBIc_ACTIVE(imp_dbh)) {
|
||||||
if (imp_sth->stmt)
|
if (imp_sth->stmt) {
|
||||||
sqlite_trace(sth, imp_sth, 4, form("destroy statement: %s", sqlite3_sql(imp_sth->stmt)));
|
sqlite_trace(sth, imp_sth, 4, form("destroy statement: %s", sqlite3_sql(imp_sth->stmt)));
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
/* finalize sth when active connection */
|
/* finalize sth when active connection */
|
||||||
rc = sqlite3_finalize(imp_sth->stmt);
|
rc = sqlite3_finalize(imp_sth->stmt);
|
||||||
if (rc != SQLITE_OK) {
|
if (rc != SQLITE_OK) {
|
||||||
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
SvREFCNT_dec((SV*)imp_sth->params);
|
SvREFCNT_dec((SV*)imp_sth->params);
|
||||||
SvREFCNT_dec((SV*)imp_sth->col_types);
|
SvREFCNT_dec((SV*)imp_sth->col_types);
|
||||||
DBIc_IMPSET_off(imp_sth);
|
DBIc_IMPSET_off(imp_sth);
|
||||||
|
@ -733,6 +773,9 @@ sqlite_st_FETCH_attrib(SV *sth, imp_sth_t *imp_sth, SV *keysv)
|
||||||
SV *retsv = NULL;
|
SV *retsv = NULL;
|
||||||
int i,n;
|
int i,n;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
if (!DBIc_ACTIVE(imp_sth)) {
|
if (!DBIc_ACTIVE(imp_sth)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -823,6 +866,9 @@ sqlite_bind_ph(SV *sth, imp_sth_t *imp_sth,
|
||||||
{
|
{
|
||||||
dTHX;
|
dTHX;
|
||||||
int pos;
|
int pos;
|
||||||
|
|
||||||
|
croak_if_stmt_is_null();
|
||||||
|
|
||||||
if (!looks_like_number(param)) {
|
if (!looks_like_number(param)) {
|
||||||
STRLEN len;
|
STRLEN len;
|
||||||
char *paramstring;
|
char *paramstring;
|
||||||
|
@ -875,6 +921,9 @@ int
|
||||||
sqlite_db_busy_timeout(pTHX_ SV *dbh, int timeout )
|
sqlite_db_busy_timeout(pTHX_ SV *dbh, int timeout )
|
||||||
{
|
{
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
imp_dbh->timeout = timeout;
|
imp_dbh->timeout = timeout;
|
||||||
sqlite3_busy_timeout(imp_dbh->db, timeout);
|
sqlite3_busy_timeout(imp_dbh->db, timeout);
|
||||||
|
@ -979,6 +1028,8 @@ sqlite_db_create_function(pTHX_ SV *dbh, const char *name, int argc, SV *func)
|
||||||
SV *func_sv = newSVsv(func);
|
SV *func_sv = newSVsv(func);
|
||||||
av_push( imp_dbh->functions, func_sv );
|
av_push( imp_dbh->functions, func_sv );
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
/* warn("create_function %s with %d args\n", name, argc); */
|
/* warn("create_function %s with %d args\n", name, argc); */
|
||||||
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
||||||
func_sv,
|
func_sv,
|
||||||
|
@ -998,6 +1049,8 @@ sqlite_db_enable_load_extension(pTHX_ SV *dbh, int onoff)
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite3_enable_load_extension( imp_dbh->db, onoff );
|
rc = sqlite3_enable_load_extension( imp_dbh->db, onoff );
|
||||||
if ( rc != SQLITE_OK ) {
|
if ( rc != SQLITE_OK ) {
|
||||||
sqlite_error(dbh, rc, form("sqlite_enable_load_extension failed with error %s", sqlite3_errmsg(imp_dbh->db)));
|
sqlite_error(dbh, rc, form("sqlite_enable_load_extension failed with error %s", sqlite3_errmsg(imp_dbh->db)));
|
||||||
|
@ -1204,6 +1257,8 @@ sqlite_db_create_aggregate(pTHX_ SV *dbh, const char *name, int argc, SV *aggr_p
|
||||||
SV *aggr_pkg_copy = newSVsv(aggr_pkg);
|
SV *aggr_pkg_copy = newSVsv(aggr_pkg);
|
||||||
av_push( imp_dbh->aggregates, aggr_pkg_copy );
|
av_push( imp_dbh->aggregates, aggr_pkg_copy );
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
||||||
aggr_pkg_copy,
|
aggr_pkg_copy,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -1293,6 +1348,8 @@ sqlite_db_create_collation(pTHX_ SV *dbh, const char *name, SV *func)
|
||||||
|
|
||||||
SV *func_sv = newSVsv(func);
|
SV *func_sv = newSVsv(func);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
/* Check that this is a proper collation function */
|
/* Check that this is a proper collation function */
|
||||||
rv = sqlite_db_collation_dispatcher(func_sv, 2, aa, 2, aa);
|
rv = sqlite_db_collation_dispatcher(func_sv, 2, aa, 2, aa);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
|
@ -1355,6 +1412,8 @@ sqlite_db_collation_needed(pTHX_ SV *dbh, SV *callback)
|
||||||
{
|
{
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
/* remember the callback within the dbh */
|
/* remember the callback within the dbh */
|
||||||
sv_setsv(imp_dbh->collation_needed_callback, callback);
|
sv_setsv(imp_dbh->collation_needed_callback, callback);
|
||||||
|
|
||||||
|
@ -1395,6 +1454,8 @@ sqlite_db_progress_handler(pTHX_ SV *dbh, int n_opcodes, SV *handler)
|
||||||
{
|
{
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!SvOK(handler)) {
|
if (!SvOK(handler)) {
|
||||||
/* remove previous handler */
|
/* remove previous handler */
|
||||||
sqlite3_progress_handler( imp_dbh->db, 0, NULL, NULL);
|
sqlite3_progress_handler( imp_dbh->db, 0, NULL, NULL);
|
||||||
|
@ -1419,6 +1480,8 @@ sqlite_db_commit_hook(pTHX_ SV *dbh, SV *hook)
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
void *retval;
|
void *retval;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!SvOK(hook)) {
|
if (!SvOK(hook)) {
|
||||||
/* remove previous hook */
|
/* remove previous hook */
|
||||||
retval = sqlite3_commit_hook( imp_dbh->db, NULL, NULL );
|
retval = sqlite3_commit_hook( imp_dbh->db, NULL, NULL );
|
||||||
|
@ -1444,6 +1507,8 @@ sqlite_db_rollback_hook(pTHX_ SV *dbh, SV *hook)
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
void *retval;
|
void *retval;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!SvOK(hook)) {
|
if (!SvOK(hook)) {
|
||||||
/* remove previous hook */
|
/* remove previous hook */
|
||||||
retval = sqlite3_rollback_hook( imp_dbh->db, NULL, NULL );
|
retval = sqlite3_rollback_hook( imp_dbh->db, NULL, NULL );
|
||||||
|
@ -1496,6 +1561,8 @@ sqlite_db_update_hook(pTHX_ SV *dbh, SV *hook)
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
void *retval;
|
void *retval;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!SvOK(hook)) {
|
if (!SvOK(hook)) {
|
||||||
/* remove previous hook */
|
/* remove previous hook */
|
||||||
retval = sqlite3_update_hook( imp_dbh->db, NULL, NULL );
|
retval = sqlite3_update_hook( imp_dbh->db, NULL, NULL );
|
||||||
|
@ -1565,6 +1632,8 @@ sqlite_db_set_authorizer(pTHX_ SV *dbh, SV *authorizer)
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
if (!SvOK(authorizer)) {
|
if (!SvOK(authorizer)) {
|
||||||
/* remove previous hook */
|
/* remove previous hook */
|
||||||
retval = sqlite3_set_authorizer( imp_dbh->db, NULL, NULL );
|
retval = sqlite3_set_authorizer( imp_dbh->db, NULL, NULL );
|
||||||
|
@ -1598,6 +1667,8 @@ sqlite_db_backup_from_file(pTHX_ SV *dbh, char *filename)
|
||||||
|
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite_open(filename, &pFrom);
|
rc = sqlite_open(filename, &pFrom);
|
||||||
if ( rc != SQLITE_OK ) {
|
if ( rc != SQLITE_OK ) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1633,6 +1704,8 @@ sqlite_db_backup_to_file(pTHX_ SV *dbh, char *filename)
|
||||||
|
|
||||||
D_imp_dbh(dbh);
|
D_imp_dbh(dbh);
|
||||||
|
|
||||||
|
croak_if_db_is_null();
|
||||||
|
|
||||||
rc = sqlite_open(filename, &pTo);
|
rc = sqlite_open(filename, &pTo);
|
||||||
if ( rc != SQLITE_OK ) {
|
if ( rc != SQLITE_OK ) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue