1
0
Fork 0
mirror of https://github.com/DBD-SQLite/DBD-SQLite synced 2025-06-08 14:48:32 -04:00

supported sqlite3_open_v2 flags

This commit is contained in:
Kenichi Ishigaki 2013-07-28 17:11:16 +09:00
parent 661d7cabac
commit b1ac23d02e
3 changed files with 79 additions and 5 deletions

View file

@ -576,6 +576,62 @@ SAVEPOINT()
OUTPUT: OUTPUT:
RETVAL RETVAL
static int
OPEN_READONLY()
CODE:
RETVAL = SQLITE_OPEN_READONLY;
OUTPUT:
RETVAL
static int
OPEN_READWRITE()
CODE:
RETVAL = SQLITE_OPEN_READWRITE;
OUTPUT:
RETVAL
static int
OPEN_CREATE()
CODE:
RETVAL = SQLITE_OPEN_CREATE;
OUTPUT:
RETVAL
static int
OPEN_NOMUTEX()
CODE:
RETVAL = SQLITE_OPEN_NOMUTEX;
OUTPUT:
RETVAL
static int
OPEN_FULLMUTEX()
CODE:
RETVAL = SQLITE_OPEN_FULLMUTEX;
OUTPUT:
RETVAL
static int
OPEN_SHAREDCACHE()
CODE:
RETVAL = SQLITE_OPEN_SHAREDCACHE;
OUTPUT:
RETVAL
static int
OPEN_PRIVATECACHE()
CODE:
RETVAL = SQLITE_OPEN_PRIVATECACHE;
OUTPUT:
RETVAL
static int
OPEN_URI()
CODE:
RETVAL = SQLITE_OPEN_URI;
OUTPUT:
RETVAL
INCLUDE: SQLite.xsi INCLUDE: SQLite.xsi

View file

@ -38,7 +38,8 @@ imp_dbh_t *last_executed_dbh; /* needed by perl_tokenizer
#define sqlite_error(h,rc,what) _sqlite_error(aTHX_ __FILE__, __LINE__, h, rc, what) #define sqlite_error(h,rc,what) _sqlite_error(aTHX_ __FILE__, __LINE__, h, rc, what)
#define sqlite_trace(h,xxh,level,what) if ( DBIc_TRACE_LEVEL((imp_xxh_t*)xxh) >= level ) _sqlite_trace(aTHX_ __FILE__, __LINE__, h, (imp_xxh_t*)xxh, what) #define sqlite_trace(h,xxh,level,what) if ( DBIc_TRACE_LEVEL((imp_xxh_t*)xxh) >= level ) _sqlite_trace(aTHX_ __FILE__, __LINE__, h, (imp_xxh_t*)xxh, what)
#define sqlite_exec(h,sql) _sqlite_exec(aTHX_ h, imp_dbh->db, sql) #define sqlite_exec(h,sql) _sqlite_exec(aTHX_ h, imp_dbh->db, sql)
#define sqlite_open(dbname,db) _sqlite_open(aTHX_ dbh, dbname, db) #define sqlite_open(dbname,db) _sqlite_open(aTHX_ dbh, dbname, db, 0)
#define sqlite_open2(dbname,db,flags) _sqlite_open(aTHX_ dbh, dbname, db, flags)
#define _isspace(c) (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f') #define _isspace(c) (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f')
static void static void
@ -83,10 +84,14 @@ _sqlite_exec(pTHX_ SV *h, sqlite3 *db, const char *sql)
} }
int int
_sqlite_open(pTHX_ SV *dbh, const char *dbname, sqlite3 **db) _sqlite_open(pTHX_ SV *dbh, const char *dbname, sqlite3 **db, int flags)
{ {
int rc; int rc;
rc = sqlite3_open(dbname, db); if (flags) {
rc = sqlite3_open_v2(dbname, db, flags, NULL);
} else {
rc = sqlite3_open(dbname, db);
}
if ( rc != SQLITE_OK ) { if ( rc != SQLITE_OK ) {
sqlite_error(dbh, rc, sqlite3_errmsg(*db)); sqlite_error(dbh, rc, sqlite3_errmsg(*db));
if (*db) sqlite3_close(*db); if (*db) sqlite3_close(*db);
@ -273,7 +278,11 @@ sqlite_db_login6(SV *dbh, imp_dbh_t *imp_dbh, char *dbname, char *user, char *pa
sqlite_trace(dbh, imp_dbh, 3, form("login '%s' (version %s)", dbname, sqlite3_version)); sqlite_trace(dbh, imp_dbh, 3, form("login '%s' (version %s)", dbname, sqlite3_version));
rc = sqlite_open(dbname, &(imp_dbh->db)); if (SvROK(attr) && hv_exists((HV*)SvRV(attr), "sqlite_open_flags", 17)) {
rc = sqlite_open2(dbname, &(imp_dbh->db), SvIV(*hv_fetch((HV*)SvRV(attr), "sqlite_open_flags", 17, NULL)));
} else {
rc = sqlite_open(dbname, &(imp_dbh->db));
}
if ( rc != SQLITE_OK ) { if ( rc != SQLITE_OK ) {
return FALSE; /* -> undef in lib/DBD/SQLite.pm */ return FALSE; /* -> undef in lib/DBD/SQLite.pm */
} }

View file

@ -95,15 +95,24 @@ sub connect {
my ($key, $value) = split(/=/, $attrib, 2); my ($key, $value) = split(/=/, $attrib, 2);
if ( $key =~ /^(?:db(?:name)?|database)$/ ) { if ( $key =~ /^(?:db(?:name)?|database)$/ ) {
$real = $value; $real = $value;
} elsif ( $key eq 'uri' ) {
$real = $value;
$attr->{sqlite_open_flags} |= DBD::SQLite::OPEN_URI();
} else { } else {
$attr->{$key} = $value; $attr->{$key} = $value;
} }
} }
} }
if (my $flags = $attr->{sqlite_open_flags}) {
unless ($flags & (DBD::SQLite::OPEN_READONLY() | DBD::SQLite::OPEN_READWRITE())) {
$attr->{sqlite_open_flags} |= DBD::SQLite::OPEN_READWRITE() | DBD::SQLite::OPEN_CREATE();
}
}
# To avoid unicode and long file name problems on Windows, # To avoid unicode and long file name problems on Windows,
# convert to the shortname if the file (or parent directory) exists. # convert to the shortname if the file (or parent directory) exists.
if ( $^O =~ /MSWin32/ and $real ne ':memory:' and $real ne '') { if ( $^O =~ /MSWin32/ and $real ne ':memory:' and $real ne '' and $real !~ /^file:/) {
require Win32; require Win32;
require File::Basename; require File::Basename;
my ($file, $dir, $suffix) = File::Basename::fileparse($real); my ($file, $dir, $suffix) = File::Basename::fileparse($real);