mirror of
https://github.com/DBD-SQLite/DBD-SQLite
synced 2025-06-08 14:48:32 -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
87
dbdimp.c
87
dbdimp.c
|
@ -6,6 +6,20 @@ DBISTATE_DECLARE;
|
|||
|
||||
#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
|
||||
*-----------------------------------------------------*/
|
||||
|
@ -190,6 +204,8 @@ sqlite_db_commit(SV *dbh, imp_dbh_t *imp_dbh)
|
|||
DBIc_on(imp_dbh, DBIcf_AutoCommit);
|
||||
}
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
||||
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);
|
||||
}
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!sqlite3_get_autocommit(imp_dbh->db)) {
|
||||
|
||||
sqlite_trace(dbh, imp_dbh, 3, "ROLLBACK TRAN");
|
||||
|
@ -250,6 +268,8 @@ sqlite_db_disconnect(SV *dbh, imp_dbh_t *imp_dbh)
|
|||
}
|
||||
#endif
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite3_close(imp_dbh->db);
|
||||
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);
|
||||
int rc;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (strEQ(key, "AutoCommit")) {
|
||||
if (SvTRUE(valuesv)) {
|
||||
/* 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)
|
||||
{
|
||||
dTHX;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
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->col_types = newAV();
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite3_prepare_v2(imp_dbh->db, statement, -1, &(imp_sth->stmt), &extra);
|
||||
if (rc != SQLITE_OK) {
|
||||
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 i;
|
||||
|
||||
sqlite_trace(sth, imp_sth, 3, form("executing %s", sqlite3_sql(imp_sth->stmt)));
|
||||
|
||||
if (!DBIc_ACTIVE(imp_dbh)) {
|
||||
sqlite_error(sth, -2, "attempt to execute on inactive database handle");
|
||||
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)) {
|
||||
sqlite_trace(sth, imp_sth, 3, "execute still active, reset");
|
||||
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 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));
|
||||
|
||||
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;
|
||||
|
||||
croak_if_db_is_null();
|
||||
croak_if_stmt_is_null();
|
||||
|
||||
/* warn("finish statement\n"); */
|
||||
if (!DBIc_ACTIVE(imp_sth))
|
||||
return TRUE;
|
||||
|
@ -695,13 +731,17 @@ sqlite_st_destroy(SV *sth, imp_sth_t *imp_sth)
|
|||
|
||||
DBIc_ACTIVE_off(imp_sth);
|
||||
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)));
|
||||
|
||||
/* finalize sth when active connection */
|
||||
rc = sqlite3_finalize(imp_sth->stmt);
|
||||
if (rc != SQLITE_OK) {
|
||||
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
||||
croak_if_db_is_null();
|
||||
croak_if_stmt_is_null();
|
||||
|
||||
/* finalize sth when active connection */
|
||||
rc = sqlite3_finalize(imp_sth->stmt);
|
||||
if (rc != SQLITE_OK) {
|
||||
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
|
||||
}
|
||||
}
|
||||
}
|
||||
SvREFCNT_dec((SV*)imp_sth->params);
|
||||
|
@ -733,6 +773,9 @@ sqlite_st_FETCH_attrib(SV *sth, imp_sth_t *imp_sth, SV *keysv)
|
|||
SV *retsv = NULL;
|
||||
int i,n;
|
||||
|
||||
croak_if_db_is_null();
|
||||
croak_if_stmt_is_null();
|
||||
|
||||
if (!DBIc_ACTIVE(imp_sth)) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -823,6 +866,9 @@ sqlite_bind_ph(SV *sth, imp_sth_t *imp_sth,
|
|||
{
|
||||
dTHX;
|
||||
int pos;
|
||||
|
||||
croak_if_stmt_is_null();
|
||||
|
||||
if (!looks_like_number(param)) {
|
||||
STRLEN len;
|
||||
char *paramstring;
|
||||
|
@ -875,6 +921,9 @@ int
|
|||
sqlite_db_busy_timeout(pTHX_ SV *dbh, int timeout )
|
||||
{
|
||||
D_imp_dbh(dbh);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (timeout) {
|
||||
imp_dbh->timeout = 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);
|
||||
av_push( imp_dbh->functions, func_sv );
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
/* warn("create_function %s with %d args\n", name, argc); */
|
||||
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
||||
func_sv,
|
||||
|
@ -998,6 +1049,8 @@ sqlite_db_enable_load_extension(pTHX_ SV *dbh, int onoff)
|
|||
D_imp_dbh(dbh);
|
||||
int rc;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite3_enable_load_extension( imp_dbh->db, onoff );
|
||||
if ( rc != SQLITE_OK ) {
|
||||
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);
|
||||
av_push( imp_dbh->aggregates, aggr_pkg_copy );
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite3_create_function( imp_dbh->db, name, argc, SQLITE_UTF8,
|
||||
aggr_pkg_copy,
|
||||
NULL,
|
||||
|
@ -1293,6 +1348,8 @@ sqlite_db_create_collation(pTHX_ SV *dbh, const char *name, SV *func)
|
|||
|
||||
SV *func_sv = newSVsv(func);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
/* Check that this is a proper collation function */
|
||||
rv = sqlite_db_collation_dispatcher(func_sv, 2, aa, 2, aa);
|
||||
if (rv != 0) {
|
||||
|
@ -1355,6 +1412,8 @@ sqlite_db_collation_needed(pTHX_ SV *dbh, SV *callback)
|
|||
{
|
||||
D_imp_dbh(dbh);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
/* remember the callback within the dbh */
|
||||
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);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!SvOK(handler)) {
|
||||
/* remove previous handler */
|
||||
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);
|
||||
void *retval;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!SvOK(hook)) {
|
||||
/* remove previous hook */
|
||||
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);
|
||||
void *retval;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!SvOK(hook)) {
|
||||
/* remove previous hook */
|
||||
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);
|
||||
void *retval;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!SvOK(hook)) {
|
||||
/* remove previous hook */
|
||||
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);
|
||||
int retval;
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
if (!SvOK(authorizer)) {
|
||||
/* remove previous hook */
|
||||
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);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite_open(filename, &pFrom);
|
||||
if ( rc != SQLITE_OK ) {
|
||||
return FALSE;
|
||||
|
@ -1633,6 +1704,8 @@ sqlite_db_backup_to_file(pTHX_ SV *dbh, char *filename)
|
|||
|
||||
D_imp_dbh(dbh);
|
||||
|
||||
croak_if_db_is_null();
|
||||
|
||||
rc = sqlite_open(filename, &pTo);
|
||||
if ( rc != SQLITE_OK ) {
|
||||
return FALSE;
|
||||
|
|
Loading…
Add table
Reference in a new issue