mirror of
https://github.com/DBD-SQLite/DBD-SQLite
synced 2025-06-07 06:08:38 -04:00
cleanup
- Emacs settings no longer in dbdimp.c source - remove duplicated code (generalize cals to stacked_sv_from_sqlite3_value()) - variables renamed
This commit is contained in:
parent
bf65db231f
commit
7af00e7edd
3 changed files with 29 additions and 104 deletions
1
.dir-locals.el
Normal file
1
.dir-locals.el
Normal file
|
@ -0,0 +1 @@
|
||||||
|
(( nil . ((c-basic-offset . 4))))
|
124
dbdimp.c
124
dbdimp.c
|
@ -1,12 +1,3 @@
|
||||||
/* -*- c-basic-offset: 4; -*- */
|
|
||||||
|
|
||||||
/* TODO : refactoring
|
|
||||||
- generalized use of stacked_sv_from_sqlite3_value
|
|
||||||
- decide about policy for errors in vtab methods : use G_EVAL or just die?
|
|
||||||
- find better name instead of "perl_instance"
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#define PERL_NO_GET_CONTEXT
|
#define PERL_NO_GET_CONTEXT
|
||||||
|
|
||||||
#define NEED_newSVpvn_flags
|
#define NEED_newSVpvn_flags
|
||||||
|
@ -1483,51 +1474,7 @@ sqlite_db_func_dispatcher(int is_unicode, sqlite3_context *context, int argc, sq
|
||||||
|
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
for ( i=0; i < argc; i++ ) {
|
for ( i=0; i < argc; i++ ) {
|
||||||
/* TODO: XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ value[i], is_unicode)); */
|
XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ value[i], is_unicode));
|
||||||
|
|
||||||
SV *arg;
|
|
||||||
STRLEN len;
|
|
||||||
int type = sqlite3_value_type(value[i]);
|
|
||||||
sqlite_int64 iv;
|
|
||||||
|
|
||||||
/* warn("func dispatch type: %d, value: %s\n", type, sqlite3_value_text(value[i])); */
|
|
||||||
switch(type) {
|
|
||||||
case SQLITE_INTEGER:
|
|
||||||
iv = sqlite3_value_int64(value[i]);
|
|
||||||
if ( iv >= IV_MIN && iv <= IV_MAX ) {
|
|
||||||
/* ^^^ compile-time constant (= true) when IV == int64 */
|
|
||||||
arg = sv_2mortal(newSViv((IV)iv));
|
|
||||||
}
|
|
||||||
else if ( iv >= 0 && iv <= UV_MAX ) {
|
|
||||||
/* warn("integer overflow, cast to UV"); */
|
|
||||||
arg = sv_2mortal(newSVuv((UV)iv));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* warn("integer overflow, cast to NV"); */
|
|
||||||
arg = sv_2mortal(newSVnv((NV)iv));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SQLITE_FLOAT:
|
|
||||||
arg = sv_2mortal(newSVnv(sqlite3_value_double(value[i])));
|
|
||||||
break;
|
|
||||||
case SQLITE_TEXT:
|
|
||||||
len = sqlite3_value_bytes(value[i]);
|
|
||||||
arg = newSVpvn((const char *)sqlite3_value_text(value[i]), len);
|
|
||||||
if (is_unicode) {
|
|
||||||
SvUTF8_on(arg);
|
|
||||||
}
|
|
||||||
arg = sv_2mortal(arg);
|
|
||||||
break;
|
|
||||||
case SQLITE_BLOB:
|
|
||||||
len = sqlite3_value_bytes(value[i]);
|
|
||||||
arg = sv_2mortal(newSVpvn(sqlite3_value_blob(value[i]), len));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
arg = &PL_sv_undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
XPUSHs(arg);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
|
|
||||||
|
@ -1781,30 +1728,7 @@ sqlite_db_aggr_step_dispatcher(sqlite3_context *context,
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs( sv_2mortal( newSVsv( aggr->aggr_inst ) ));
|
XPUSHs( sv_2mortal( newSVsv( aggr->aggr_inst ) ));
|
||||||
for ( i=0; i < argc; i++ ) {
|
for ( i=0; i < argc; i++ ) {
|
||||||
/* TODO: XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ value[i], is_unicode)); */
|
XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ value[i], is_unicode));
|
||||||
|
|
||||||
SV *arg;
|
|
||||||
int len = sqlite3_value_bytes(value[i]);
|
|
||||||
int type = sqlite3_value_type(value[i]);
|
|
||||||
|
|
||||||
switch(type) {
|
|
||||||
case SQLITE_INTEGER:
|
|
||||||
arg = sv_2mortal(newSViv(sqlite3_value_int(value[i])));
|
|
||||||
break;
|
|
||||||
case SQLITE_FLOAT:
|
|
||||||
arg = sv_2mortal(newSVnv(sqlite3_value_double(value[i])));
|
|
||||||
break;
|
|
||||||
case SQLITE_TEXT:
|
|
||||||
arg = sv_2mortal(newSVpvn((const char *)sqlite3_value_text(value[i]), len));
|
|
||||||
break;
|
|
||||||
case SQLITE_BLOB:
|
|
||||||
arg = sv_2mortal(newSVpvn(sqlite3_value_blob(value[i]), len));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
arg = &PL_sv_undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
XPUSHs(arg);
|
|
||||||
}
|
}
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
|
|
||||||
|
@ -2848,18 +2772,18 @@ int sqlite_db_register_fts3_perl_tokenizer(pTHX_ SV *dbh)
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
** The set of routines that implement the perl "module"
|
** The set of routines that implement the perl "module"
|
||||||
** (i.e support for virtual table)
|
** (i.e support for virtual tables written in Perl)
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
typedef struct perl_vtab {
|
typedef struct perl_vtab {
|
||||||
sqlite3_vtab base;
|
sqlite3_vtab base;
|
||||||
SV *perl_vtab_instance;
|
SV *perl_vtab_obj;
|
||||||
} perl_vtab;
|
} perl_vtab;
|
||||||
|
|
||||||
typedef struct perl_vtab_cursor {
|
typedef struct perl_vtab_cursor {
|
||||||
sqlite3_vtab_cursor base;
|
sqlite3_vtab_cursor base;
|
||||||
SV *perl_cursor_instance;
|
SV *perl_cursor_obj;
|
||||||
} perl_vtab_cursor;
|
} perl_vtab_cursor;
|
||||||
|
|
||||||
typedef struct perl_vtab_init {
|
typedef struct perl_vtab_init {
|
||||||
|
@ -2877,7 +2801,7 @@ static int _call_perl_vtab_method(sqlite3_vtab *pVTab, const char *method) {
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method (method, G_VOID);
|
count = call_method (method, G_VOID);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -2900,7 +2824,7 @@ static int _call_perl_vtab_method(sqlite3_vtab *pVTab, const char *method) {
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
XPUSHs(sv_2mortal(newSViv(i)));
|
XPUSHs(sv_2mortal(newSViv(i)));
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method (method, G_VOID);
|
count = call_method (method, G_VOID);
|
||||||
|
@ -2957,8 +2881,8 @@ static int perl_vt_New(const char *method,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the VirtualTable instance */
|
/* get the VirtualTable instance */
|
||||||
SV *perl_instance = POPs;
|
SV *perl_vtab_obj = POPs;
|
||||||
if ( !sv_isobject(perl_instance) ) {
|
if ( !sv_isobject(perl_vtab_obj) ) {
|
||||||
*pzErr = sqlite3_mprintf("vtab->%s() should return a blessed reference",
|
*pzErr = sqlite3_mprintf("vtab->%s() should return a blessed reference",
|
||||||
method);
|
method);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -2966,7 +2890,7 @@ static int perl_vt_New(const char *method,
|
||||||
|
|
||||||
/* call the ->VTAB_TO_DECLARE() method */
|
/* call the ->VTAB_TO_DECLARE() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(perl_instance);
|
XPUSHs(perl_vtab_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("VTAB_TO_DECLARE", G_SCALAR);
|
count = call_method ("VTAB_TO_DECLARE", G_SCALAR);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -2987,7 +2911,7 @@ static int perl_vt_New(const char *method,
|
||||||
rc = sqlite3_declare_vtab(db, SvPVutf8_nolen(sql));
|
rc = sqlite3_declare_vtab(db, SvPVutf8_nolen(sql));
|
||||||
|
|
||||||
/* record the VirtualTable perl instance within the vtab structure */
|
/* record the VirtualTable perl instance within the vtab structure */
|
||||||
vt->perl_vtab_instance = SvREFCNT_inc(perl_instance);
|
vt->perl_vtab_obj = SvREFCNT_inc(perl_vtab_obj);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
*ppVTab = &vt->base;
|
*ppVTab = &vt->base;
|
||||||
|
@ -3019,7 +2943,7 @@ static int perl_vt_Disconnect(sqlite3_vtab *pVTab){
|
||||||
_call_perl_vtab_method(pVTab, "DISCONNECT");
|
_call_perl_vtab_method(pVTab, "DISCONNECT");
|
||||||
|
|
||||||
perl_vtab *perl_pVTab = (perl_vtab *) pVTab;
|
perl_vtab *perl_pVTab = (perl_vtab *) pVTab;
|
||||||
SvREFCNT_dec(perl_pVTab->perl_vtab_instance);
|
SvREFCNT_dec(perl_pVTab->perl_vtab_obj);
|
||||||
|
|
||||||
sqlite3_free(perl_pVTab);
|
sqlite3_free(perl_pVTab);
|
||||||
|
|
||||||
|
@ -3033,7 +2957,7 @@ static int perl_vt_Drop(sqlite3_vtab *pVTab){
|
||||||
_call_perl_vtab_method(pVTab, "DROP");
|
_call_perl_vtab_method(pVTab, "DROP");
|
||||||
|
|
||||||
perl_vtab *perl_pVTab = (perl_vtab *) pVTab;
|
perl_vtab *perl_pVTab = (perl_vtab *) pVTab;
|
||||||
SvREFCNT_dec(perl_pVTab->perl_vtab_instance);
|
SvREFCNT_dec(perl_pVTab->perl_vtab_obj);
|
||||||
|
|
||||||
sqlite3_free(perl_pVTab);
|
sqlite3_free(perl_pVTab);
|
||||||
|
|
||||||
|
@ -3093,7 +3017,7 @@ static int perl_vt_BestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pIdxInfo){
|
||||||
|
|
||||||
/* call the ->best_index() method */
|
/* call the ->best_index() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs( ((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs( ((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
XPUSHs( sv_2mortal( newRV_noinc((SV*) constraints)));
|
XPUSHs( sv_2mortal( newRV_noinc((SV*) constraints)));
|
||||||
XPUSHs( sv_2mortal( newRV_noinc((SV*) order_by)));
|
XPUSHs( sv_2mortal( newRV_noinc((SV*) order_by)));
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
|
@ -3164,7 +3088,7 @@ static int perl_vt_Open(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
|
||||||
|
|
||||||
/* call the ->OPEN() method */
|
/* call the ->OPEN() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs( ((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs( ((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("OPEN", G_SCALAR);
|
count = call_method ("OPEN", G_SCALAR);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -3180,7 +3104,7 @@ static int perl_vt_Open(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
|
||||||
cursor = (perl_vtab_cursor *) sqlite3_malloc(sizeof(*cursor));
|
cursor = (perl_vtab_cursor *) sqlite3_malloc(sizeof(*cursor));
|
||||||
if( cursor==NULL ) return SQLITE_NOMEM;
|
if( cursor==NULL ) return SQLITE_NOMEM;
|
||||||
memset(cursor, 0, sizeof(*cursor));
|
memset(cursor, 0, sizeof(*cursor));
|
||||||
cursor->perl_cursor_instance = SvREFCNT_inc(perl_cursor);
|
cursor->perl_cursor_obj = SvREFCNT_inc(perl_cursor);
|
||||||
|
|
||||||
/* return that cursor */
|
/* return that cursor */
|
||||||
*ppCursor = &cursor->base;
|
*ppCursor = &cursor->base;
|
||||||
|
@ -3202,7 +3126,7 @@ static int perl_vt_Close(sqlite3_vtab_cursor *pVtabCursor){
|
||||||
can implement a DESTROY() method */
|
can implement a DESTROY() method */
|
||||||
|
|
||||||
perl_vtab_cursor *perl_pVTabCursor = (perl_vtab_cursor *) pVtabCursor;
|
perl_vtab_cursor *perl_pVTabCursor = (perl_vtab_cursor *) pVtabCursor;
|
||||||
SvREFCNT_dec(perl_pVTabCursor->perl_cursor_instance);
|
SvREFCNT_dec(perl_pVTabCursor->perl_cursor_obj);
|
||||||
sqlite3_free(perl_pVTabCursor);
|
sqlite3_free(perl_pVTabCursor);
|
||||||
|
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
|
@ -3227,7 +3151,7 @@ static int perl_vt_Filter(
|
||||||
|
|
||||||
/* call the FILTER() method with ($idxNum, $idxStr, @args) */
|
/* call the FILTER() method with ($idxNum, $idxStr, @args) */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_instance);
|
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_obj);
|
||||||
XPUSHs(sv_2mortal(newSViv(idxNum)));
|
XPUSHs(sv_2mortal(newSViv(idxNum)));
|
||||||
XPUSHs(sv_2mortal(newSVpv(idxStr, 0)));
|
XPUSHs(sv_2mortal(newSVpv(idxStr, 0)));
|
||||||
for(i = 0; i < argc; i++) {
|
for(i = 0; i < argc; i++) {
|
||||||
|
@ -3255,7 +3179,7 @@ static int perl_vt_Next(sqlite3_vtab_cursor *pVtabCursor){
|
||||||
|
|
||||||
/* call the next() method */
|
/* call the next() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_instance);
|
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("NEXT", G_VOID);
|
count = call_method ("NEXT", G_VOID);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -3277,7 +3201,7 @@ static int perl_vt_Eof(sqlite3_vtab_cursor *pVtabCursor){
|
||||||
|
|
||||||
/* call the eof() method */
|
/* call the eof() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_instance);
|
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("EOF", G_SCALAR);
|
count = call_method ("EOF", G_SCALAR);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -3309,7 +3233,7 @@ static int perl_vt_Column(sqlite3_vtab_cursor *pVtabCursor,
|
||||||
|
|
||||||
/* call the column() method */
|
/* call the column() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_instance);
|
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_obj);
|
||||||
XPUSHs(sv_2mortal(newSViv(col)));
|
XPUSHs(sv_2mortal(newSViv(col)));
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("COLUMN", G_SCALAR);
|
count = call_method ("COLUMN", G_SCALAR);
|
||||||
|
@ -3340,7 +3264,7 @@ static int perl_vt_Rowid(sqlite3_vtab_cursor *pVtabCursor, sqlite3_int64 *pRowid
|
||||||
|
|
||||||
/* call the rowid() method */
|
/* call the rowid() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_instance);
|
XPUSHs(((perl_vtab_cursor *) pVtabCursor)->perl_cursor_obj);
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method ("ROWID", G_SCALAR);
|
count = call_method ("ROWID", G_SCALAR);
|
||||||
SPAGAIN;
|
SPAGAIN;
|
||||||
|
@ -3371,7 +3295,7 @@ static int perl_vt_Update(sqlite3_vtab *pVTab,
|
||||||
|
|
||||||
/* call the update() method */
|
/* call the update() method */
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
for(i = 0; i < argc; i++) {
|
for(i = 0; i < argc; i++) {
|
||||||
XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ argv[i], is_unicode));
|
XPUSHs(stacked_sv_from_sqlite3_value(aTHX_ argv[i], is_unicode));
|
||||||
}
|
}
|
||||||
|
@ -3442,7 +3366,7 @@ static int perl_vt_Rename(sqlite3_vtab *pVTab, const char *zNew){
|
||||||
int rc = SQLITE_ERROR;
|
int rc = SQLITE_ERROR;
|
||||||
|
|
||||||
PUSHMARK(SP);
|
PUSHMARK(SP);
|
||||||
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_instance);
|
XPUSHs(((perl_vtab *) pVTab)->perl_vtab_obj);
|
||||||
XPUSHs(sv_2mortal(newSVpv(zNew, 0)));
|
XPUSHs(sv_2mortal(newSVpv(zNew, 0)));
|
||||||
PUTBACK;
|
PUTBACK;
|
||||||
count = call_method("RENAME", G_SCALAR);
|
count = call_method("RENAME", G_SCALAR);
|
||||||
|
|
|
@ -53,14 +53,14 @@ $sth->execute($_) foreach @perl_files;
|
||||||
|
|
||||||
|
|
||||||
# create the virtual table
|
# create the virtual table
|
||||||
$dbh->sqlite_create_module(fs => "DBD::SQLite::VirtualTable::FileContent");
|
$dbh->sqlite_create_module(fc => "DBD::SQLite::VirtualTable::FileContent");
|
||||||
$dbh->do(<<"");
|
$dbh->do(<<"");
|
||||||
CREATE VIRTUAL TABLE vfs USING fs(source = files,
|
CREATE VIRTUAL TABLE vfc USING fc(source = files,
|
||||||
expose = "path",
|
expose = "path",
|
||||||
root = "$distrib_dir")
|
root = "$distrib_dir")
|
||||||
|
|
||||||
# create the fulltext indexing table and populate it
|
# create the fulltext indexing table and populate it
|
||||||
$dbh->do('CREATE VIRTUAL TABLE fts USING fts4(content="vfs")');
|
$dbh->do('CREATE VIRTUAL TABLE fts USING fts4(content="vfc")');
|
||||||
note "building fts index....";
|
note "building fts index....";
|
||||||
$dbh->do("INSERT INTO fts(fts) VALUES ('rebuild')");
|
$dbh->do("INSERT INTO fts(fts) VALUES ('rebuild')");
|
||||||
note "done";
|
note "done";
|
||||||
|
@ -90,7 +90,7 @@ foreach my $test (@tests) {
|
||||||
$dbh->disconnect;
|
$dbh->disconnect;
|
||||||
undef $dbh;
|
undef $dbh;
|
||||||
$dbh = connect_ok( dbfile => $dbfile, RaiseError => 1, AutoCommit => 1 );
|
$dbh = connect_ok( dbfile => $dbfile, RaiseError => 1, AutoCommit => 1 );
|
||||||
$dbh->sqlite_create_module(fs => "DBD::SQLite::VirtualTable::FileContent");
|
$dbh->sqlite_create_module(fc => "DBD::SQLite::VirtualTable::FileContent");
|
||||||
|
|
||||||
foreach my $test (@tests) {
|
foreach my $test (@tests) {
|
||||||
my ($pattern, @expected) = @$test;
|
my ($pattern, @expected) = @$test;
|
||||||
|
|
Loading…
Add table
Reference in a new issue