From 2507fb198a9c6722e83e501491693877c96255f5 Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 3 Jul 2008 01:01:03 +0000 Subject: [PATCH] deleted the sqlitejdbc folder git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/sqlite-jdbc@2252 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd --- script/Makefile | 84 +- script/Makefile.common | 39 +- script/Makefile.nested | 43 +- sqlitejdbc/.boring | 39 - sqlitejdbc/LICENSE | 13 - sqlitejdbc/Makefile | 63 - sqlitejdbc/Makefile.common | 90 -- sqlitejdbc/Makefile.nested | 81 -- sqlitejdbc/README | 75 -- sqlitejdbc/VERSION | 1 - sqlitejdbc/lib/inc_win/jni.h | 1951 ------------------------------ sqlitejdbc/lib/inc_win/jni_md.h | 19 - sqlitejdbc/lib/jdbc-1.4.jar | Bin 24600 -> 0 bytes sqlitejdbc/lib/junit-4.1.jar | Bin 112249 -> 0 bytes sqlitejdbc/release.sh | 107 -- sqlitejdbc/src/org/sqlite/Codes.java | 106 -- sqlitejdbc/src/org/sqlite/Conn.java | 239 ---- sqlitejdbc/src/org/sqlite/DB.java | 343 ------ sqlitejdbc/src/org/sqlite/Function.java | 182 --- sqlitejdbc/src/org/sqlite/JDBC.java | 56 - sqlitejdbc/src/org/sqlite/MetaData.java | 717 ----------- sqlitejdbc/src/org/sqlite/NativeDB.c | 774 ------------ sqlitejdbc/src/org/sqlite/NativeDB.java | 123 -- sqlitejdbc/src/org/sqlite/NestedDB.c | 78 -- sqlitejdbc/src/org/sqlite/NestedDB.java | 442 ------- sqlitejdbc/src/org/sqlite/PrepStmt.java | 213 ---- sqlitejdbc/src/org/sqlite/RS.java | 347 ------ sqlitejdbc/src/org/sqlite/Stmt.java | 242 ---- sqlitejdbc/src/org/sqlite/Unused.java | 250 ---- sqlitejdbc/src/test/ConnectionTest.java | 45 - sqlitejdbc/src/test/DBMetaDataTest.java | 413 ------- sqlitejdbc/src/test/PrepStmtTest.java | 487 -------- sqlitejdbc/src/test/RSMetaDataTest.java | 76 -- sqlitejdbc/src/test/StatementTest.java | 305 ----- sqlitejdbc/src/test/TransactionTest.java | 224 ---- sqlitejdbc/src/test/UDFTest.java | 313 ----- sqlitejdbc/web/ad.inc | 13 - sqlitejdbc/web/content.css | 102 -- sqlitejdbc/web/functions.html | 176 --- sqlitejdbc/web/index.html | 174 --- sqlitejdbc/web/javasource.css | 61 - sqlitejdbc/web/nav.inc | 10 - sqlitejdbc/web/speed.html | 88 -- sqlitejdbc/web/usage.html | 124 -- 44 files changed, 95 insertions(+), 9233 deletions(-) delete mode 100644 sqlitejdbc/.boring delete mode 100644 sqlitejdbc/LICENSE delete mode 100644 sqlitejdbc/Makefile delete mode 100644 sqlitejdbc/Makefile.common delete mode 100644 sqlitejdbc/Makefile.nested delete mode 100644 sqlitejdbc/README delete mode 100644 sqlitejdbc/VERSION delete mode 100644 sqlitejdbc/lib/inc_win/jni.h delete mode 100644 sqlitejdbc/lib/inc_win/jni_md.h delete mode 100644 sqlitejdbc/lib/jdbc-1.4.jar delete mode 100644 sqlitejdbc/lib/junit-4.1.jar delete mode 100644 sqlitejdbc/release.sh delete mode 100644 sqlitejdbc/src/org/sqlite/Codes.java delete mode 100644 sqlitejdbc/src/org/sqlite/Conn.java delete mode 100644 sqlitejdbc/src/org/sqlite/DB.java delete mode 100644 sqlitejdbc/src/org/sqlite/Function.java delete mode 100644 sqlitejdbc/src/org/sqlite/JDBC.java delete mode 100644 sqlitejdbc/src/org/sqlite/MetaData.java delete mode 100644 sqlitejdbc/src/org/sqlite/NativeDB.c delete mode 100644 sqlitejdbc/src/org/sqlite/NativeDB.java delete mode 100644 sqlitejdbc/src/org/sqlite/NestedDB.c delete mode 100644 sqlitejdbc/src/org/sqlite/NestedDB.java delete mode 100644 sqlitejdbc/src/org/sqlite/PrepStmt.java delete mode 100644 sqlitejdbc/src/org/sqlite/RS.java delete mode 100644 sqlitejdbc/src/org/sqlite/Stmt.java delete mode 100644 sqlitejdbc/src/org/sqlite/Unused.java delete mode 100644 sqlitejdbc/src/test/ConnectionTest.java delete mode 100644 sqlitejdbc/src/test/DBMetaDataTest.java delete mode 100644 sqlitejdbc/src/test/PrepStmtTest.java delete mode 100644 sqlitejdbc/src/test/RSMetaDataTest.java delete mode 100644 sqlitejdbc/src/test/StatementTest.java delete mode 100644 sqlitejdbc/src/test/TransactionTest.java delete mode 100644 sqlitejdbc/src/test/UDFTest.java delete mode 100644 sqlitejdbc/web/ad.inc delete mode 100644 sqlitejdbc/web/content.css delete mode 100644 sqlitejdbc/web/functions.html delete mode 100644 sqlitejdbc/web/index.html delete mode 100644 sqlitejdbc/web/javasource.css delete mode 100644 sqlitejdbc/web/nav.inc delete mode 100644 sqlitejdbc/web/speed.html delete mode 100644 sqlitejdbc/web/usage.html diff --git a/script/Makefile b/script/Makefile index 1e84052..31c068f 100644 --- a/script/Makefile +++ b/script/Makefile @@ -1,22 +1,52 @@ # Makefile for the native SQLite JDBC Driver # -# Tested on Mac OS X, Linux and Windows/Cygwin. This file generates a jar file -# and native jnilib/so/dll library that provides an SQLite JDBC driver. +# No auto-goop. Just try typing 'make'. You should get two interesting files: +# build/TARGET_OS/LIBNAME +# build/sqlitejdbc-vXXX-native.jar # -# Author: David Crawshaw, 2007 -# License: New BSD (see LICENSE file) +# To combine these, type: +# cd build +# mv LIBNAME linux-x86.lib (or win-x86.lib, freebsd-ppc.lib, mac.lib, etc) +# java uf sqlitejdbc-vXXX-native.jar linux-x86.lib # -# No auto-goop. Just try typin 'make'. +# The first is the native library, the second is the java support files. +# Generating the more complete sqlitejdbc-vXXX.jar requires building the +# NestedVM source, which requires running a Linux machine, and looking at +# the other make files. # include Makefile.common default: test -dl/$(sqlite)-amal.zip: - @mkdir -p dl - curl -odl/$(sqlite)-amal.zip \ - http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip +test: native $(test_classes) + $(JAVA) -Djava.library.path=build/$(target) \ + -cp "build/$(sqlitejdbc)-native.jar$(sep)build$(sep)$(libjunit)" \ + org.junit.runner.JUnitCore $(tests) + +native: build/$(sqlitejdbc)-native.jar build/$(target)/$(LIBNAME) + +native: build/$(sqlite)-$(target)/sqlite3.o $(native_classes) + @mkdir -p build/$(target) + $(JAVAH) -classpath build -jni -o build/NativeDB.h org.sqlite.NativeDB + cd build && jar cf $(sqlitejdbc)-native.jar $(java_classlist) + $(CC) $(CFLAGS) -c -o build/$(target)/NativeDB.o \ + src/org/sqlite/NativeDB.c + $(CC) $(CFLAGS) $(LINKFLAGS) -o build/$(target)/$(LIBNAME) \ + build/$(target)/NativeDB.o build/$(sqlite)-$(target)/*.o + $(STRIP) build/$(target)/$(LIBNAME) + +build/$(sqlitejdbc)-native.jar: $(native_classes) + cd build && jar cf $(sqlitejdbc)-native.jar $(java_classlist) + +build/$(target)/$(LIBNAME): build/$(sqlite)-$(target)/sqlite3.o build/org/sqlite/NativeDB.class + @mkdir -p build/$(target) + $(JAVAH) -classpath build -jni -o build/NativeDB.h org.sqlite.NativeDB + $(CC) $(CFLAGS) -c -o build/$(target)/NativeDB.o \ + src/org/sqlite/NativeDB.c + $(CC) $(CFLAGS) $(LINKFLAGS) -o build/$(target)/$(LIBNAME) \ + build/$(target)/NativeDB.o build/$(sqlite)-$(target)/*.o + $(STRIP) build/$(target)/$(LIBNAME) build/$(sqlite)-%/sqlite3.o: dl/$(sqlite)-amal.zip @mkdir -p build/$(sqlite)-$* @@ -31,32 +61,24 @@ build/$(sqlite)-%/sqlite3.o: dl/$(sqlite)-amal.zip build/org/%.class: src/org/%.java @mkdir -p build - javac -source 1.2 -target 1.2 -sourcepath src -d build $< + $(JAVAC) -source 1.2 -target 1.2 -sourcepath src -d build $< build/test/%.class: src/test/%.java @mkdir -p build - javac -target 1.5 -classpath "$(libs)" -sourcepath src/test -d build $< + $(JAVAC) -target 1.5 -classpath "build$(sep)$(libjunit)" \ + -sourcepath src/test -d build $< + +dl/$(sqlite)-amal.zip: + @mkdir -p dl + curl -odl/$(sqlite)-amal.zip \ + http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip + +clean: + rm -rf build dist + + + -native: build/$(sqlite)-$(target)/sqlite3.o $(native_classes) - @mkdir -p build/$(target) - javah -classpath build -jni -o build/NativeDB.h org.sqlite.NativeDB - cd build && jar cf $(sqlitejdbc)-native.jar $(java_classlist) - $(CC) $(CFLAGS) -c -o build/$(target)/NativeDB.o \ - src/org/sqlite/NativeDB.c - $(CC) $(CFLAGS) $(LINKFLAGS) -o build/$(target)/$(LIBNAME) \ - build/$(target)/NativeDB.o build/$(sqlite)-$(target)/*.o - $(STRIP) build/$(target)/$(LIBNAME) -dist/$(sqlitejdbc)-$(target).tgz: native - @mkdir -p dist - tar cfz dist/$(sqlitejdbc)-$(target).tgz README \ - -C build $(sqlitejdbc)-native.jar -C $(target) $(LIBNAME) -test: native $(test_classes) - java -Djava.library.path=build/$(target) \ - -cp "build/$(sqlitejdbc)-native.jar$(sep)$(libs)" \ - org.junit.runner.JUnitCore $(tests) -clean: - rm -rf build - rm -rf dist diff --git a/script/Makefile.common b/script/Makefile.common index 42f7ead..fb2580e 100644 --- a/script/Makefile.common +++ b/script/Makefile.common @@ -2,8 +2,6 @@ ifndef JAVA_HOME $(error Set JAVA_HOME environment variable) endif -jni_md := $(shell find "$(JAVA_HOME)" -name jni_md.h) - ifeq ($(os),) ifeq ($(shell uname),Darwin) os := Darwin @@ -13,16 +11,8 @@ ifeq ($(os),) endif ifeq ($(findstring MINGW,$(shell uname)),MINGW) os := Win - ifneq ($(jni_md),) - jni_include := $(shell cygpath -w `dirname "$(jni_md)"`) - endif endif endif - -ifneq ($(jni_md),) -jni_include := $(shell dirname "$(jni_md)") -endif - ifeq ($(os),) os := Default endif @@ -38,13 +28,24 @@ ifeq ($(arch),) arch := $(shell uname -m) endif -sqlite_version := 3.5.7 + +sqlite_version := 3.5.9 + sqlite := sqlite-$(sqlite_version) sqlitejdbc := sqlitejdbc-v$(shell cat VERSION) +jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h) +ifneq ($(jni_md),) +jni_include := $(shell dirname "$(jni_md)") +endif + +libjdbc := $(wildcard lib/jdbc-*.jar) +libjunit := $(wildcard lib/junit-*.jar) -libs := build$(sep)$(subst ,$(sep),$(wildcard lib/*.jar)) +JAVA := "$$JAVA_HOME/bin/java" +JAVAC := "$$JAVA_HOME/bin/javac" -Xbootclasspath/p:$(libjdbc) +JAVAH := "$$JAVA_HOME/bin/javah" java_sources = $(wildcard src/org/sqlite/*.java) java_classes = $(java_sources:src/%.java=build/%.class) @@ -59,19 +60,23 @@ target := $(os)-$(arch) # os=Default is meant to be generic unix/linux Default_CC := gcc Default_STRIP := strip -Default_CFLAGS := -I$(JAVA_HOME)/include -O3 -fPIC +Default_CFLAGS := -I$(JAVA_HOME)/include -Os -fPIC Default_LINKFLAGS := -shared Default_LIBNAME := libsqlitejdbc.so -Darwin_CC := gcc -arch $(arch) +Support10_4 := -isysroot /Developer/SDKs/MacOSX10.4u.sdk +#Darwin_CC := gcc -arch $(arch) -mmacosx-version-min=10.4 $(Support10_4) +Darwin_CC := gcc -arch $(arch) Darwin_STRIP := strip -x -Darwin_CFLAGS := -I$(JAVA_HOME)/include -O3 -fPIC -Darwin_LINKFLAGS := -dynamiclib +Darwin_CFLAGS := -I$(JAVA_HOME)/include -Os -fPIC +Darwin_LINKFLAGS := -dynamiclib $(Support10_4) Darwin_LIBNAME := libsqlitejdbc.jnilib +#Win_CC := $(arch)-mingw32msvc-gcc +#Win_STRIP := $(arch)-mingw32msvc-strip Win_CC := mingw32-gcc Win_STRIP := strip -Win_CFLAGS := -D_JNI_IMPLEMENTATION_ -Ilib/inc_win -O3 +Win_CFLAGS := -D_JNI_IMPLEMENTATION_ -Ilib/inc_win -O Win_LINKFLAGS := -Wl,--kill-at -shared Win_LIBNAME := sqlitejdbc.dll diff --git a/script/Makefile.nested b/script/Makefile.nested index ed7871e..68a92b0 100644 --- a/script/Makefile.nested +++ b/script/Makefile.nested @@ -5,40 +5,37 @@ nestedvm := nestedvm-$(nestedvm_version) default: test +test: dist/$(sqlitejdbc)-pure.jar $(test_classes) + $(JAVA) -cp "dist/$(sqlitejdbc)-pure.jar$(sep)build$(sep)$(libjunit)" \ + org.junit.runner.JUnitCore $(tests) + +dist/$(sqlitejdbc)-pure.jar: build/org/sqlite/SQLite.class $(java_classes) + @mkdir -p dist + cd build && jar cf ../$@ \ + org/sqlite/SQLite.class $(java_classlist) \ + -C ../$(nestedvm)/build org/ibex + build/org/%.class: src/org/%.java @mkdir -p build - javac -source 1.2 -target 1.2 -classpath "$(nestedvm)/build" \ + $(JAVAC) -source 1.2 -target 1.2 -classpath "$(nestedvm)/build" \ -sourcepath src -d build $< build/test/%.class: src/test/%.java @mkdir -p build - javac -target 1.5 -classpath "$(libs)" -sourcepath src/test -d build $< - -nested: build/org/sqlite/SQLite.class $(java_classes) - cd build && jar cf $(sqlitejdbc)-nested.jar \ - org/sqlite/SQLite.class $(java_classlist) \ - -C ../$(nestedvm)/build org/ibex - -dist/$(sqlitejdbc)-nested.tgz: nested - @mkdir -p dist - tar cfz dist/$(sqlitejdbc)-nested.tgz \ - README -C build $(sqlitejdbc)-nested.jar - -test: nested $(test_classes) - java -cp "build/$(sqlitejdbc)-nested.jar$(sep)$(libs)" \ - org.junit.runner.JUnitCore $(tests) + $(JAVAC) -target 1.5 -classpath "build$(sep)$(libjunit)" \ + -sourcepath src/test -d build $< $(nestedvm)/%: $(MAKE) -C $(nestedvm) $* -dl/$(sqlite)-amal.zip: +dl/$(nestedvm).tgz: @mkdir -p dl - curl -odl/$(sqlite)-amal.zip \ - http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip + curl -odl/$(nestedvm).tgz http://files.zentus.com/sqlitejdbc/$(nestedvm).tgz -dl/$(nestedvm).tgz: +dl/$(sqlite)-amal.zip: @mkdir -p dl - curl -odl/$(nestedvm).tgz http://zentus.com/sqlitejdbc/dist/$(nestedvm).tgz + curl -odl/$(sqlite)-amal.zip \ + http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip $(nestedvm)/Makefile: dl/$(nestedvm).tgz tar xfz dl/$(nestedvm).tgz @@ -47,7 +44,7 @@ build/SQLite.mips: $(nestedvm)/Makefile $(nestedvm)/env.sh dl/$(sqlite)-amal.zip @mkdir -p build @mkdir -p build/$(sqlite)-nestedvm unzip -qo dl/$(sqlite)-amal.zip -d build/$(sqlite)-nestedvm - cp src/org/sqlite/NestedDB.c build/$(sqlite)-nestedvm + cp src/org/sqlite/Nested*.c build/$(sqlite)-nestedvm perl -pi -e "s/sqlite3_api;/sqlite3_api = 0;/g" \ build/$(sqlite)-nestedvm/sqlite3ext.h @@ -62,7 +59,7 @@ build/SQLite.mips: $(nestedvm)/Makefile $(nestedvm)/env.sh dl/$(sqlite)-amal.zip -DSQLITE_ENABLE_FTS3 \ -DSQLITE_OMIT_LOAD_EXTENSION \ sqlite3.c; \ - $$CC -c $$CFLAGS -o NestedDB.o NestedDB.c) + $$CC -c $$CFLAGS -o NestedDB.o Nested*.c) ./$(nestedvm)/upstream/install/bin/mips-unknown-elf-gcc \ -march=mips1 --static \ diff --git a/sqlitejdbc/.boring b/sqlitejdbc/.boring deleted file mode 100644 index f471668..0000000 --- a/sqlitejdbc/.boring +++ /dev/null @@ -1,39 +0,0 @@ -# ignore build directories -(^|/)build($|/) -(^|/)dist($|/) -(^|/)work($|/) -# Boring file regexps: -\.hi$ -\.o$ -\.o\.cmd$ -# *.ko files aren't boring by default because they might -# be Korean translations rather than kernel modules. -# \.ko$ -\.ko\.cmd$ -\.mod\.c$ -(^|/)\.tmp_versions($|/) -(^|/)CVS($|/) -(^|/)RCS($|/) -~$ -#(^|/)\.[^/] -(^|/)_darcs($|/) -\.bak$ -\.BAK$ -\.orig$ -(^|/)vssver\.scc$ -\.swp$ -(^|/)MT($|/) -(^|/)\{arch\}($|/) -(^|/).arch-ids($|/) -(^|/), -\.class$ -\.prof$ -(^|/)\.DS_Store$ -(^|/)BitKeeper($|/) -(^|/)ChangeSet($|/) -(^|/)\.svn($|/) -\.py[co]$ -\# -\.cvsignore$ -(^|/)Thumbs\.db$ -(^|/)autom4te\.cache($|/) diff --git a/sqlitejdbc/LICENSE b/sqlitejdbc/LICENSE deleted file mode 100644 index 6d8848d..0000000 --- a/sqlitejdbc/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2007 David Crawshaw - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/sqlitejdbc/Makefile b/sqlitejdbc/Makefile deleted file mode 100644 index 19c54be..0000000 --- a/sqlitejdbc/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -# Makefile for the native SQLite JDBC Driver -# -# Tested on Mac OS X, Linux and Windows/Cygwin. This file generates a jar file -# and native jnilib/so/dll library that provides an SQLite JDBC driver. -# -# Author: David Crawshaw, 2007 -# License: New BSD (see LICENSE file) -# -# No auto-goop. Just try typin 'make'. -# - -include Makefile.common - -default: test - -dl/$(sqlite)-amal.zip: - @mkdir -p dl - curl -odl/$(sqlite)-amal.zip \ - http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip - -build/$(sqlite)-%/sqlite3.o: dl/$(sqlite)-amal.zip - @mkdir -p build/$(sqlite)-$* - unzip -qo dl/$(sqlite)-amal.zip -d build/$(sqlite)-$* - perl -pi -e "s/sqlite3_api;/sqlite3_api = 0;/g" \ - build/$(sqlite)-$*/sqlite3ext.h - (cd build/$(sqlite)-$*; $(CC) -o sqlite3.o -c $(CFLAGS) \ - -DSQLITE_ENABLE_COLUMN_METADATA \ - -DSQLITE_CORE \ - -DSQLITE_ENABLE_FTS3 \ - -DSQLITE_OMIT_LOAD_EXTENSION sqlite3.c) - -build/org/%.class: src/org/%.java - @mkdir -p build - $(JAVAC) -source 1.2 -target 1.2 -sourcepath src -d build $< - -build/test/%.class: src/test/%.java - @mkdir -p build - $(JAVAC) -target 1.5 -classpath "build$(sep)$(libjunit)" \ - -sourcepath src/test -d build $< - -native: build/$(sqlite)-$(target)/sqlite3.o $(native_classes) - @mkdir -p build/$(target) - $(JAVAH) -classpath build -jni -o build/NativeDB.h org.sqlite.NativeDB - cd build && jar cf $(sqlitejdbc)-native.jar $(java_classlist) - $(CC) $(CFLAGS) -c -o build/$(target)/NativeDB.o \ - src/org/sqlite/NativeDB.c - $(CC) $(CFLAGS) $(LINKFLAGS) -o build/$(target)/$(LIBNAME) \ - build/$(target)/NativeDB.o build/$(sqlite)-$(target)/*.o - $(STRIP) build/$(target)/$(LIBNAME) - -dist/$(sqlitejdbc)-$(target).tgz: native - @mkdir -p dist - tar cfz dist/$(sqlitejdbc)-$(target).tgz README \ - -C build $(sqlitejdbc)-native.jar -C $(target) $(LIBNAME) - -test: native $(test_classes) - $(JAVA) -Djava.library.path=build/$(target) \ - -cp "build/$(sqlitejdbc)-native.jar$(sep)build$(sep)$(libjunit)" \ - org.junit.runner.JUnitCore $(tests) - -clean: - rm -rf build - rm -rf dist diff --git a/sqlitejdbc/Makefile.common b/sqlitejdbc/Makefile.common deleted file mode 100644 index dab0a4d..0000000 --- a/sqlitejdbc/Makefile.common +++ /dev/null @@ -1,90 +0,0 @@ -ifndef JAVA_HOME -$(error Set JAVA_HOME environment variable) -endif - -ifeq ($(os),) - ifeq ($(shell uname),Darwin) - os := Darwin - endif - ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN) - os := Win - endif - ifeq ($(findstring MINGW,$(shell uname)),MINGW) - os := Win - endif -endif -ifeq ($(os),) - os := Default -endif - -# Windows uses different path separators, because they hate me -ifeq ($(os),Win) - sep := ; -else - sep := : -endif - -ifeq ($(arch),) -arch := $(shell uname -m) -endif - -sqlite_version := 3.5.9 -sqlite := sqlite-$(sqlite_version) - -sqlitejdbc := sqlitejdbc-v$(shell cat VERSION) - -jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h) -ifneq ($(jni_md),) -jni_include := $(shell dirname "$(jni_md)") -endif - -libjdbc := $(wildcard lib/jdbc-*.jar) -libjunit := $(wildcard lib/junit-*.jar) - -JAVA := "$$JAVA_HOME/bin/java" -JAVAC := "$$JAVA_HOME/bin/javac" -Xbootclasspath/p:$(libjdbc) -JAVAH := "$$JAVA_HOME/bin/javah" - -java_sources = $(wildcard src/org/sqlite/*.java) -java_classes = $(java_sources:src/%.java=build/%.class) -native_classes = $(filter-out %NestedDB.class,$(java_classes)) -java_classlist = $(subst $$,\$$,$(patsubst build/%, %, $(wildcard $(java_classes:%.class=%*)))) -test_sources = $(wildcard src/test/*.java) -test_classes = $(test_sources:src/%.java=build/%.class) -tests = $(subst /,.,$(patsubst build/%.class,%,$(test_classes))) - -target := $(os)-$(arch) - -# os=Default is meant to be generic unix/linux -Default_CC := gcc -Default_STRIP := strip -Default_CFLAGS := -I$(JAVA_HOME)/include -O3 -fPIC -Default_LINKFLAGS := -shared -Default_LIBNAME := libsqlitejdbc.so - -Support10_4 := -isysroot /Developer/SDKs/MacOSX10.4u.sdk -#Darwin_CC := gcc -arch $(arch) -mmacosx-version-min=10.4 $(Support10_4) -Darwin_CC := gcc -arch $(arch) -Darwin_STRIP := strip -x -Darwin_CFLAGS := -I$(JAVA_HOME)/include -O3 -fPIC -Darwin_LINKFLAGS := -dynamiclib $(Support10_4) -Darwin_LIBNAME := libsqlitejdbc.jnilib - -#Win_CC := $(arch)-mingw32msvc-gcc -#Win_STRIP := $(arch)-mingw32msvc-strip -Win_CC := mingw32-gcc -Win_STRIP := strip -Win_CFLAGS := -D_JNI_IMPLEMENTATION_ -Ilib/inc_win -O -Win_LINKFLAGS := -Wl,--kill-at -shared -Win_LIBNAME := sqlitejdbc.dll - -CC := $($(os)_CC) -STRIP := $($(os)_STRIP) -CFLAGS := $($(os)_CFLAGS) -LINKFLAGS := $($(os)_LINKFLAGS) -LIBNAME := $($(os)_LIBNAME) - -CFLAGS := $(CFLAGS) -Ibuild/$(sqlite)-$(target) -Ibuild -ifneq ($(jni_include),) -CFLAGS := $(CFLAGS) -I"$(jni_include)" -endif diff --git a/sqlitejdbc/Makefile.nested b/sqlitejdbc/Makefile.nested deleted file mode 100644 index c489196..0000000 --- a/sqlitejdbc/Makefile.nested +++ /dev/null @@ -1,81 +0,0 @@ -include Makefile.common - -nestedvm_version := 2007-06-30 -nestedvm := nestedvm-$(nestedvm_version) - -default: test - -build/org/%.class: src/org/%.java - @mkdir -p build - $(JAVAC) -source 1.2 -target 1.2 -classpath "$(nestedvm)/build" \ - -sourcepath src -d build $< - -build/test/%.class: src/test/%.java - @mkdir -p build - $(JAVAC) -target 1.5 -classpath "build$(sep)$(libjunit)" \ - -sourcepath src/test -d build $< - -nested: build/org/sqlite/SQLite.class $(java_classes) - cd build && jar cf $(sqlitejdbc)-nested.jar \ - org/sqlite/SQLite.class $(java_classlist) \ - -C ../$(nestedvm)/build org/ibex - -dist/$(sqlitejdbc)-nested.tgz: nested - @mkdir -p dist - tar cfz dist/$(sqlitejdbc)-nested.tgz \ - README -C build $(sqlitejdbc)-nested.jar - -test: nested $(test_classes) - $(JAVA) -cp "build/$(sqlitejdbc)-nested.jar$(sep)build$(sep)$(libjunit)" \ - org.junit.runner.JUnitCore $(tests) - -$(nestedvm)/%: - $(MAKE) -C $(nestedvm) $* - -dl/$(sqlite)-amal.zip: - @mkdir -p dl - curl -odl/$(sqlite)-amal.zip \ - http://www.sqlite.org/sqlite-amalgamation-$(subst .,_,$(sqlite_version)).zip - -dl/$(nestedvm).tgz: - @mkdir -p dl - curl -odl/$(nestedvm).tgz http://zentus.com/sqlitejdbc/dist/$(nestedvm).tgz - -$(nestedvm)/Makefile: dl/$(nestedvm).tgz - tar xfz dl/$(nestedvm).tgz - -build/SQLite.mips: $(nestedvm)/Makefile $(nestedvm)/env.sh dl/$(sqlite)-amal.zip - @mkdir -p build - @mkdir -p build/$(sqlite)-nestedvm - unzip -qo dl/$(sqlite)-amal.zip -d build/$(sqlite)-nestedvm - cp src/org/sqlite/Nested*.c build/$(sqlite)-nestedvm - perl -pi -e "s/sqlite3_api;/sqlite3_api = 0;/g" \ - build/$(sqlite)-nestedvm/sqlite3ext.h - - # we need a dummy main - echo 'int main() { return 0; }' >> build/$(sqlite)-nestedvm/sqlite3.c - - (. ./$(nestedvm)/env.sh; cd build/$(sqlite)-nestedvm; \ - $$CC -c $$CFLAGS -o sqlite3.o \ - -DSQLITE_THREADSAFE=0 \ - -DSQLITE_ENABLE_COLUMN_METADATA \ - -DSQLITE_CORE \ - -DSQLITE_ENABLE_FTS3 \ - -DSQLITE_OMIT_LOAD_EXTENSION \ - sqlite3.c; \ - $$CC -c $$CFLAGS -o NestedDB.o Nested*.c) - - ./$(nestedvm)/upstream/install/bin/mips-unknown-elf-gcc \ - -march=mips1 --static \ - -o $@ build/$(sqlite)-nestedvm/sqlite3.o \ - build/$(sqlite)-nestedvm/NestedDB.o - -build/org/sqlite/SQLite.class: build/SQLite.mips - java -cp $(nestedvm)/build$(sep)$(nestedvm)/upstream/build/classgen/build \ - org.ibex.nestedvm.Compiler \ - -outformat class -d build -o unixRuntime \ - org.sqlite.SQLite build/SQLite.mips - -clean: - rm -rf build - rm -rf dist diff --git a/sqlitejdbc/README b/sqlitejdbc/README deleted file mode 100644 index aaabb62..0000000 --- a/sqlitejdbc/README +++ /dev/null @@ -1,75 +0,0 @@ ---------------------------------------------------------------------- -What: SQLite 3.3.x JDBC Driver -Who: David Crawshaw -When: 2006 -Why: Because Derby is bloated, HSQLDB has too many capital letters - in its name and I don't have the time to maintain a full Java - port of SQLite. -How: BSD License (dig in) ---------------------------------------------------------------------- - - --- USING ------------------------------------------------------------ -This driver comes in two flavours: Pure Java and native library. The -Pure Java driver works by running a MIPS version of SQLite inside the -JVM with NestedVM. To use, download sqlitejdbc-*version*-nested.tgz, -extract sqlitejdbc-*version*-nested.jar and include in the classpath -of your project. You can then invoke SQLite using the standard JDBC -interface: - - Class.forName("org.sqlite.JDBC"); - Connection conn = DriverManager.getConnection( - "jdbc:sqlite:filename"); - // ... use the database ... - conn.close(); - -The native library version is faster, but requires a platform and -operating system specific binary. Place the file -sqlitejdbc-*version*-native.jar on the classpath and the native -library sqlitejdbc.dll or libsqlitejdbc.jnilib on the Java library -path. To do this from the command line: - - java -cp sqlitejdbc.jar -Djava.library.path=. yourprog.Main - -Alternatively, if you wish to load the native library at runtime, -set the system property "org.sqlite.lib.path" to the directory -containing the library. For bundling several binaries, the property -"org.sqlite.lib.name" can be used if the path property is set. This -is used as the name of the native library to load. - -For a memory database, use a URL without a file name: - Connection conn = DriverManager.getConnection("jdbc:sqlite:"); - - --- NOT YET IMPLEMENTED ---------------------------------------------- -Most aspects of JDBC that are unsupported are done so because SQLite -doesn't lend itself that way, or I haven't got around to it yet. - -- getBlob() / setBlob(): these functions require constantly creating - instances of java.sql.Blob, which I do not like. The features of - these functions, such as Stream access cannot be implemented - efficiently on SQLite anyhow. The only thing that is important is - retrieving the length of a blob without reading the contents into - memory. I hope to provide non-JDBC access to this through the API - mentioned for user-defined functions. -- ResultSet.isLast(): the only truly evil function in the JDBC spec. - Even the JavaDoc's accept this: - Calling the method isLast may be expensive because the JDBC - driver might need to fetch ahead one row in order to determine - whether the current row is the last row in the result set. - - Supporting this function would bring all the pain of determining - types, terribly bloat the code and mean a performance hit. It - will probably always throw an SQLException. Use next() instead. - - --- COMPILING -------------------------------------------------------- -Install gcc, gnu make, a JDK, set your $JAVA_HOME and type: - $ make - -On a Unix system, this should compile the driver for your -architecture and run the test suite. On cygwin you may be lucky and -only have to rename libsqlitejdbc.so to sqlitejdbc.dll, or other -problems may appear. - -To pass the tests an sqlite binary is needed on the path. diff --git a/sqlitejdbc/VERSION b/sqlitejdbc/VERSION deleted file mode 100644 index e2d6f28..0000000 --- a/sqlitejdbc/VERSION +++ /dev/null @@ -1 +0,0 @@ -047 diff --git a/sqlitejdbc/lib/inc_win/jni.h b/sqlitejdbc/lib/inc_win/jni.h deleted file mode 100644 index 2b11e78..0000000 --- a/sqlitejdbc/lib/inc_win/jni.h +++ /dev/null @@ -1,1951 +0,0 @@ -/* - * @(#)jni.h 1.56 03/12/19 - * - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -/* - * We used part of Netscape's Java Runtime Interface (JRI) as the starting - * point of our design and implementation. - */ - -/****************************************************************************** - * Java Runtime Interface - * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved. - *****************************************************************************/ - -#ifndef _JAVASOFT_JNI_H_ -#define _JAVASOFT_JNI_H_ - -#include -#include - -/* jni_md.h contains the machine-dependent typedefs for jbyte, jint - and jlong */ - -#include "jni_md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * JNI Types - */ - -#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H - -typedef unsigned char jboolean; -typedef unsigned short jchar; -typedef short jshort; -typedef float jfloat; -typedef double jdouble; - -typedef jint jsize; - -#ifdef __cplusplus - -class _jobject {}; -class _jclass : public _jobject {}; -class _jthrowable : public _jobject {}; -class _jstring : public _jobject {}; -class _jarray : public _jobject {}; -class _jbooleanArray : public _jarray {}; -class _jbyteArray : public _jarray {}; -class _jcharArray : public _jarray {}; -class _jshortArray : public _jarray {}; -class _jintArray : public _jarray {}; -class _jlongArray : public _jarray {}; -class _jfloatArray : public _jarray {}; -class _jdoubleArray : public _jarray {}; -class _jobjectArray : public _jarray {}; - -typedef _jobject *jobject; -typedef _jclass *jclass; -typedef _jthrowable *jthrowable; -typedef _jstring *jstring; -typedef _jarray *jarray; -typedef _jbooleanArray *jbooleanArray; -typedef _jbyteArray *jbyteArray; -typedef _jcharArray *jcharArray; -typedef _jshortArray *jshortArray; -typedef _jintArray *jintArray; -typedef _jlongArray *jlongArray; -typedef _jfloatArray *jfloatArray; -typedef _jdoubleArray *jdoubleArray; -typedef _jobjectArray *jobjectArray; - -#else - -struct _jobject; - -typedef struct _jobject *jobject; -typedef jobject jclass; -typedef jobject jthrowable; -typedef jobject jstring; -typedef jobject jarray; -typedef jarray jbooleanArray; -typedef jarray jbyteArray; -typedef jarray jcharArray; -typedef jarray jshortArray; -typedef jarray jintArray; -typedef jarray jlongArray; -typedef jarray jfloatArray; -typedef jarray jdoubleArray; -typedef jarray jobjectArray; - -#endif - -typedef jobject jweak; - -typedef union jvalue { - jboolean z; - jbyte b; - jchar c; - jshort s; - jint i; - jlong j; - jfloat f; - jdouble d; - jobject l; -} jvalue; - -struct _jfieldID; -typedef struct _jfieldID *jfieldID; - -struct _jmethodID; -typedef struct _jmethodID *jmethodID; - -#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */ - -/* - * jboolean constants - */ - -#define JNI_FALSE 0 -#define JNI_TRUE 1 - -/* - * possible return values for JNI functions. - */ - -#define JNI_OK 0 /* success */ -#define JNI_ERR (-1) /* unknown error */ -#define JNI_EDETACHED (-2) /* thread detached from the VM */ -#define JNI_EVERSION (-3) /* JNI version error */ -#define JNI_ENOMEM (-4) /* not enough memory */ -#define JNI_EEXIST (-5) /* VM already created */ -#define JNI_EINVAL (-6) /* invalid arguments */ - -/* - * used in ReleaseScalarArrayElements - */ - -#define JNI_COMMIT 1 -#define JNI_ABORT 2 - -/* - * used in RegisterNatives to describe native method name, signature, - * and function pointer. - */ - -typedef struct { - char *name; - char *signature; - void *fnPtr; -} JNINativeMethod; - -/* - * JNI Native Method Interface. - */ - -struct JNINativeInterface_; - -struct JNIEnv_; - -#ifdef __cplusplus -typedef JNIEnv_ JNIEnv; -#else -typedef const struct JNINativeInterface_ *JNIEnv; -#endif - -/* - * JNI Invocation Interface. - */ - -struct JNIInvokeInterface_; - -struct JavaVM_; - -#ifdef __cplusplus -typedef JavaVM_ JavaVM; -#else -typedef const struct JNIInvokeInterface_ *JavaVM; -#endif - -struct JNINativeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - void *reserved3; - jint (JNICALL *GetVersion)(JNIEnv *env); - - jclass (JNICALL *DefineClass) - (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, - jsize len); - jclass (JNICALL *FindClass) - (JNIEnv *env, const char *name); - - jmethodID (JNICALL *FromReflectedMethod) - (JNIEnv *env, jobject method); - jfieldID (JNICALL *FromReflectedField) - (JNIEnv *env, jobject field); - - jobject (JNICALL *ToReflectedMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic); - - jclass (JNICALL *GetSuperclass) - (JNIEnv *env, jclass sub); - jboolean (JNICALL *IsAssignableFrom) - (JNIEnv *env, jclass sub, jclass sup); - - jobject (JNICALL *ToReflectedField) - (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic); - - jint (JNICALL *Throw) - (JNIEnv *env, jthrowable obj); - jint (JNICALL *ThrowNew) - (JNIEnv *env, jclass clazz, const char *msg); - jthrowable (JNICALL *ExceptionOccurred) - (JNIEnv *env); - void (JNICALL *ExceptionDescribe) - (JNIEnv *env); - void (JNICALL *ExceptionClear) - (JNIEnv *env); - void (JNICALL *FatalError) - (JNIEnv *env, const char *msg); - - jint (JNICALL *PushLocalFrame) - (JNIEnv *env, jint capacity); - jobject (JNICALL *PopLocalFrame) - (JNIEnv *env, jobject result); - - jobject (JNICALL *NewGlobalRef) - (JNIEnv *env, jobject lobj); - void (JNICALL *DeleteGlobalRef) - (JNIEnv *env, jobject gref); - void (JNICALL *DeleteLocalRef) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsSameObject) - (JNIEnv *env, jobject obj1, jobject obj2); - jobject (JNICALL *NewLocalRef) - (JNIEnv *env, jobject ref); - jint (JNICALL *EnsureLocalCapacity) - (JNIEnv *env, jint capacity); - - jobject (JNICALL *AllocObject) - (JNIEnv *env, jclass clazz); - jobject (JNICALL *NewObject) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *NewObjectV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *NewObjectA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jclass (JNICALL *GetObjectClass) - (JNIEnv *env, jobject obj); - jboolean (JNICALL *IsInstanceOf) - (JNIEnv *env, jobject obj, jclass clazz); - - jmethodID (JNICALL *GetMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallObjectMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jobject (JNICALL *CallObjectMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jobject (JNICALL *CallObjectMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jboolean (JNICALL *CallBooleanMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jboolean (JNICALL *CallBooleanMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jboolean (JNICALL *CallBooleanMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jbyte (JNICALL *CallByteMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jbyte (JNICALL *CallByteMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jbyte (JNICALL *CallByteMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallCharMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jchar (JNICALL *CallCharMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jchar (JNICALL *CallCharMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallShortMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jshort (JNICALL *CallShortMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jshort (JNICALL *CallShortMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallIntMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jint (JNICALL *CallIntMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jint (JNICALL *CallIntMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallLongMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jlong (JNICALL *CallLongMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jlong (JNICALL *CallLongMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallFloatMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jfloat (JNICALL *CallFloatMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jfloat (JNICALL *CallFloatMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallDoubleMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - jdouble (JNICALL *CallDoubleMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - jdouble (JNICALL *CallDoubleMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallVoidMethod) - (JNIEnv *env, jobject obj, jmethodID methodID, ...); - void (JNICALL *CallVoidMethodV) - (JNIEnv *env, jobject obj, jmethodID methodID, va_list args); - void (JNICALL *CallVoidMethodA) - (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args); - - jobject (JNICALL *CallNonvirtualObjectMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallNonvirtualObjectMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jobject (JNICALL *CallNonvirtualObjectMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jboolean (JNICALL *CallNonvirtualBooleanMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallNonvirtualBooleanMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jboolean (JNICALL *CallNonvirtualBooleanMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jbyte (JNICALL *CallNonvirtualByteMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallNonvirtualByteMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jbyte (JNICALL *CallNonvirtualByteMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jchar (JNICALL *CallNonvirtualCharMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallNonvirtualCharMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jchar (JNICALL *CallNonvirtualCharMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jshort (JNICALL *CallNonvirtualShortMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallNonvirtualShortMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jshort (JNICALL *CallNonvirtualShortMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jint (JNICALL *CallNonvirtualIntMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallNonvirtualIntMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jint (JNICALL *CallNonvirtualIntMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jlong (JNICALL *CallNonvirtualLongMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallNonvirtualLongMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jlong (JNICALL *CallNonvirtualLongMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jfloat (JNICALL *CallNonvirtualFloatMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallNonvirtualFloatMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jfloat (JNICALL *CallNonvirtualFloatMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - jdouble (JNICALL *CallNonvirtualDoubleMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallNonvirtualDoubleMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - jdouble (JNICALL *CallNonvirtualDoubleMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue *args); - - void (JNICALL *CallNonvirtualVoidMethod) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...); - void (JNICALL *CallNonvirtualVoidMethodV) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - va_list args); - void (JNICALL *CallNonvirtualVoidMethodA) - (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, - const jvalue * args); - - jfieldID (JNICALL *GetFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *GetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jboolean (JNICALL *GetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jbyte (JNICALL *GetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jchar (JNICALL *GetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jshort (JNICALL *GetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jint (JNICALL *GetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jlong (JNICALL *GetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jfloat (JNICALL *GetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - jdouble (JNICALL *GetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID); - - void (JNICALL *SetObjectField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val); - void (JNICALL *SetBooleanField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val); - void (JNICALL *SetByteField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val); - void (JNICALL *SetCharField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val); - void (JNICALL *SetShortField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val); - void (JNICALL *SetIntField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jint val); - void (JNICALL *SetLongField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val); - void (JNICALL *SetFloatField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val); - void (JNICALL *SetDoubleField) - (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val); - - jmethodID (JNICALL *GetStaticMethodID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - - jobject (JNICALL *CallStaticObjectMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jobject (JNICALL *CallStaticObjectMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jobject (JNICALL *CallStaticObjectMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jboolean (JNICALL *CallStaticBooleanMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jboolean (JNICALL *CallStaticBooleanMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jboolean (JNICALL *CallStaticBooleanMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jbyte (JNICALL *CallStaticByteMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jbyte (JNICALL *CallStaticByteMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jbyte (JNICALL *CallStaticByteMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jchar (JNICALL *CallStaticCharMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jchar (JNICALL *CallStaticCharMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jchar (JNICALL *CallStaticCharMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jshort (JNICALL *CallStaticShortMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jshort (JNICALL *CallStaticShortMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jshort (JNICALL *CallStaticShortMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jint (JNICALL *CallStaticIntMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jint (JNICALL *CallStaticIntMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jint (JNICALL *CallStaticIntMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jlong (JNICALL *CallStaticLongMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jlong (JNICALL *CallStaticLongMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jlong (JNICALL *CallStaticLongMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jfloat (JNICALL *CallStaticFloatMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jfloat (JNICALL *CallStaticFloatMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jfloat (JNICALL *CallStaticFloatMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - jdouble (JNICALL *CallStaticDoubleMethod) - (JNIEnv *env, jclass clazz, jmethodID methodID, ...); - jdouble (JNICALL *CallStaticDoubleMethodV) - (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args); - jdouble (JNICALL *CallStaticDoubleMethodA) - (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args); - - void (JNICALL *CallStaticVoidMethod) - (JNIEnv *env, jclass cls, jmethodID methodID, ...); - void (JNICALL *CallStaticVoidMethodV) - (JNIEnv *env, jclass cls, jmethodID methodID, va_list args); - void (JNICALL *CallStaticVoidMethodA) - (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args); - - jfieldID (JNICALL *GetStaticFieldID) - (JNIEnv *env, jclass clazz, const char *name, const char *sig); - jobject (JNICALL *GetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jboolean (JNICALL *GetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jbyte (JNICALL *GetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jchar (JNICALL *GetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jshort (JNICALL *GetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jint (JNICALL *GetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jlong (JNICALL *GetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jfloat (JNICALL *GetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - jdouble (JNICALL *GetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID); - - void (JNICALL *SetStaticObjectField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value); - void (JNICALL *SetStaticBooleanField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value); - void (JNICALL *SetStaticByteField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value); - void (JNICALL *SetStaticCharField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value); - void (JNICALL *SetStaticShortField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value); - void (JNICALL *SetStaticIntField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value); - void (JNICALL *SetStaticLongField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value); - void (JNICALL *SetStaticFloatField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value); - void (JNICALL *SetStaticDoubleField) - (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value); - - jstring (JNICALL *NewString) - (JNIEnv *env, const jchar *unicode, jsize len); - jsize (JNICALL *GetStringLength) - (JNIEnv *env, jstring str); - const jchar *(JNICALL *GetStringChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringChars) - (JNIEnv *env, jstring str, const jchar *chars); - - jstring (JNICALL *NewStringUTF) - (JNIEnv *env, const char *utf); - jsize (JNICALL *GetStringUTFLength) - (JNIEnv *env, jstring str); - const char* (JNICALL *GetStringUTFChars) - (JNIEnv *env, jstring str, jboolean *isCopy); - void (JNICALL *ReleaseStringUTFChars) - (JNIEnv *env, jstring str, const char* chars); - - - jsize (JNICALL *GetArrayLength) - (JNIEnv *env, jarray array); - - jobjectArray (JNICALL *NewObjectArray) - (JNIEnv *env, jsize len, jclass clazz, jobject init); - jobject (JNICALL *GetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index); - void (JNICALL *SetObjectArrayElement) - (JNIEnv *env, jobjectArray array, jsize index, jobject val); - - jbooleanArray (JNICALL *NewBooleanArray) - (JNIEnv *env, jsize len); - jbyteArray (JNICALL *NewByteArray) - (JNIEnv *env, jsize len); - jcharArray (JNICALL *NewCharArray) - (JNIEnv *env, jsize len); - jshortArray (JNICALL *NewShortArray) - (JNIEnv *env, jsize len); - jintArray (JNICALL *NewIntArray) - (JNIEnv *env, jsize len); - jlongArray (JNICALL *NewLongArray) - (JNIEnv *env, jsize len); - jfloatArray (JNICALL *NewFloatArray) - (JNIEnv *env, jsize len); - jdoubleArray (JNICALL *NewDoubleArray) - (JNIEnv *env, jsize len); - - jboolean * (JNICALL *GetBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *isCopy); - jbyte * (JNICALL *GetByteArrayElements) - (JNIEnv *env, jbyteArray array, jboolean *isCopy); - jchar * (JNICALL *GetCharArrayElements) - (JNIEnv *env, jcharArray array, jboolean *isCopy); - jshort * (JNICALL *GetShortArrayElements) - (JNIEnv *env, jshortArray array, jboolean *isCopy); - jint * (JNICALL *GetIntArrayElements) - (JNIEnv *env, jintArray array, jboolean *isCopy); - jlong * (JNICALL *GetLongArrayElements) - (JNIEnv *env, jlongArray array, jboolean *isCopy); - jfloat * (JNICALL *GetFloatArrayElements) - (JNIEnv *env, jfloatArray array, jboolean *isCopy); - jdouble * (JNICALL *GetDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jboolean *isCopy); - - void (JNICALL *ReleaseBooleanArrayElements) - (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode); - void (JNICALL *ReleaseByteArrayElements) - (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode); - void (JNICALL *ReleaseCharArrayElements) - (JNIEnv *env, jcharArray array, jchar *elems, jint mode); - void (JNICALL *ReleaseShortArrayElements) - (JNIEnv *env, jshortArray array, jshort *elems, jint mode); - void (JNICALL *ReleaseIntArrayElements) - (JNIEnv *env, jintArray array, jint *elems, jint mode); - void (JNICALL *ReleaseLongArrayElements) - (JNIEnv *env, jlongArray array, jlong *elems, jint mode); - void (JNICALL *ReleaseFloatArrayElements) - (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode); - void (JNICALL *ReleaseDoubleArrayElements) - (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode); - - void (JNICALL *GetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf); - void (JNICALL *GetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf); - void (JNICALL *GetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf); - void (JNICALL *GetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf); - void (JNICALL *GetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf); - void (JNICALL *GetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf); - void (JNICALL *GetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf); - void (JNICALL *GetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf); - - void (JNICALL *SetBooleanArrayRegion) - (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf); - void (JNICALL *SetByteArrayRegion) - (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf); - void (JNICALL *SetCharArrayRegion) - (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf); - void (JNICALL *SetShortArrayRegion) - (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf); - void (JNICALL *SetIntArrayRegion) - (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf); - void (JNICALL *SetLongArrayRegion) - (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf); - void (JNICALL *SetFloatArrayRegion) - (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf); - void (JNICALL *SetDoubleArrayRegion) - (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf); - - jint (JNICALL *RegisterNatives) - (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, - jint nMethods); - jint (JNICALL *UnregisterNatives) - (JNIEnv *env, jclass clazz); - - jint (JNICALL *MonitorEnter) - (JNIEnv *env, jobject obj); - jint (JNICALL *MonitorExit) - (JNIEnv *env, jobject obj); - - jint (JNICALL *GetJavaVM) - (JNIEnv *env, JavaVM **vm); - - void (JNICALL *GetStringRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf); - void (JNICALL *GetStringUTFRegion) - (JNIEnv *env, jstring str, jsize start, jsize len, char *buf); - - void * (JNICALL *GetPrimitiveArrayCritical) - (JNIEnv *env, jarray array, jboolean *isCopy); - void (JNICALL *ReleasePrimitiveArrayCritical) - (JNIEnv *env, jarray array, void *carray, jint mode); - - const jchar * (JNICALL *GetStringCritical) - (JNIEnv *env, jstring string, jboolean *isCopy); - void (JNICALL *ReleaseStringCritical) - (JNIEnv *env, jstring string, const jchar *cstring); - - jweak (JNICALL *NewWeakGlobalRef) - (JNIEnv *env, jobject obj); - void (JNICALL *DeleteWeakGlobalRef) - (JNIEnv *env, jweak ref); - - jboolean (JNICALL *ExceptionCheck) - (JNIEnv *env); - - jobject (JNICALL *NewDirectByteBuffer) - (JNIEnv* env, void* address, jlong capacity); - void* (JNICALL *GetDirectBufferAddress) - (JNIEnv* env, jobject buf); - jlong (JNICALL *GetDirectBufferCapacity) - (JNIEnv* env, jobject buf); -}; - -/* - * We use inlined functions for C++ so that programmers can write: - * - * env->FindClass("java/lang/String") - * - * in C++ rather than: - * - * (*env)->FindClass(env, "java/lang/String") - * - * in C. - */ - -struct JNIEnv_ { - const struct JNINativeInterface_ *functions; -#ifdef __cplusplus - - jint GetVersion() { - return functions->GetVersion(this); - } - jclass DefineClass(const char *name, jobject loader, const jbyte *buf, - jsize len) { - return functions->DefineClass(this, name, loader, buf, len); - } - jclass FindClass(const char *name) { - return functions->FindClass(this, name); - } - jmethodID FromReflectedMethod(jobject method) { - return functions->FromReflectedMethod(this,method); - } - jfieldID FromReflectedField(jobject field) { - return functions->FromReflectedField(this,field); - } - - jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) { - return functions->ToReflectedMethod(this, cls, methodID, isStatic); - } - - jclass GetSuperclass(jclass sub) { - return functions->GetSuperclass(this, sub); - } - jboolean IsAssignableFrom(jclass sub, jclass sup) { - return functions->IsAssignableFrom(this, sub, sup); - } - - jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) { - return functions->ToReflectedField(this,cls,fieldID,isStatic); - } - - jint Throw(jthrowable obj) { - return functions->Throw(this, obj); - } - jint ThrowNew(jclass clazz, const char *msg) { - return functions->ThrowNew(this, clazz, msg); - } - jthrowable ExceptionOccurred() { - return functions->ExceptionOccurred(this); - } - void ExceptionDescribe() { - functions->ExceptionDescribe(this); - } - void ExceptionClear() { - functions->ExceptionClear(this); - } - void FatalError(const char *msg) { - functions->FatalError(this, msg); - } - - jint PushLocalFrame(jint capacity) { - return functions->PushLocalFrame(this,capacity); - } - jobject PopLocalFrame(jobject result) { - return functions->PopLocalFrame(this,result); - } - - jobject NewGlobalRef(jobject lobj) { - return functions->NewGlobalRef(this,lobj); - } - void DeleteGlobalRef(jobject gref) { - functions->DeleteGlobalRef(this,gref); - } - void DeleteLocalRef(jobject obj) { - functions->DeleteLocalRef(this, obj); - } - - jboolean IsSameObject(jobject obj1, jobject obj2) { - return functions->IsSameObject(this,obj1,obj2); - } - - jobject NewLocalRef(jobject ref) { - return functions->NewLocalRef(this,ref); - } - jint EnsureLocalCapacity(jint capacity) { - return functions->EnsureLocalCapacity(this,capacity); - } - - jobject AllocObject(jclass clazz) { - return functions->AllocObject(this,clazz); - } - jobject NewObject(jclass clazz, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args, methodID); - result = functions->NewObjectV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject NewObjectV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->NewObjectV(this,clazz,methodID,args); - } - jobject NewObjectA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->NewObjectA(this,clazz,methodID,args); - } - - jclass GetObjectClass(jobject obj) { - return functions->GetObjectClass(this,obj); - } - jboolean IsInstanceOf(jobject obj, jclass clazz) { - return functions->IsInstanceOf(this,obj,clazz); - } - - jmethodID GetMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetMethodID(this,clazz,name,sig); - } - - jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallObjectMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jobject CallObjectMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallObjectMethodV(this,obj,methodID,args); - } - jobject CallObjectMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallObjectMethodA(this,obj,methodID,args); - } - - jboolean CallBooleanMethod(jobject obj, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallBooleanMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallBooleanMethodV(this,obj,methodID,args); - } - jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallBooleanMethodA(this,obj,methodID, args); - } - - jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallByteMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jbyte CallByteMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallByteMethodV(this,obj,methodID,args); - } - jbyte CallByteMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallByteMethodA(this,obj,methodID,args); - } - - jchar CallCharMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallCharMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jchar CallCharMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallCharMethodV(this,obj,methodID,args); - } - jchar CallCharMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallCharMethodA(this,obj,methodID,args); - } - - jshort CallShortMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallShortMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jshort CallShortMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallShortMethodV(this,obj,methodID,args); - } - jshort CallShortMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallShortMethodA(this,obj,methodID,args); - } - - jint CallIntMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallIntMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jint CallIntMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallIntMethodV(this,obj,methodID,args); - } - jint CallIntMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallIntMethodA(this,obj,methodID,args); - } - - jlong CallLongMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallLongMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jlong CallLongMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallLongMethodV(this,obj,methodID,args); - } - jlong CallLongMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallLongMethodA(this,obj,methodID,args); - } - - jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallFloatMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jfloat CallFloatMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallFloatMethodV(this,obj,methodID,args); - } - jfloat CallFloatMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallFloatMethodA(this,obj,methodID,args); - } - - jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallDoubleMethodV(this,obj,methodID,args); - va_end(args); - return result; - } - jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, - va_list args) { - return functions->CallDoubleMethodV(this,obj,methodID,args); - } - jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - return functions->CallDoubleMethodA(this,obj,methodID,args); - } - - void CallVoidMethod(jobject obj, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallVoidMethodV(this,obj,methodID,args); - va_end(args); - } - void CallVoidMethodV(jobject obj, jmethodID methodID, - va_list args) { - functions->CallVoidMethodV(this,obj,methodID,args); - } - void CallVoidMethodA(jobject obj, jmethodID methodID, - const jvalue * args) { - functions->CallVoidMethodA(this,obj,methodID,args); - } - - jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualObjectMethodV(this,obj,clazz, - methodID,args); - } - jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualObjectMethodA(this,obj,clazz, - methodID,args); - } - - jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualBooleanMethodV(this,obj,clazz, - methodID,args); - } - jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualBooleanMethodA(this,obj,clazz, - methodID, args); - } - - jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualByteMethodV(this,obj,clazz, - methodID,args); - } - jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualByteMethodA(this,obj,clazz, - methodID,args); - } - - jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualCharMethodV(this,obj,clazz, - methodID,args); - } - jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualCharMethodA(this,obj,clazz, - methodID,args); - } - - jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualShortMethodV(this,obj,clazz, - methodID,args); - } - jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualShortMethodA(this,obj,clazz, - methodID,args); - } - - jint CallNonvirtualIntMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualIntMethodV(this,obj,clazz, - methodID,args); - } - jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualIntMethodA(this,obj,clazz, - methodID,args); - } - - jlong CallNonvirtualLongMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallNonvirtualLongMethodV(this,obj,clazz, - methodID,args); - } - jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, - jmethodID methodID, const jvalue * args) { - return functions->CallNonvirtualLongMethodA(this,obj,clazz, - methodID,args); - } - - jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualFloatMethodV(this,obj,clazz, - methodID,args); - } - jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualFloatMethodA(this,obj,clazz, - methodID,args); - } - - jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - va_end(args); - return result; - } - jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - return functions->CallNonvirtualDoubleMethodV(this,obj,clazz, - methodID,args); - } - jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - return functions->CallNonvirtualDoubleMethodA(this,obj,clazz, - methodID,args); - } - - void CallNonvirtualVoidMethod(jobject obj, jclass clazz, - jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - va_end(args); - } - void CallNonvirtualVoidMethodV(jobject obj, jclass clazz, - jmethodID methodID, - va_list args) { - functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args); - } - void CallNonvirtualVoidMethodA(jobject obj, jclass clazz, - jmethodID methodID, - const jvalue * args) { - functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args); - } - - jfieldID GetFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetFieldID(this,clazz,name,sig); - } - - jobject GetObjectField(jobject obj, jfieldID fieldID) { - return functions->GetObjectField(this,obj,fieldID); - } - jboolean GetBooleanField(jobject obj, jfieldID fieldID) { - return functions->GetBooleanField(this,obj,fieldID); - } - jbyte GetByteField(jobject obj, jfieldID fieldID) { - return functions->GetByteField(this,obj,fieldID); - } - jchar GetCharField(jobject obj, jfieldID fieldID) { - return functions->GetCharField(this,obj,fieldID); - } - jshort GetShortField(jobject obj, jfieldID fieldID) { - return functions->GetShortField(this,obj,fieldID); - } - jint GetIntField(jobject obj, jfieldID fieldID) { - return functions->GetIntField(this,obj,fieldID); - } - jlong GetLongField(jobject obj, jfieldID fieldID) { - return functions->GetLongField(this,obj,fieldID); - } - jfloat GetFloatField(jobject obj, jfieldID fieldID) { - return functions->GetFloatField(this,obj,fieldID); - } - jdouble GetDoubleField(jobject obj, jfieldID fieldID) { - return functions->GetDoubleField(this,obj,fieldID); - } - - void SetObjectField(jobject obj, jfieldID fieldID, jobject val) { - functions->SetObjectField(this,obj,fieldID,val); - } - void SetBooleanField(jobject obj, jfieldID fieldID, - jboolean val) { - functions->SetBooleanField(this,obj,fieldID,val); - } - void SetByteField(jobject obj, jfieldID fieldID, - jbyte val) { - functions->SetByteField(this,obj,fieldID,val); - } - void SetCharField(jobject obj, jfieldID fieldID, - jchar val) { - functions->SetCharField(this,obj,fieldID,val); - } - void SetShortField(jobject obj, jfieldID fieldID, - jshort val) { - functions->SetShortField(this,obj,fieldID,val); - } - void SetIntField(jobject obj, jfieldID fieldID, - jint val) { - functions->SetIntField(this,obj,fieldID,val); - } - void SetLongField(jobject obj, jfieldID fieldID, - jlong val) { - functions->SetLongField(this,obj,fieldID,val); - } - void SetFloatField(jobject obj, jfieldID fieldID, - jfloat val) { - functions->SetFloatField(this,obj,fieldID,val); - } - void SetDoubleField(jobject obj, jfieldID fieldID, - jdouble val) { - functions->SetDoubleField(this,obj,fieldID,val); - } - - jmethodID GetStaticMethodID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticMethodID(this,clazz,name,sig); - } - - jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, - ...) { - va_list args; - jobject result; - va_start(args,methodID); - result = functions->CallStaticObjectMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, - va_list args) { - return functions->CallStaticObjectMethodV(this,clazz,methodID,args); - } - jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, - const jvalue *args) { - return functions->CallStaticObjectMethodA(this,clazz,methodID,args); - } - - jboolean CallStaticBooleanMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jboolean result; - va_start(args,methodID); - result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jboolean CallStaticBooleanMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticBooleanMethodV(this,clazz,methodID,args); - } - jboolean CallStaticBooleanMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticBooleanMethodA(this,clazz,methodID,args); - } - - jbyte CallStaticByteMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jbyte result; - va_start(args,methodID); - result = functions->CallStaticByteMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jbyte CallStaticByteMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticByteMethodV(this,clazz,methodID,args); - } - jbyte CallStaticByteMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticByteMethodA(this,clazz,methodID,args); - } - - jchar CallStaticCharMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jchar result; - va_start(args,methodID); - result = functions->CallStaticCharMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jchar CallStaticCharMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticCharMethodV(this,clazz,methodID,args); - } - jchar CallStaticCharMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticCharMethodA(this,clazz,methodID,args); - } - - jshort CallStaticShortMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jshort result; - va_start(args,methodID); - result = functions->CallStaticShortMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jshort CallStaticShortMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticShortMethodV(this,clazz,methodID,args); - } - jshort CallStaticShortMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticShortMethodA(this,clazz,methodID,args); - } - - jint CallStaticIntMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jint result; - va_start(args,methodID); - result = functions->CallStaticIntMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jint CallStaticIntMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticIntMethodV(this,clazz,methodID,args); - } - jint CallStaticIntMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticIntMethodA(this,clazz,methodID,args); - } - - jlong CallStaticLongMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jlong result; - va_start(args,methodID); - result = functions->CallStaticLongMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jlong CallStaticLongMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticLongMethodV(this,clazz,methodID,args); - } - jlong CallStaticLongMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticLongMethodA(this,clazz,methodID,args); - } - - jfloat CallStaticFloatMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jfloat result; - va_start(args,methodID); - result = functions->CallStaticFloatMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jfloat CallStaticFloatMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticFloatMethodV(this,clazz,methodID,args); - } - jfloat CallStaticFloatMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticFloatMethodA(this,clazz,methodID,args); - } - - jdouble CallStaticDoubleMethod(jclass clazz, - jmethodID methodID, ...) { - va_list args; - jdouble result; - va_start(args,methodID); - result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - va_end(args); - return result; - } - jdouble CallStaticDoubleMethodV(jclass clazz, - jmethodID methodID, va_list args) { - return functions->CallStaticDoubleMethodV(this,clazz,methodID,args); - } - jdouble CallStaticDoubleMethodA(jclass clazz, - jmethodID methodID, const jvalue *args) { - return functions->CallStaticDoubleMethodA(this,clazz,methodID,args); - } - - void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) { - va_list args; - va_start(args,methodID); - functions->CallStaticVoidMethodV(this,cls,methodID,args); - va_end(args); - } - void CallStaticVoidMethodV(jclass cls, jmethodID methodID, - va_list args) { - functions->CallStaticVoidMethodV(this,cls,methodID,args); - } - void CallStaticVoidMethodA(jclass cls, jmethodID methodID, - const jvalue * args) { - functions->CallStaticVoidMethodA(this,cls,methodID,args); - } - - jfieldID GetStaticFieldID(jclass clazz, const char *name, - const char *sig) { - return functions->GetStaticFieldID(this,clazz,name,sig); - } - jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticObjectField(this,clazz,fieldID); - } - jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticBooleanField(this,clazz,fieldID); - } - jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticByteField(this,clazz,fieldID); - } - jchar GetStaticCharField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticCharField(this,clazz,fieldID); - } - jshort GetStaticShortField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticShortField(this,clazz,fieldID); - } - jint GetStaticIntField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticIntField(this,clazz,fieldID); - } - jlong GetStaticLongField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticLongField(this,clazz,fieldID); - } - jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticFloatField(this,clazz,fieldID); - } - jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) { - return functions->GetStaticDoubleField(this,clazz,fieldID); - } - - void SetStaticObjectField(jclass clazz, jfieldID fieldID, - jobject value) { - functions->SetStaticObjectField(this,clazz,fieldID,value); - } - void SetStaticBooleanField(jclass clazz, jfieldID fieldID, - jboolean value) { - functions->SetStaticBooleanField(this,clazz,fieldID,value); - } - void SetStaticByteField(jclass clazz, jfieldID fieldID, - jbyte value) { - functions->SetStaticByteField(this,clazz,fieldID,value); - } - void SetStaticCharField(jclass clazz, jfieldID fieldID, - jchar value) { - functions->SetStaticCharField(this,clazz,fieldID,value); - } - void SetStaticShortField(jclass clazz, jfieldID fieldID, - jshort value) { - functions->SetStaticShortField(this,clazz,fieldID,value); - } - void SetStaticIntField(jclass clazz, jfieldID fieldID, - jint value) { - functions->SetStaticIntField(this,clazz,fieldID,value); - } - void SetStaticLongField(jclass clazz, jfieldID fieldID, - jlong value) { - functions->SetStaticLongField(this,clazz,fieldID,value); - } - void SetStaticFloatField(jclass clazz, jfieldID fieldID, - jfloat value) { - functions->SetStaticFloatField(this,clazz,fieldID,value); - } - void SetStaticDoubleField(jclass clazz, jfieldID fieldID, - jdouble value) { - functions->SetStaticDoubleField(this,clazz,fieldID,value); - } - - jstring NewString(const jchar *unicode, jsize len) { - return functions->NewString(this,unicode,len); - } - jsize GetStringLength(jstring str) { - return functions->GetStringLength(this,str); - } - const jchar *GetStringChars(jstring str, jboolean *isCopy) { - return functions->GetStringChars(this,str,isCopy); - } - void ReleaseStringChars(jstring str, const jchar *chars) { - functions->ReleaseStringChars(this,str,chars); - } - - jstring NewStringUTF(const char *utf) { - return functions->NewStringUTF(this,utf); - } - jsize GetStringUTFLength(jstring str) { - return functions->GetStringUTFLength(this,str); - } - const char* GetStringUTFChars(jstring str, jboolean *isCopy) { - return functions->GetStringUTFChars(this,str,isCopy); - } - void ReleaseStringUTFChars(jstring str, const char* chars) { - functions->ReleaseStringUTFChars(this,str,chars); - } - - jsize GetArrayLength(jarray array) { - return functions->GetArrayLength(this,array); - } - - jobjectArray NewObjectArray(jsize len, jclass clazz, - jobject init) { - return functions->NewObjectArray(this,len,clazz,init); - } - jobject GetObjectArrayElement(jobjectArray array, jsize index) { - return functions->GetObjectArrayElement(this,array,index); - } - void SetObjectArrayElement(jobjectArray array, jsize index, - jobject val) { - functions->SetObjectArrayElement(this,array,index,val); - } - - jbooleanArray NewBooleanArray(jsize len) { - return functions->NewBooleanArray(this,len); - } - jbyteArray NewByteArray(jsize len) { - return functions->NewByteArray(this,len); - } - jcharArray NewCharArray(jsize len) { - return functions->NewCharArray(this,len); - } - jshortArray NewShortArray(jsize len) { - return functions->NewShortArray(this,len); - } - jintArray NewIntArray(jsize len) { - return functions->NewIntArray(this,len); - } - jlongArray NewLongArray(jsize len) { - return functions->NewLongArray(this,len); - } - jfloatArray NewFloatArray(jsize len) { - return functions->NewFloatArray(this,len); - } - jdoubleArray NewDoubleArray(jsize len) { - return functions->NewDoubleArray(this,len); - } - - jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) { - return functions->GetBooleanArrayElements(this,array,isCopy); - } - jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) { - return functions->GetByteArrayElements(this,array,isCopy); - } - jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) { - return functions->GetCharArrayElements(this,array,isCopy); - } - jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) { - return functions->GetShortArrayElements(this,array,isCopy); - } - jint * GetIntArrayElements(jintArray array, jboolean *isCopy) { - return functions->GetIntArrayElements(this,array,isCopy); - } - jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) { - return functions->GetLongArrayElements(this,array,isCopy); - } - jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) { - return functions->GetFloatArrayElements(this,array,isCopy); - } - jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) { - return functions->GetDoubleArrayElements(this,array,isCopy); - } - - void ReleaseBooleanArrayElements(jbooleanArray array, - jboolean *elems, - jint mode) { - functions->ReleaseBooleanArrayElements(this,array,elems,mode); - } - void ReleaseByteArrayElements(jbyteArray array, - jbyte *elems, - jint mode) { - functions->ReleaseByteArrayElements(this,array,elems,mode); - } - void ReleaseCharArrayElements(jcharArray array, - jchar *elems, - jint mode) { - functions->ReleaseCharArrayElements(this,array,elems,mode); - } - void ReleaseShortArrayElements(jshortArray array, - jshort *elems, - jint mode) { - functions->ReleaseShortArrayElements(this,array,elems,mode); - } - void ReleaseIntArrayElements(jintArray array, - jint *elems, - jint mode) { - functions->ReleaseIntArrayElements(this,array,elems,mode); - } - void ReleaseLongArrayElements(jlongArray array, - jlong *elems, - jint mode) { - functions->ReleaseLongArrayElements(this,array,elems,mode); - } - void ReleaseFloatArrayElements(jfloatArray array, - jfloat *elems, - jint mode) { - functions->ReleaseFloatArrayElements(this,array,elems,mode); - } - void ReleaseDoubleArrayElements(jdoubleArray array, - jdouble *elems, - jint mode) { - functions->ReleaseDoubleArrayElements(this,array,elems,mode); - } - - void GetBooleanArrayRegion(jbooleanArray array, - jsize start, jsize len, jboolean *buf) { - functions->GetBooleanArrayRegion(this,array,start,len,buf); - } - void GetByteArrayRegion(jbyteArray array, - jsize start, jsize len, jbyte *buf) { - functions->GetByteArrayRegion(this,array,start,len,buf); - } - void GetCharArrayRegion(jcharArray array, - jsize start, jsize len, jchar *buf) { - functions->GetCharArrayRegion(this,array,start,len,buf); - } - void GetShortArrayRegion(jshortArray array, - jsize start, jsize len, jshort *buf) { - functions->GetShortArrayRegion(this,array,start,len,buf); - } - void GetIntArrayRegion(jintArray array, - jsize start, jsize len, jint *buf) { - functions->GetIntArrayRegion(this,array,start,len,buf); - } - void GetLongArrayRegion(jlongArray array, - jsize start, jsize len, jlong *buf) { - functions->GetLongArrayRegion(this,array,start,len,buf); - } - void GetFloatArrayRegion(jfloatArray array, - jsize start, jsize len, jfloat *buf) { - functions->GetFloatArrayRegion(this,array,start,len,buf); - } - void GetDoubleArrayRegion(jdoubleArray array, - jsize start, jsize len, jdouble *buf) { - functions->GetDoubleArrayRegion(this,array,start,len,buf); - } - - void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, - const jboolean *buf) { - functions->SetBooleanArrayRegion(this,array,start,len,buf); - } - void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, - const jbyte *buf) { - functions->SetByteArrayRegion(this,array,start,len,buf); - } - void SetCharArrayRegion(jcharArray array, jsize start, jsize len, - const jchar *buf) { - functions->SetCharArrayRegion(this,array,start,len,buf); - } - void SetShortArrayRegion(jshortArray array, jsize start, jsize len, - const jshort *buf) { - functions->SetShortArrayRegion(this,array,start,len,buf); - } - void SetIntArrayRegion(jintArray array, jsize start, jsize len, - const jint *buf) { - functions->SetIntArrayRegion(this,array,start,len,buf); - } - void SetLongArrayRegion(jlongArray array, jsize start, jsize len, - const jlong *buf) { - functions->SetLongArrayRegion(this,array,start,len,buf); - } - void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, - const jfloat *buf) { - functions->SetFloatArrayRegion(this,array,start,len,buf); - } - void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len, - const jdouble *buf) { - functions->SetDoubleArrayRegion(this,array,start,len,buf); - } - - jint RegisterNatives(jclass clazz, const JNINativeMethod *methods, - jint nMethods) { - return functions->RegisterNatives(this,clazz,methods,nMethods); - } - jint UnregisterNatives(jclass clazz) { - return functions->UnregisterNatives(this,clazz); - } - - jint MonitorEnter(jobject obj) { - return functions->MonitorEnter(this,obj); - } - jint MonitorExit(jobject obj) { - return functions->MonitorExit(this,obj); - } - - jint GetJavaVM(JavaVM **vm) { - return functions->GetJavaVM(this,vm); - } - - void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) { - functions->GetStringRegion(this,str,start,len,buf); - } - void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) { - functions->GetStringUTFRegion(this,str,start,len,buf); - } - - void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) { - return functions->GetPrimitiveArrayCritical(this,array,isCopy); - } - void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) { - functions->ReleasePrimitiveArrayCritical(this,array,carray,mode); - } - - const jchar * GetStringCritical(jstring string, jboolean *isCopy) { - return functions->GetStringCritical(this,string,isCopy); - } - void ReleaseStringCritical(jstring string, const jchar *cstring) { - functions->ReleaseStringCritical(this,string,cstring); - } - - jweak NewWeakGlobalRef(jobject obj) { - return functions->NewWeakGlobalRef(this,obj); - } - void DeleteWeakGlobalRef(jweak ref) { - functions->DeleteWeakGlobalRef(this,ref); - } - - jboolean ExceptionCheck() { - return functions->ExceptionCheck(this); - } - - jobject NewDirectByteBuffer(void* address, jlong capacity) { - return functions->NewDirectByteBuffer(this, address, capacity); - } - void* GetDirectBufferAddress(jobject buf) { - return functions->GetDirectBufferAddress(this, buf); - } - jlong GetDirectBufferCapacity(jobject buf) { - return functions->GetDirectBufferCapacity(this, buf); - } - -#endif /* __cplusplus */ -}; - -typedef struct JavaVMOption { - char *optionString; - void *extraInfo; -} JavaVMOption; - -typedef struct JavaVMInitArgs { - jint version; - - jint nOptions; - JavaVMOption *options; - jboolean ignoreUnrecognized; -} JavaVMInitArgs; - -typedef struct JavaVMAttachArgs { - jint version; - - char *name; - jobject group; -} JavaVMAttachArgs; - -/* These structures will be VM-specific. */ - -typedef struct JDK1_1InitArgs { - jint version; - - char **properties; - jint checkSource; - jint nativeStackSize; - jint javaStackSize; - jint minHeapSize; - jint maxHeapSize; - jint verifyMode; - char *classpath; - - jint (JNICALL *vfprintf)(FILE *fp, const char *format, va_list args); - void (JNICALL *exit)(jint code); - void (JNICALL *abort)(void); - - jint enableClassGC; - jint enableVerboseGC; - jint disableAsyncGC; - jint verbose; - jboolean debugging; - jint debugPort; -} JDK1_1InitArgs; - -typedef struct JDK1_1AttachArgs { - void * __padding; /* C compilers don't allow empty structures. */ -} JDK1_1AttachArgs; - -#define JDK1_2 -#define JDK1_4 - -/* End VM-specific. */ - -struct JNIInvokeInterface_ { - void *reserved0; - void *reserved1; - void *reserved2; - - jint (JNICALL *DestroyJavaVM)(JavaVM *vm); - - jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args); - - jint (JNICALL *DetachCurrentThread)(JavaVM *vm); - - jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version); - - jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args); -}; - -struct JavaVM_ { - const struct JNIInvokeInterface_ *functions; -#ifdef __cplusplus - - jint DestroyJavaVM() { - return functions->DestroyJavaVM(this); - } - jint AttachCurrentThread(void **penv, void *args) { - return functions->AttachCurrentThread(this, penv, args); - } - jint DetachCurrentThread() { - return functions->DetachCurrentThread(this); - } - - jint GetEnv(void **penv, jint version) { - return functions->GetEnv(this, penv, version); - } - jint AttachCurrentThreadAsDaemon(void **penv, void *args) { - return functions->AttachCurrentThreadAsDaemon(this, penv, args); - } -#endif -}; - -#ifdef _JNI_IMPLEMENTATION_ -#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT -#else -#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT -#endif -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetDefaultJavaVMInitArgs(void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args); - -_JNI_IMPORT_OR_EXPORT_ jint JNICALL -JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *); - -/* Defined by native libraries. */ -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *vm, void *reserved); - -JNIEXPORT void JNICALL -JNI_OnUnload(JavaVM *vm, void *reserved); - -#define JNI_VERSION_1_1 0x00010001 -#define JNI_VERSION_1_2 0x00010002 -#define JNI_VERSION_1_4 0x00010004 - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -#endif /* !_JAVASOFT_JNI_H_ */ diff --git a/sqlitejdbc/lib/inc_win/jni_md.h b/sqlitejdbc/lib/inc_win/jni_md.h deleted file mode 100644 index 26a733d..0000000 --- a/sqlitejdbc/lib/inc_win/jni_md.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * @(#)jni_md.h 1.14 03/12/19 - * - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - */ - -#ifndef _JAVASOFT_JNI_MD_H_ -#define _JAVASOFT_JNI_MD_H_ - -#define JNIEXPORT __declspec(dllexport) -#define JNIIMPORT __declspec(dllimport) -#define JNICALL __stdcall - -typedef long jint; -typedef __int64 jlong; -typedef signed char jbyte; - -#endif /* !_JAVASOFT_JNI_MD_H_ */ diff --git a/sqlitejdbc/lib/jdbc-1.4.jar b/sqlitejdbc/lib/jdbc-1.4.jar deleted file mode 100644 index e6aa9600f15e4058a82f551dad56f0b62acf94ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24600 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 F^nY^8q$B_U diff --git a/sqlitejdbc/lib/junit-4.1.jar b/sqlitejdbc/lib/junit-4.1.jar deleted file mode 100644 index 2c46d67a2b9033db454ed93048cf19b961b5f0f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112249 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 _darcs/prefs/defaultrepo -mkdir -p dist -mkdir -p work/$sqlitejdbc/src -cp Makefile* work/$sqlitejdbc/. -cp README work/$sqlitejdbc/. -cp LICENSE work/$sqlitejdbc/. -cp VERSION work/$sqlitejdbc/. -cp -R src/org work/$sqlitejdbc/src/. -cp -R src/test work/$sqlitejdbc/src/. -cp -R _darcs work/$sqlitejdbc/. -cp -R lib work/$sqlitejdbc/. -(cd work && tar cfz ../dist/$sqlitejdbc-src.tgz $sqlitejdbc) -rm -rf work - -# -# universal binary -# -maclib=libsqlitejdbc.jnilib - -echo '*** compiling for mac/ppc ***' -make os=Darwin arch=ppc native - -echo '*** compiling for mac/i386 ***' -make os=Darwin arch=i386 native - -echo '*** lipo ppc and i386 ***' -mkdir -p build/Darwin-universal -lipo -create build/Darwin-ppc/$maclib \ - build/Darwin-i386/$maclib \ - -output build/Darwin-universal/$maclib -mkdir -p dist -tar cfz dist/$sqlitejdbc-Mac.tgz README \ - -C build $sqlitejdbc-native.jar \ - -C Darwin-universal $maclib - -# -# windows -# -echo '*** compiling for windows ***' -darcs push -a debian:repo/sqlitejdbc -ssh debian "cd repo/sqlitejdbc && make os=Win arch=i586 dist/$sqlitejdbc-Win-i586.tgz" -scp debian:repo/sqlitejdbc/dist/$sqlitejdbc-Win-i586.tgz \ - dist/$sqlitejdbc-Win-i586.tgz - -# -# linux -# -echo '*** compiling for linux ***' -ssh debian "cd repo/sqlitejdbc && make arch=i386 dist/$sqlitejdbc-Default-i386.tgz" -scp debian:repo/sqlitejdbc/dist/$sqlitejdbc-Default-i386.tgz \ - dist/$sqlitejdbc-Linux-i386.tgz - -# -# pure java compile -# -echo '*** compiling pure java ***' -ssh debian "cd repo/sqlitejdbc && make -f Makefile.nested test dist/$sqlitejdbc-nested.tgz" -scp debian:repo/sqlitejdbc/dist/$sqlitejdbc-nested.tgz \ - dist/$sqlitejdbc-nested.tgz - -# -# build changes.html -# -echo '*** building changes.html ***' -cat > changes.html << EOF - - - -SQLiteJDBC - Changelog - - -EOF -cat web/ad.inc >> changes.html -echo '

Changelog

' >> changes.html -cat web/nav.inc >> changes.html -echo '

HEAD

    ' >> changes.html -# do not go back before version 008 -sh -c 'darcs changes --from-patch="version 026"' | grep \* >> changes.html -perl -pi -e "s/^ \* version ([0-9]+)$/<\/ul>

    Version \$1<\/h3>
      /g" \ - changes.html -perl -pi -e "s/^ \* (.*)\$/
    • \$1<\/li>/g" changes.html -echo '

' >> changes.html - -# -# push release to web server -# -if [ "$1" = "push" ]; then - echo '*** pushing release to afs ***' - darcs push -a $repo - cp dist/$sqlitejdbc-*.tgz $afs/dist/ - cp changes.html web/*.html web/*.css $afs/ - rm changes.html -fi diff --git a/sqlitejdbc/src/org/sqlite/Codes.java b/sqlitejdbc/src/org/sqlite/Codes.java deleted file mode 100644 index ab78411..0000000 --- a/sqlitejdbc/src/org/sqlite/Codes.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -interface Codes -{ - /** Successful result */ - public static final int SQLITE_OK = 0; - - /** SQL error or missing database */ - public static final int SQLITE_ERROR = 1; - - /** An internal logic error in SQLite */ - public static final int SQLITE_INTERNAL = 2; - - /** Access permission denied */ - public static final int SQLITE_PERM = 3; - - /** Callback routine requested an abort */ - public static final int SQLITE_ABORT = 4; - - /** The database file is locked */ - public static final int SQLITE_BUSY = 5; - - /** A table in the database is locked */ - public static final int SQLITE_LOCKED = 6; - - /** A malloc() failed */ - public static final int SQLITE_NOMEM = 7; - - /** Attempt to write a readonly database */ - public static final int SQLITE_READONLY = 8; - - /** Operation terminated by sqlite_interrupt() */ - public static final int SQLITE_INTERRUPT = 9; - - /** Some kind of disk I/O error occurred */ - public static final int SQLITE_IOERR = 10; - - /** The database disk image is malformed */ - public static final int SQLITE_CORRUPT = 11; - - /** (Internal Only) Table or record not found */ - public static final int SQLITE_NOTFOUND = 12; - - /** Insertion failed because database is full */ - public static final int SQLITE_FULL = 13; - - /** Unable to open the database file */ - public static final int SQLITE_CANTOPEN = 14; - - /** Database lock protocol error */ - public static final int SQLITE_PROTOCOL = 15; - - /** (Internal Only) Database table is empty */ - public static final int SQLITE_EMPTY = 16; - - /** The database schema changed */ - public static final int SQLITE_SCHEMA = 17; - - /** Too much data for one row of a table */ - public static final int SQLITE_TOOBIG = 18; - - /** Abort due to constraint violation */ - public static final int SQLITE_CONSTRAINT = 19; - - /** Data type mismatch */ - public static final int SQLITE_MISMATCH = 20; - - /** Library used incorrectly */ - public static final int SQLITE_MISUSE = 21; - - /** Uses OS features not supported on host */ - public static final int SQLITE_NOLFS = 22; - - /** Authorization denied */ - public static final int SQLITE_AUTH = 23; - - /** sqlite_step() has another row ready */ - public static final int SQLITE_ROW = 100; - - /** sqlite_step() has finished executing */ - public static final int SQLITE_DONE = 101; - - - // types returned by sqlite3_column_type() - - public static final int SQLITE_INTEGER = 1; - public static final int SQLITE_FLOAT = 2; - public static final int SQLITE_TEXT = 3; - public static final int SQLITE_BLOB = 4; - public static final int SQLITE_NULL = 5; -} diff --git a/sqlitejdbc/src/org/sqlite/Conn.java b/sqlitejdbc/src/org/sqlite/Conn.java deleted file mode 100644 index b0e8ec9..0000000 --- a/sqlitejdbc/src/org/sqlite/Conn.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import java.sql.*; -import java.util.*; -import java.io.File; -import java.lang.ref.WeakReference; - -class Conn implements Connection -{ - private final String url; - private DB db = null; - private MetaData meta = null; - private boolean autoCommit = true; - private int timeout = 0; - - public Conn(String url, String filename) throws SQLException { - // check the path to the file exists - if (!":memory:".equals(filename)) { - File file = new File(filename).getAbsoluteFile(); - File parent = file.getParentFile(); - if (parent != null && !parent.exists()) { - for (File up = parent; up != null && !up.exists();) { - parent = up; - up = up.getParentFile(); - } - throw new SQLException("path to '" + filename + "': '" - + parent + "' does not exist"); - } - - // check write access if file does not exist - try { - /* - * The extra check to exists() is necessary as createNewFile() does - * not follow the JavaDoc when used on read-only shares. Pointed out - * by armesschwein@googlemail.com. - */ - if (!file.exists() && file.createNewFile()) file.delete(); - } catch (Exception e) { - throw new SQLException( - "opening db: '" + filename + "': " +e.getMessage()); - } - filename = file.getAbsolutePath(); - } - - // TODO: library variable to explicitly control load type - // attempt to use the Native library first - try { - Class nativedb = Class.forName("org.sqlite.NativeDB"); - if (((Boolean)nativedb.getDeclaredMethod("load", null) - .invoke(null, null)).booleanValue()) - db = (DB)nativedb.newInstance(); - } catch (Exception e) { } // fall through to nested library - - // load nested library - if (db == null) { - try { - db = (DB)Class.forName("org.sqlite.NestedDB").newInstance(); - } catch (Exception e) { - throw new SQLException("no SQLite library found"); - } - } - - this.url = url; - db.open(this, filename); - setTimeout(3000); - } - - int getTimeout() { return timeout; } - void setTimeout(int ms) throws SQLException { - timeout = ms; - db.busy_timeout(ms); - } - String url() { return url; } - String libversion() throws SQLException { return db.libversion(); } - DB db() { return db; } - - private void checkOpen() throws SQLException { - if (db == null) throw new SQLException("database connection closed"); - } - - private void checkCursor(int rst, int rsc, int rsh) throws SQLException { - if (rst != ResultSet.TYPE_FORWARD_ONLY) throw new SQLException( - "SQLite only supports TYPE_FORWARD_ONLY cursors"); - if (rsc != ResultSet.CONCUR_READ_ONLY) throw new SQLException( - "SQLite only supports CONCUR_READ_ONLY cursors"); - if (rsh != ResultSet.CLOSE_CURSORS_AT_COMMIT) throw new SQLException( - "SQLite only supports closing cursors at commit"); - } - - public void finalize() throws SQLException { close(); } - public void close() throws SQLException { - if (db == null) return; - if (meta != null) meta.close(); - - db.close(); - db = null; - } - - public boolean isClosed() throws SQLException { return db == null; } - - public String getCatalog() throws SQLException { checkOpen(); return null; } - public void setCatalog(String catalog) throws SQLException { checkOpen(); } - - public int getHoldability() throws SQLException { - checkOpen(); return ResultSet.CLOSE_CURSORS_AT_COMMIT; } - public void setHoldability(int h) throws SQLException { - checkOpen(); - if (h != ResultSet.CLOSE_CURSORS_AT_COMMIT) throw new SQLException( - "SQLite only supports CLOSE_CURSORS_AT_COMMIT"); - } - - public int getTransactionIsolation() { return TRANSACTION_SERIALIZABLE; } - public void setTransactionIsolation(int level) throws SQLException { - if (level != TRANSACTION_SERIALIZABLE) throw new SQLException( - "SQLite supports only TRANSACTION_SERIALIZABLE"); - } - - public Map getTypeMap() throws SQLException - { throw new SQLException("not yet implemented");} - public void setTypeMap(Map map) throws SQLException - { throw new SQLException("not yet implemented");} - - public boolean isReadOnly() throws SQLException { return false; } // FIXME - public void setReadOnly(boolean ro) throws SQLException {} - - public DatabaseMetaData getMetaData() { - if (meta == null) meta = new MetaData(this); - return meta; - } - - public String nativeSQL(String sql) { return sql; } - - public void clearWarnings() throws SQLException { } - public SQLWarning getWarnings() throws SQLException { return null; } - - public boolean getAutoCommit() throws SQLException { - checkOpen(); return autoCommit; } - public void setAutoCommit(boolean ac) throws SQLException { - checkOpen(); - if (autoCommit == ac) return; - autoCommit = ac; - db.exec(autoCommit ? "commit;" : "begin;"); - } - - public void commit() throws SQLException { - checkOpen(); - if (autoCommit) throw new SQLException("database in auto-commit mode"); - db.exec("commit;"); - db.exec("begin;"); - } - - public void rollback() throws SQLException { - checkOpen(); - if (autoCommit) throw new SQLException("database in auto-commit mode"); - db.exec("rollback;"); - db.exec("begin;"); - } - - public Statement createStatement() throws SQLException { - return createStatement(ResultSet.TYPE_FORWARD_ONLY, - ResultSet.CONCUR_READ_ONLY, - ResultSet.CLOSE_CURSORS_AT_COMMIT); - } - public Statement createStatement(int rsType, int rsConcurr) - throws SQLException { return createStatement(rsType, rsConcurr, - ResultSet.CLOSE_CURSORS_AT_COMMIT); - } - public Statement createStatement(int rst, int rsc, int rsh) - throws SQLException { - checkCursor(rst, rsc, rsh); - return new Stmt(this); - } - - public CallableStatement prepareCall(String sql) throws SQLException { - return prepareCall(sql, ResultSet.TYPE_FORWARD_ONLY, - ResultSet.CONCUR_READ_ONLY, - ResultSet.CLOSE_CURSORS_AT_COMMIT); - } - public CallableStatement prepareCall(String sql, int rst, int rsc) - throws SQLException { - return prepareCall(sql, rst, rsc, ResultSet.CLOSE_CURSORS_AT_COMMIT); - } - public CallableStatement prepareCall(String sql, int rst, int rsc, int rsh) - throws SQLException { - throw new SQLException("SQLite does not support Stored Procedures"); - } - - public PreparedStatement prepareStatement(String sql) throws SQLException { - return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, - ResultSet.CONCUR_READ_ONLY); - } - public PreparedStatement prepareStatement(String sql, int autoC) - throws SQLException { throw new SQLException("NYI"); } - public PreparedStatement prepareStatement(String sql, int[] colInds) - throws SQLException { throw new SQLException("NYI"); } - public PreparedStatement prepareStatement(String sql, String[] colNames) - throws SQLException { throw new SQLException("NYI"); } - public PreparedStatement prepareStatement(String sql, int rst, int rsc) - throws SQLException { - return prepareStatement(sql, rst, rsc, - ResultSet.CLOSE_CURSORS_AT_COMMIT); - } - - public PreparedStatement prepareStatement( - String sql, int rst, int rsc, int rsh) throws SQLException { - checkCursor(rst, rsc, rsh); - return new PrepStmt(this, sql); - } - - - // UNUSED FUNCTIONS ///////////////////////////////////////////// - - public Savepoint setSavepoint() throws SQLException { - throw new SQLException("unsupported by SQLite: savepoints"); } - public Savepoint setSavepoint(String name) throws SQLException { - throw new SQLException("unsupported by SQLite: savepoints"); } - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - throw new SQLException("unsupported by SQLite: savepoints"); } - public void rollback(Savepoint savepoint) throws SQLException { - throw new SQLException("unsupported by SQLite: savepoints"); } - - public Struct createStruct(String t, Object[] attr) throws SQLException { - throw new SQLException("unsupported by SQLite"); } -} diff --git a/sqlitejdbc/src/org/sqlite/DB.java b/sqlitejdbc/src/org/sqlite/DB.java deleted file mode 100644 index 41d25a6..0000000 --- a/sqlitejdbc/src/org/sqlite/DB.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import java.lang.ref.*; -import java.io.File; -import java.sql.*; -import java.util.*; - -/* - * This class is the interface to SQLite. It provides some helper functions - * used by other parts of the driver. The goal of the helper functions here - * are not only to provide functionality, but to handle contractual - * differences between the JDBC specification and the SQLite C API. - * - * The process of moving SQLite weirdness into this class is incomplete. - * You'll still find lots of code in Stmt and PrepStmt that are doing - * implicit contract conversions. Sorry. - * - * The two subclasses, NativeDB and NestedDB, provide the actual access to - * SQLite functions. - */ -abstract class DB implements Codes -{ - /** The JDBC Connection that 'owns' this database instance. */ - Conn conn = null; - - /** The "begin;"and "commit;" statement handles. */ - long begin = 0; - long commit = 0; - - /** Tracer for statements to avoid unfinalized statements on db close. */ - private Map stmts = new Hashtable(); - - // WRAPPER FUNCTIONS //////////////////////////////////////////// - - abstract void interrupt() throws SQLException; - abstract void busy_timeout(int ms) throws SQLException; - abstract String errmsg() throws SQLException; - abstract String libversion() throws SQLException; - abstract int changes() throws SQLException; - - final synchronized void exec(String sql) throws SQLException { - long pointer = 0; - try { - pointer = prepare(sql); - switch (step(pointer)) { - case SQLITE_DONE: - ensureAutoCommit(); - return; - case SQLITE_ROW: - return; - default: - throwex(); - } - } finally { - finalize(pointer); - } - } - - final synchronized void open(Conn conn, String file) throws SQLException { - this.conn = conn; - _open(file); - } - - final synchronized void close() throws SQLException { - // finalize any remaining statements before closing db - synchronized (stmts) { - Iterator i = stmts.entrySet().iterator(); - while (i.hasNext()) { - Map.Entry entry = (Map.Entry)i.next(); - Stmt stmt = (Stmt)entry.getValue(); - finalize(((Long)entry.getKey()).longValue()); - if (stmt != null) { - stmt.pointer = 0; - } - i.remove(); - } - } - - // remove memory used by user-defined functions - free_functions(); - - // clean up commit object - if (begin != 0) { - finalize(begin); - begin = 0; - } - if (commit != 0) { - finalize(commit); - commit = 0; - } - - _close(); - } - - final synchronized void prepare(Stmt stmt) throws SQLException { - if (stmt.pointer != 0) - finalize(stmt); - stmt.pointer = prepare(stmt.sql); - stmts.put(new Long(stmt.pointer), stmt); - } - - final synchronized int finalize(Stmt stmt) throws SQLException { - if (stmt.pointer == 0) return 0; - int rc = SQLITE_ERROR; - try { - rc = finalize(stmt.pointer); - } finally { - stmts.remove(new Long(stmt.pointer)); - stmt.pointer = 0; - } - return rc; - } - - protected abstract void _open(String filename) throws SQLException; - protected abstract void _close() throws SQLException; - protected abstract long prepare(String sql) throws SQLException; - protected abstract int finalize(long stmt) throws SQLException; - protected abstract int step(long stmt) throws SQLException; - protected abstract int reset(long stmt) throws SQLException; - - abstract int clear_bindings(long stmt) throws SQLException; // TODO remove? - abstract int bind_parameter_count(long stmt) throws SQLException; - - abstract int column_count (long stmt) throws SQLException; - abstract int column_type (long stmt, int col) throws SQLException; - abstract String column_decltype (long stmt, int col) throws SQLException; - abstract String column_table_name (long stmt, int col) throws SQLException; - abstract String column_name (long stmt, int col) throws SQLException; - abstract String column_text (long stmt, int col) throws SQLException; - abstract byte[] column_blob (long stmt, int col) throws SQLException; - abstract double column_double (long stmt, int col) throws SQLException; - abstract long column_long (long stmt, int col) throws SQLException; - abstract int column_int (long stmt, int col) throws SQLException; - - abstract int bind_null (long stmt, int pos) throws SQLException; - abstract int bind_int (long stmt, int pos, int v) throws SQLException; - abstract int bind_long (long stmt, int pos, long v) throws SQLException; - abstract int bind_double(long stmt, int pos, double v) throws SQLException; - abstract int bind_text (long stmt, int pos, String v) throws SQLException; - abstract int bind_blob (long stmt, int pos, byte[] v) throws SQLException; - - abstract void result_null (long context) throws SQLException; - abstract void result_text (long context, String val) throws SQLException; - abstract void result_blob (long context, byte[] val) throws SQLException; - abstract void result_double(long context, double val) throws SQLException; - abstract void result_long (long context, long val) throws SQLException; - abstract void result_int (long context, int val) throws SQLException; - abstract void result_error (long context, String err) throws SQLException; - - abstract int value_bytes (Function f, int arg) throws SQLException; - abstract String value_text (Function f, int arg) throws SQLException; - abstract byte[] value_blob (Function f, int arg) throws SQLException; - abstract double value_double(Function f, int arg) throws SQLException; - abstract long value_long (Function f, int arg) throws SQLException; - abstract int value_int (Function f, int arg) throws SQLException; - abstract int value_type (Function f, int arg) throws SQLException; - - abstract int create_function(String name, Function f) throws SQLException; - abstract int destroy_function(String name) throws SQLException; - abstract void free_functions() throws SQLException; - - /** Provides metadata for the columns of a statement. Returns: - * res[col][0] = true if column constrained NOT NULL - * res[col][1] = true if column is part of the primary key - * res[col][2] = true if column is auto-increment - */ - abstract boolean[][] column_metadata(long stmt) throws SQLException; - - - // COMPOUND FUNCTIONS //////////////////////////////////////////// - - final synchronized String[] column_names(long stmt) throws SQLException { - String[] names = new String[column_count(stmt)]; - for (int i=0; i < names.length; i++) - names[i] = column_name(stmt, i); - return names; - } - - final synchronized int sqlbind(long stmt, int pos, Object v) - throws SQLException { - pos++; - if (v == null) { - return bind_null(stmt, pos); - } else if (v instanceof Integer) { - return bind_int(stmt, pos, ((Integer)v).intValue()); - } else if (v instanceof Long) { - return bind_long(stmt, pos, ((Long)v).longValue()); - } else if (v instanceof Double) { - return bind_double(stmt, pos, ((Double)v).doubleValue()); - } else if (v instanceof String) { - return bind_text(stmt, pos, (String)v); - } else if (v instanceof byte[]) { - return bind_blob(stmt, pos, (byte[])v); - } else { - throw new SQLException("unexpected param type: "+v.getClass()); - } - } - - final synchronized int[] executeBatch(long stmt, int count, Object[] vals) - throws SQLException { - if (count < 1) throw new SQLException("count (" + count + ") < 1"); - - final int params = bind_parameter_count(stmt); - - int rc; - int[] changes = new int[count]; - - try { - for (int i=0; i < count; i++) { - reset(stmt); - for (int j=0; j < params; j++) - if (sqlbind(stmt, j, vals[(i * params) + j]) != SQLITE_OK) - throwex(); - - rc = step(stmt); - if (rc != SQLITE_DONE) { - reset(stmt); - if (rc == SQLITE_ROW) throw new BatchUpdateException( - "batch entry "+i+": query returns results", changes); - throwex(); - } - - changes[i] = changes(); - } - } finally { - ensureAutoCommit(); - } - - reset(stmt); - return changes; - } - - final synchronized boolean execute(Stmt stmt, Object[] vals) - throws SQLException { - if (vals != null) { - final int params = bind_parameter_count(stmt.pointer); - if (params != vals.length) - throw new SQLException("assertion failure: param count (" - + params + ") != value count (" + vals.length + ")"); - - for (int i=0; i < params; i++) - if (sqlbind(stmt.pointer, i, vals[i]) != SQLITE_OK) throwex(); - } - - switch (step(stmt.pointer)) { - case SQLITE_DONE: - reset(stmt.pointer); - ensureAutoCommit(); - return false; - case SQLITE_ROW: - return true; - case SQLITE_BUSY: - case SQLITE_LOCKED: - throw new SQLException("database locked"); - case SQLITE_MISUSE: - throw new SQLException(errmsg()); - default: - finalize(stmt); - throw new SQLException(errmsg()); - } - } - - final synchronized int executeUpdate(Stmt stmt, Object[] vals) - throws SQLException { - if (execute(stmt, vals)) - throw new SQLException("query returns results"); - reset(stmt.pointer); - return changes(); - } - - final void throwex() throws SQLException { - throw new SQLException(errmsg()); - } - - /* - * SQLite and the JDBC API have very different ideas about the meaning - * of auto-commit. Under JDBC, when executeUpdate() returns in - * auto-commit mode (the default), the programmer assumes the data has - * been written to disk. In SQLite however, a call to sqlite3_step() - * with an INSERT statement can return SQLITE_OK, and yet the data is - * still in limbo. - * - * This limbo appears when another statement on the database is active, - * e.g. a SELECT. SQLite auto-commit waits until the final read - * statement finishes, and then writes whatever updates have already - * been OKed. So if a program crashes before the reads are complete, - * data is lost. E.g: - * - * select begins - * insert - * select continues - * select finishes - * - * Works as expected, however - * - * select beings - * insert - * select continues - * crash - * - * Results in the data never being written to disk. - * - * As a solution, we call "commit" after every statement in auto-commit - * mode. - */ - final void ensureAutoCommit() throws SQLException { - if (!conn.getAutoCommit()) - return; - - if (begin == 0) - begin = prepare("begin;"); - if (commit == 0) - commit = prepare("commit;"); - - try { - if (step(begin) != SQLITE_DONE) - return; // assume we are in a transaction - if (step(commit) != SQLITE_DONE) { - reset(commit); - throwex(); - } - //throw new SQLException("unable to auto-commit"); - } finally { - reset(begin); - reset(commit); - } - } -} diff --git a/sqlitejdbc/src/org/sqlite/Function.java b/sqlitejdbc/src/org/sqlite/Function.java deleted file mode 100644 index 8faa757..0000000 --- a/sqlitejdbc/src/org/sqlite/Function.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import java.sql.*; - -/** Provides an interface for creating SQLite user-defined functions. - * - *

A subclass of org.sqlite.Function can be registered with - * Function.create() and called by the name it was given. All - * functions must implement xFunc(), which is called when SQLite - * runs the custom function.

- * - * Eg. - * - *
- *      Class.forName("org.sqlite.JDBC");
- *      Connection conn = DriverManager.getConnection("jdbc:sqlite:");
- *
- *      Function.create(conn, "myFunc", new Function() {
- *          protected void xFunc() {
- *              System.out.println("myFunc called!");
- *          }
- *      });
- *
- *      conn.createStatement().execute("select myFunc();");
- *  
- * - *

Arguments passed to a custom function can be accessed using the - * protected functions provided. args() returns - * the number of arguments passed, while - * value_<type>(int) returns the value of the specific - * argument. Similarly a function can return a value using the - * result(<type>) function.

- * - *

Aggregate functions are not yet supported, but coming soon.

- * - */ -public abstract class Function -{ - private Conn conn; - private DB db; - - long context = 0; // pointer sqlite3_context* - long value = 0; // pointer sqlite3_value** - int args = 0; - - /** Registers the given function with the Connection using the - * provided name. */ - public static final void create(Connection conn, String name, Function f) - throws SQLException { - if (conn == null || !(conn instanceof Conn)) - throw new SQLException("connection must be to an SQLite db"); - if (conn.isClosed()) - throw new SQLException("connection closed"); - - f.conn = (Conn)conn; - f.db = f.conn.db(); - - if (name == null || name.length() > 255) - throw new SQLException("invalid function name: '"+name+"'"); - - if (f.db.create_function(name, f) != Codes.SQLITE_OK) - throw new SQLException("error creating function"); - } - - /** Removes the named function form the Connection. */ - public static final void destroy(Connection conn, String name) - throws SQLException { - if (conn == null || !(conn instanceof Conn)) - throw new SQLException("connection must be to an SQLite db"); - ((Conn)conn).db().destroy_function(name); - } - - - /** Called by SQLite as a custom function. Should access arguments - * through value_*(int), return results with - * result(*) and throw errors with error(String). */ - protected abstract void xFunc() throws SQLException; - - - /** Returns the number of arguments passed to the function. - * Can only be called from xFunc(). */ - protected synchronized final int args() - throws SQLException { checkContext(); return args; } - - /** Called by xFunc to return a value. */ - protected synchronized final void result(byte[] value) - throws SQLException { checkContext(); db.result_blob(context, value); } - - /** Called by xFunc to return a value. */ - protected synchronized final void result(double value) - throws SQLException { checkContext(); db.result_double(context,value);} - - /** Called by xFunc to return a value. */ - protected synchronized final void result(int value) - throws SQLException { checkContext(); db.result_int(context, value); } - - /** Called by xFunc to return a value. */ - protected synchronized final void result(long value) - throws SQLException { checkContext(); db.result_long(context, value); } - - /** Called by xFunc to return a value. */ - protected synchronized final void result() - throws SQLException { checkContext(); db.result_null(context); } - - /** Called by xFunc to return a value. */ - protected synchronized final void result(String value) - throws SQLException { checkContext(); db.result_text(context, value); } - - /** Called by xFunc to throw an error. */ - protected synchronized final void error(String err) - throws SQLException { checkContext(); db.result_error(context, err); } - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final int value_bytes(int arg) - throws SQLException {checkValue(arg); return db.value_bytes(this,arg);} - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final String value_text(int arg) - throws SQLException {checkValue(arg); return db.value_text(this,arg);} - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final byte[] value_blob(int arg) - throws SQLException {checkValue(arg); return db.value_blob(this,arg); } - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final double value_double(int arg) - throws SQLException {checkValue(arg); return db.value_double(this,arg);} - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final int value_int(int arg) - throws SQLException {checkValue(arg); return db.value_int(this, arg); } - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final long value_long(int arg) - throws SQLException { checkValue(arg); return db.value_long(this,arg); } - - /** Called by xFunc to access the value of an argument. */ - protected synchronized final int value_type(int arg) - throws SQLException {checkValue(arg); return db.value_type(this,arg); } - - - private void checkContext() throws SQLException { - if (conn == null || conn.db() == null || context == 0) - throw new SQLException("no context, not allowed to read value"); - } - - private void checkValue(int arg) throws SQLException { - if (conn == null || conn.db() == null || value == 0) - throw new SQLException("not in value access state"); - if (arg >= args) - throw new SQLException("arg "+arg+" out bounds [0,"+args+")"); - } - - - public static abstract class Aggregate - extends Function - implements Cloneable - { - protected final void xFunc() {} - protected abstract void xStep() throws SQLException; - protected abstract void xFinal() throws SQLException; - - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - } -} diff --git a/sqlitejdbc/src/org/sqlite/JDBC.java b/sqlitejdbc/src/org/sqlite/JDBC.java deleted file mode 100644 index 34cf091..0000000 --- a/sqlitejdbc/src/org/sqlite/JDBC.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package org.sqlite; - -import java.sql.*; -import java.util.*; - -public class JDBC implements Driver -{ - private static final String PREFIX = "jdbc:sqlite:"; - - static { - try { - DriverManager.registerDriver(new JDBC()); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - public int getMajorVersion() { return 1; } - public int getMinorVersion() { return 1; } - - public boolean jdbcCompliant() { return false; } - - public boolean acceptsURL(String url) { - return url != null && url.toLowerCase().startsWith(PREFIX); - } - - public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) - throws SQLException { - return new DriverPropertyInfo[] {}; - } - - public Connection connect(String url, Properties info) throws SQLException { - if (!acceptsURL(url)) return null; - url = url.trim(); - - // if no file name is given use a memory database - return new Conn(url, PREFIX.equalsIgnoreCase(url) ? - ":memory:" : url.substring(PREFIX.length())); - } -} diff --git a/sqlitejdbc/src/org/sqlite/MetaData.java b/sqlitejdbc/src/org/sqlite/MetaData.java deleted file mode 100644 index 19b93da..0000000 --- a/sqlitejdbc/src/org/sqlite/MetaData.java +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package org.sqlite; - -import java.sql.*; - -class MetaData implements DatabaseMetaData -{ - private Conn conn; - private PreparedStatement - getTables = null, - getTableTypes = null, - getTypeInfo = null, - getCrossReference = null, - getCatalogs = null, - getSchemas = null, - getUDTs = null, - getColumnsTblName = null, - getSuperTypes = null, - getSuperTables = null, - getTablePrivileges = null, - getExportedKeys = null, - getProcedures = null, - getProcedureColumns = null, - getAttributes = null, - getBestRowIdentifier = null, - getVersionColumns = null, - getColumnPrivileges = null; - - /** Used by PrepStmt to save generating a new statement every call. */ - private PreparedStatement getGeneratedKeys = null; - - MetaData(Conn conn) { this.conn = conn; } - - void checkOpen() throws SQLException { - if (conn == null) throw new SQLException("connection closed"); } - - synchronized void close() throws SQLException { - if (conn == null) return; - - try { - if (getTables != null) getTables.close(); - if (getTableTypes != null) getTableTypes.close(); - if (getTypeInfo != null) getTypeInfo.close(); - if (getCrossReference != null) getCrossReference.close(); - if (getCatalogs != null) getCatalogs.close(); - if (getSchemas != null) getSchemas.close(); - if (getUDTs != null) getUDTs.close(); - if (getColumnsTblName != null) getColumnsTblName.close(); - if (getSuperTypes != null) getSuperTypes.close(); - if (getSuperTables != null) getSuperTables.close(); - if (getTablePrivileges != null) getTablePrivileges.close(); - if (getExportedKeys != null) getExportedKeys.close(); - if (getProcedures != null) getProcedures.close(); - if (getProcedureColumns != null) getProcedureColumns.close(); - if (getAttributes != null) getAttributes.close(); - if (getBestRowIdentifier != null) getBestRowIdentifier.close(); - if (getVersionColumns != null) getVersionColumns.close(); - if (getColumnPrivileges != null) getColumnPrivileges.close(); - if (getGeneratedKeys != null) getGeneratedKeys.close(); - - getTables = null; - getTableTypes = null; - getTypeInfo = null; - getCrossReference = null; - getCatalogs = null; - getSchemas = null; - getUDTs = null; - getColumnsTblName = null; - getSuperTypes = null; - getSuperTables = null; - getTablePrivileges = null; - getExportedKeys = null; - getProcedures = null; - getProcedureColumns = null; - getAttributes = null; - getBestRowIdentifier = null; - getVersionColumns = null; - getColumnPrivileges = null; - getGeneratedKeys = null; - } finally { - conn = null; - } - } - - public Connection getConnection() { return conn; } - public int getDatabaseMajorVersion() { return 3; } - public int getDatabaseMinorVersion() { return 0; } - public int getDriverMajorVersion() { return 1; } - public int getDriverMinorVersion() { return 1; } - public int getJDBCMajorVersion() { return 2; } - public int getJDBCMinorVersion() { return 1; } - public int getDefaultTransactionIsolation() - { return Connection.TRANSACTION_SERIALIZABLE; } - public int getMaxBinaryLiteralLength() { return 0; } - public int getMaxCatalogNameLength() { return 0; } - public int getMaxCharLiteralLength() { return 0; } - public int getMaxColumnNameLength() { return 0; } - public int getMaxColumnsInGroupBy() { return 0; } - public int getMaxColumnsInIndex() { return 0; } - public int getMaxColumnsInOrderBy() { return 0; } - public int getMaxColumnsInSelect() { return 0; } - public int getMaxColumnsInTable() { return 0; } - public int getMaxConnections() { return 0; } - public int getMaxCursorNameLength() { return 0; } - public int getMaxIndexLength() { return 0; } - public int getMaxProcedureNameLength() { return 0; } - public int getMaxRowSize() { return 0; } - public int getMaxSchemaNameLength() { return 0; } - public int getMaxStatementLength() { return 0; } - public int getMaxStatements() { return 0; } - public int getMaxTableNameLength() { return 0; } - public int getMaxTablesInSelect() { return 0; } - public int getMaxUserNameLength() { return 0; } - public int getResultSetHoldability() - { return ResultSet.CLOSE_CURSORS_AT_COMMIT; } - public int getSQLStateType() { return sqlStateSQL99; } - - public String getDatabaseProductName() { return "SQLite"; } - public String getDatabaseProductVersion() throws SQLException { - return conn.libversion(); } - public String getDriverName() { return "SQLiteJDBC"; } - public String getDriverVersion() { return "1"; } - public String getExtraNameCharacters() { return ""; } - public String getCatalogSeparator() { return "."; } - public String getCatalogTerm() { return "catalog"; } - public String getSchemaTerm() { return "schema"; } - public String getProcedureTerm() { return "not_implemented"; } - public String getSearchStringEscape() { return null; } - public String getIdentifierQuoteString() { return " "; } - public String getSQLKeywords() { return ""; } - public String getNumericFunctions() { return ""; } - public String getStringFunctions() { return ""; } - public String getSystemFunctions() { return ""; } - public String getTimeDateFunctions() { return ""; } - - public String getURL() { return conn.url(); } - public String getUserName() { return null; } - - public boolean allProceduresAreCallable() { return false; } - public boolean allTablesAreSelectable() { return true; } - public boolean dataDefinitionCausesTransactionCommit() { return false; } - public boolean dataDefinitionIgnoredInTransactions() { return false; } - public boolean doesMaxRowSizeIncludeBlobs() { return false; } - public boolean deletesAreDetected(int type) { return false; } - public boolean insertsAreDetected(int type) { return false; } - public boolean isCatalogAtStart() { return true; } - public boolean locatorsUpdateCopy() { return false; } - public boolean nullPlusNonNullIsNull() { return true; } - public boolean nullsAreSortedAtEnd() { return !nullsAreSortedAtStart(); } - public boolean nullsAreSortedAtStart() { return true; } - public boolean nullsAreSortedHigh() { return true; } - public boolean nullsAreSortedLow() { return !nullsAreSortedHigh(); } - public boolean othersDeletesAreVisible(int type) { return false; } - public boolean othersInsertsAreVisible(int type) { return false; } - public boolean othersUpdatesAreVisible(int type) { return false; } - public boolean ownDeletesAreVisible(int type) { return false; } - public boolean ownInsertsAreVisible(int type) { return false; } - public boolean ownUpdatesAreVisible(int type) { return false; } - public boolean storesLowerCaseIdentifiers() { return false; } - public boolean storesLowerCaseQuotedIdentifiers() { return false; } - public boolean storesMixedCaseIdentifiers() { return true; } - public boolean storesMixedCaseQuotedIdentifiers() { return false; } - public boolean storesUpperCaseIdentifiers() { return false; } - public boolean storesUpperCaseQuotedIdentifiers() { return false; } - public boolean supportsAlterTableWithAddColumn() { return false; } - public boolean supportsAlterTableWithDropColumn() { return false; } - public boolean supportsANSI92EntryLevelSQL() { return false; } - public boolean supportsANSI92FullSQL() { return false; } - public boolean supportsANSI92IntermediateSQL() { return false; } - public boolean supportsBatchUpdates() { return true; } - public boolean supportsCatalogsInDataManipulation() { return false; } - public boolean supportsCatalogsInIndexDefinitions() { return false; } - public boolean supportsCatalogsInPrivilegeDefinitions() { return false; } - public boolean supportsCatalogsInProcedureCalls() { return false; } - public boolean supportsCatalogsInTableDefinitions() { return false; } - public boolean supportsColumnAliasing() { return true; } - public boolean supportsConvert() { return false; } - public boolean supportsConvert(int fromType, int toType) { return false; } - public boolean supportsCorrelatedSubqueries() { return false; } - public boolean supportsDataDefinitionAndDataManipulationTransactions() - { return true; } - public boolean supportsDataManipulationTransactionsOnly() { return false; } - public boolean supportsDifferentTableCorrelationNames() { return false; } - public boolean supportsExpressionsInOrderBy() { return true; } - public boolean supportsMinimumSQLGrammar() { return true; } - public boolean supportsCoreSQLGrammar() { return true; } - public boolean supportsExtendedSQLGrammar() { return false; } - public boolean supportsLimitedOuterJoins() { return true; } - public boolean supportsFullOuterJoins() { return false; } - public boolean supportsGetGeneratedKeys() { return false; } - public boolean supportsGroupBy() { return true; } - public boolean supportsGroupByBeyondSelect() { return false; } - public boolean supportsGroupByUnrelated() { return false; } - public boolean supportsIntegrityEnhancementFacility() { return false; } - public boolean supportsLikeEscapeClause() { return false; } - public boolean supportsMixedCaseIdentifiers() { return true; } - public boolean supportsMixedCaseQuotedIdentifiers() { return false; } - public boolean supportsMultipleOpenResults() { return false; } - public boolean supportsMultipleResultSets() { return false; } - public boolean supportsMultipleTransactions() { return true; } - public boolean supportsNamedParameters() { return true; } - public boolean supportsNonNullableColumns() { return true; } - public boolean supportsOpenCursorsAcrossCommit() { return false; } - public boolean supportsOpenCursorsAcrossRollback() { return false; } - public boolean supportsOpenStatementsAcrossCommit() { return false; } - public boolean supportsOpenStatementsAcrossRollback() { return false; } - public boolean supportsOrderByUnrelated() { return false; } - public boolean supportsOuterJoins() { return true; } - public boolean supportsPositionedDelete() { return false; } - public boolean supportsPositionedUpdate() { return false; } - public boolean supportsResultSetConcurrency(int t, int c) - { return t == ResultSet.TYPE_FORWARD_ONLY - && c == ResultSet.CONCUR_READ_ONLY; } - public boolean supportsResultSetHoldability(int h) - { return h == ResultSet.CLOSE_CURSORS_AT_COMMIT; } - public boolean supportsResultSetType(int t) - { return t == ResultSet.TYPE_FORWARD_ONLY; } - public boolean supportsSavepoints() { return false; } - public boolean supportsSchemasInDataManipulation() { return false; } - public boolean supportsSchemasInIndexDefinitions() { return false; } - public boolean supportsSchemasInPrivilegeDefinitions() { return false; } - public boolean supportsSchemasInProcedureCalls() { return false; } - public boolean supportsSchemasInTableDefinitions() { return false; } - public boolean supportsSelectForUpdate() { return false; } - public boolean supportsStatementPooling() { return false; } - public boolean supportsStoredProcedures() { return false; } - public boolean supportsSubqueriesInComparisons() { return false; } - public boolean supportsSubqueriesInExists() { return true; } // TODO: check - public boolean supportsSubqueriesInIns() { return true; } // TODO: check - public boolean supportsSubqueriesInQuantifieds() { return false; } - public boolean supportsTableCorrelationNames() { return false; } - public boolean supportsTransactionIsolationLevel(int level) - { return level == Connection.TRANSACTION_SERIALIZABLE; } - public boolean supportsTransactions() { return true; } - public boolean supportsUnion() { return true; } - public boolean supportsUnionAll() { return true; } - public boolean updatesAreDetected(int type) { return false; } - public boolean usesLocalFilePerTable() { return false; } - public boolean usesLocalFiles() { return true; } - public boolean isReadOnly() throws SQLException - { return conn.isReadOnly(); } - - public ResultSet getAttributes(String c, String s, String t, String a) - throws SQLException { - if (getAttributes == null) getAttributes = conn.prepareStatement( - "select " - + "null as TYPE_CAT, " - + "null as TYPE_SCHEM, " - + "null as TYPE_NAME, " - + "null as ATTR_NAME, " - + "null as DATA_TYPE, " - + "null as ATTR_TYPE_NAME, " - + "null as ATTR_SIZE, " - + "null as DECIMAL_DIGITS, " - + "null as NUM_PREC_RADIX, " - + "null as NULLABLE, " - + "null as REMARKS, " - + "null as ATTR_DEF, " - + "null as SQL_DATA_TYPE, " - + "null as SQL_DATETIME_SUB, " - + "null as CHAR_OCTET_LENGTH, " - + "null as ORDINAL_POSITION, " - + "null as IS_NULLABLE, " - + "null as SCOPE_CATALOG, " - + "null as SCOPE_SCHEMA, " - + "null as SCOPE_TABLE, " - + "null as SOURCE_DATA_TYPE limit 0;"); - return getAttributes.executeQuery(); - } - - public ResultSet getBestRowIdentifier(String c, String s, String t, - int scope, boolean n) throws SQLException { - if (getBestRowIdentifier == null) - getBestRowIdentifier = conn.prepareStatement( - "select " - + "null as SCOPE, " - + "null as COLUMN_NAME, " - + "null as DATA_TYPE, " - + "null as TYPE_NAME, " - + "null as COLUMN_SIZE, " - + "null as BUFFER_LENGTH, " - + "null as DECIMAL_DIGITS, " - + "null as PSEUDO_COLUMN limit 0;"); - return getBestRowIdentifier.executeQuery(); - } - - public ResultSet getColumnPrivileges(String c, String s, String t, - String colPat) - throws SQLException { - if (getColumnPrivileges == null) - getColumnPrivileges = conn.prepareStatement( - "select " - + "null as TABLE_CAT, " - + "null as TABLE_SCHEM, " - + "null as TABLE_NAME, " - + "null as COLUMN_NAME, " - + "null as GRANTOR, " - + "null as GRANTEE, " - + "null as PRIVILEGE, " - + "null as IS_GRANTABLE limit 0;"); - return getColumnPrivileges.executeQuery(); - } - - public ResultSet getColumns(String c, String s, String tbl, String colPat) - throws SQLException { - Statement stat = conn.createStatement(); - ResultSet rs; - String sql; - - checkOpen(); - - if (getColumnsTblName == null) - getColumnsTblName = conn.prepareStatement( - "select tbl_name from sqlite_master where tbl_name like ?;"); - - // determine exact table name - getColumnsTblName.setString(1, tbl); - rs = getColumnsTblName.executeQuery(); - if (!rs.next()) - return rs; - tbl = rs.getString(1); - rs.close(); - - sql = "select " - + "null as TABLE_CAT, " - + "null as TABLE_SCHEM, " - + "'" + escape(tbl) + "' as TABLE_NAME, " - + "cn as COLUMN_NAME, " - + "ct as DATA_TYPE, " - + "tn as TYPE_NAME, " - + "2000000000 as COLUMN_SIZE, " - + "2000000000 as BUFFER_LENGTH, " - + "10 as DECIMAL_DIGITS, " - + "10 as NUM_PREC_RADIX, " - + "colnullable as NULLABLE, " - + "null as REMARKS, " - + "null as COLUMN_DEF, " - + "0 as SQL_DATA_TYPE, " - + "0 as SQL_DATETIME_SUB, " - + "2000000000 as CHAR_OCTET_LENGTH, " - + "ordpos as ORDINAL_POSITION, " - + "(case colnullable when 0 then 'N' when 1 then 'Y' else '' end)" - + " as IS_NULLABLE, " - + "null as SCOPE_CATLOG, " - + "null as SCOPE_SCHEMA, " - + "null as SCOPE_TABLE, " - + "null as SOURCE_DATA_TYPE from ("; - - // the command "pragma table_info('tablename')" does not embed - // like a normal select statement so we must extract the information - // and then build a resultset from unioned select statements - rs = stat.executeQuery("pragma table_info ('"+escape(tbl)+"');"); - - boolean colFound = false; - for (int i=0; rs.next(); i++) { - String colName = rs.getString(2); - String colType = rs.getString(3); - String colNotNull = rs.getString(4); - - int colNullable = 2; - if (colNotNull != null) colNullable = colNotNull.equals("0") ? 1:0; - if (colFound) sql += " union all "; - colFound = true; - - colType = colType == null ? "TEXT" : colType.toUpperCase(); - int colJavaType = -1; - if (colType == "INT" || colType == "INTEGER") - colJavaType = Types.INTEGER; - else if (colType == "TEXT") - colJavaType = Types.VARCHAR; - else if (colType == "FLOAT") - colJavaType = Types.FLOAT; - else - colJavaType = Types.VARCHAR; - - sql += "select " - + i + " as ordpos, " - + colNullable + " as colnullable, '" - + colJavaType + "' as ct, '" - + escape(colName) + "' as cn, '" - + escape(colType) + "' as tn"; - - if (colPat != null) - sql += " where upper(cn) like upper('" + escape(colPat) + "')"; - } - sql += colFound ? ");" : - "select null as ordpos, null as colnullable, " - + "null as cn, null as tn) limit 0;"; - rs.close(); - - return stat.executeQuery(sql); - } - - public ResultSet getCrossReference(String pc, String ps, String pt, - String fc, String fs, String ft) - throws SQLException { - if (getCrossReference == null) - getCrossReference = conn.prepareStatement("select " - + "null as PKTABLE_CAT, " - + "null as PKTABLE_SCHEM, " - + "null as PKTABLE_NAME, " - + "null as PKCOLUMN_NAME, " - + "null as FKTABLE_CAT, " - + "null as FKTABLE_SCHEM, " - + "null as FKTABLE_NAME, " - + "null as FKCOLUMN_NAME, " - + "null as KEY_SEQ, " - + "null as UPDATE_RULE, " - + "null as DELETE_RULE, " - + "null as FK_NAME, " - + "null as PK_NAME, " - + "null as DEFERRABILITY " - + "limit 0;"); - getCrossReference.clearParameters(); - return getCrossReference.executeQuery(); - } - - public ResultSet getSchemas() throws SQLException { - if (getSchemas == null) getSchemas = conn.prepareStatement("select " - + "null as TABLE_SCHEM, " - + "null as TABLE_CATALOG " - + "limit 0;"); - getSchemas.clearParameters(); - return getSchemas.executeQuery(); - } - - public ResultSet getCatalogs() throws SQLException { - if (getCatalogs == null) getCatalogs = conn.prepareStatement( - "select null as TABLE_CAT limit 0;"); - getCatalogs.clearParameters(); - return getCatalogs.executeQuery(); - } - - public ResultSet getPrimaryKeys(String c, String s, String table) - throws SQLException { - String sql; - ResultSet rs; - Statement stat = conn.createStatement(); - - rs = stat.executeQuery("pragma table_info('"+escape(table)+"');"); - - sql = "select " - + "null as TABLE_CAT, " - + "null as TABLE_SCHEM, " - + "'" + escape(table) + "' as TABLE_NAME, " - + "cn as COLUMN_NAME, " - + "0 as KEY_SEQ, " - + "null as PK_NAME from ("; - - int i; - for (i=0; rs.next(); i++) { - String colName = rs.getString(2); - - if (!rs.getBoolean(6)) { i--; continue; } - if (i > 0) sql += " union all "; - - sql += "select '" + escape(colName) + "' as cn"; - } - sql += i == 0 ? "select null as cn) limit 0;" : ");"; - rs.close(); - - return stat.executeQuery(sql); - } - - public ResultSet getExportedKeys(String c, String s, String t) - throws SQLException { - if (getExportedKeys == null) getExportedKeys = conn.prepareStatement( - "select " - + "null as PKTABLE_CAT, " - + "null as PKTABLE_SCHEM, " - + "null as PKTABLE_NAME, " - + "null as PKCOLUMN_NAME, " - + "null as FKTABLE_CAT, " - + "null as FKTABLE_SCHEM, " - + "null as FKTABLE_NAME, " - + "null as FKCOLUMN_NAME, " - + "null as KEY_SEQ, " - + "null as UPDATE_RULE, " - + "null as DELETE_RULE, " - + "null as FK_NAME, " - + "null as PK_NAME, " - + "null as DEFERRABILITY limit 0;"); - return getExportedKeys.executeQuery(); - } - - public ResultSet getImportedKeys(String c, String s, String t) - throws SQLException { throw new SQLException("not yet implemented"); } - public ResultSet getIndexInfo(String c, String s, String t, - boolean u, boolean approximate) - throws SQLException { throw new SQLException("not yet implemented"); } - public ResultSet getProcedureColumns(String c, String s, String p, - String colPat) - throws SQLException { - if (getProcedures == null) getProcedureColumns = conn.prepareStatement( - "select " - + "null as PROCEDURE_CAT, " - + "null as PROCEDURE_SCHEM, " - + "null as PROCEDURE_NAME, " - + "null as COLUMN_NAME, " - + "null as COLUMN_TYPE, " - + "null as DATA_TYPE, " - + "null as TYPE_NAME, " - + "null as PRECISION, " - + "null as LENGTH, " - + "null as SCALE, " - + "null as RADIX, " - + "null as NULLABLE, " - + "null as REMARKS limit 0;"); - return getProcedureColumns.executeQuery(); - - } - - public ResultSet getProcedures(String c, String s, String p) - throws SQLException { - if (getProcedures == null) getProcedures = conn.prepareStatement( - "select " - + "null as PROCEDURE_CAT, " - + "null as PROCEDURE_SCHEM, " - + "null as PROCEDURE_NAME, " - + "null as UNDEF1, " - + "null as UNDEF2, " - + "null as UNDEF3, " - + "null as REMARKS, " - + "null as PROCEDURE_TYPE limit 0;"); - return getProcedures.executeQuery(); - } - - public ResultSet getSuperTables(String c, String s, String t) - throws SQLException { - if (getSuperTables == null) getSuperTables = conn.prepareStatement( - "select " - + "null as TABLE_CAT, " - + "null as TABLE_SCHEM, " - + "null as TABLE_NAME, " - + "null as SUPERTABLE_NAME limit 0;"); - return getSuperTables.executeQuery(); - } - - public ResultSet getSuperTypes(String c, String s, String t) - throws SQLException { - if (getSuperTypes == null) getSuperTypes = conn.prepareStatement( - "select " - + "null as TYPE_CAT, " - + "null as TYPE_SCHEM, " - + "null as TYPE_NAME, " - + "null as SUPERTYPE_CAT, " - + "null as SUPERTYPE_SCHEM, " - + "null as SUPERTYPE_NAME limit 0;"); - return getSuperTypes.executeQuery(); - } - - public ResultSet getTablePrivileges(String c, String s, String t) - throws SQLException { - if (getTablePrivileges == null) - getTablePrivileges = conn.prepareStatement( - "select " - + "null as TABLE_CAT, " - + "null as TABLE_SCHEM, " - + "null as TABLE_NAME, " - + "null as GRANTOR, " - + "null as GRANTEE, " - + "null as PRIVILEGE, " - + "null as IS_GRANTABLE limit 0;"); - return getTablePrivileges.executeQuery(); - } - - public synchronized ResultSet getTables(String c, String s, - String t, String[] types) throws SQLException { - checkOpen(); - - t = (t == null || "".equals(t)) ? "%" : t.toUpperCase(); - - String sql = "select" - + " null as TABLE_CAT," - + " null as TABLE_SCHEM," - + " upper(name) as TABLE_NAME," - + " upper(type) as TABLE_TYPE," - + " null as REMARKS," - + " null as TYPE_CAT," - + " null as TYPE_SCHEM," - + " null as TYPE_NAME," - + " null as SELF_REFERENCING_COL_NAME," - + " null as REF_GENERATION" - + " from (select name, type from sqlite_master union all" - + " select name, type from sqlite_temp_master)" - + " where TABLE_NAME like '" + escape(t) + "'"; - - if (types != null) { - sql += " and TABLE_TYPE in ("; - for (int i=0; i < types.length; i++) { - if (i > 0) sql += ", "; - sql += "'" + types[i].toUpperCase() + "'"; - } - sql += ")"; - } - - sql += ";"; - - return conn.createStatement().executeQuery(sql); - } - - public ResultSet getTableTypes() throws SQLException { - checkOpen(); - if (getTableTypes == null) getTableTypes = conn.prepareStatement( - "select 'TABLE' as TABLE_TYPE" - + " union select 'VIEW' as TABLE_TYPE;"); - getTableTypes.clearParameters(); - return getTableTypes.executeQuery(); - } - - public ResultSet getTypeInfo() throws SQLException { - if (getTypeInfo == null) { - getTypeInfo = conn.prepareStatement( - "select " - + "tn as TYPE_NAME, " - + "dt as DATA_TYPE, " - + "0 as PRECISION, " - + "null as LITERAL_PREFIX, " - + "null as LITERAL_SUFFIX, " - + "null as CREATE_PARAMS, " - + typeNullable + " as NULLABLE, " - + "1 as CASE_SENSITIVE, " - + typeSearchable + " as SEARCHABLE, " - + "0 as UNSIGNED_ATTRIBUTE, " - + "0 as FIXED_PREC_SCALE, " - + "0 as AUTO_INCREMENT, " - + "null as LOCAL_TYPE_NAME, " - + "0 as MINIMUM_SCALE, " - + "0 as MAXIMUM_SCALE, " - + "0 as SQL_DATA_TYPE, " - + "0 as SQL_DATETIME_SUB, " - + "10 as NUM_PREC_RADIX from (" - + " select 'BLOB' as tn, " + Types.BLOB + " as dt union" - + " select 'NULL' as tn, " + Types.NULL + " as dt union" - + " select 'REAL' as tn, " + Types.REAL+ " as dt union" - + " select 'TEXT' as tn, " + Types.VARCHAR + " as dt union" - + " select 'INTEGER' as tn, "+ Types.INTEGER +" as dt" - + ") order by TYPE_NAME;" - ); - } - - getTypeInfo.clearParameters(); - return getTypeInfo.executeQuery(); - } - - public ResultSet getUDTs(String c, String s, String t, int[] types) - throws SQLException { - if (getUDTs == null) getUDTs = conn.prepareStatement("select " - + "null as TYPE_CAT, " - + "null as TYPE_SCHEM, " - + "null as TYPE_NAME, " - + "null as CLASS_NAME, " - + "null as DATA_TYPE, " - + "null as REMARKS, " - + "null as BASE_TYPE " - + "limit 0;"); - - getUDTs.clearParameters(); - return getUDTs.executeQuery(); - } - public ResultSet getVersionColumns(String c, String s, String t) - throws SQLException { - if (getVersionColumns == null) - getVersionColumns = conn.prepareStatement( - "select " - + "null as SCOPE, " - + "null as COLUMN_NAME, " - + "null as DATA_TYPE, " - + "null as TYPE_NAME, " - + "null as COLUMN_SIZE, " - + "null as BUFFER_LENGTH, " - + "null as DECIMAL_DIGITS, " - + "null as PSEUDO_COLUMN limit 0;"); - return getVersionColumns.executeQuery(); - } - - ResultSet getGeneratedKeys() throws SQLException { - if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement( - "select last_insert_rowid();"); - return getGeneratedKeys.executeQuery(); - } - - /** Replace all instances of ' with '' */ - private String escape(final String val) { - // TODO: this function is ugly, pass this work off to SQLite, then we - // don't have to worry about Unicode 4, other characters needing - // escaping, etc. - int len = val.length(); - StringBuffer buf = new StringBuffer(len); - for (int i=0; i < len; i++) { - if (val.charAt(i) == '\'') buf.append('\''); - buf.append(val.charAt(i)); - } - return buf.toString(); - } - - public Struct createStruct(String t, Object[] attr) throws SQLException { - throw new SQLException("Not yet implemented by SQLite JDBC driver"); } - public ResultSet getFunctionColumns(String a, String b, String c, - String d) throws SQLException { - throw new SQLException("Not yet implemented by SQLite JDBC driver"); } -} diff --git a/sqlitejdbc/src/org/sqlite/NativeDB.c b/sqlitejdbc/src/org/sqlite/NativeDB.c deleted file mode 100644 index e394be1..0000000 --- a/sqlitejdbc/src/org/sqlite/NativeDB.c +++ /dev/null @@ -1,774 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include "NativeDB.h" -#include "sqlite3.h" - -static jclass dbclass = 0; -static jclass fclass = 0; -static jclass aclass = 0; - -static void * toref(jlong value) -{ - jvalue ret; - ret.j = value; - return (void *) ret.l; -} - -static jlong fromref(void * value) -{ - jvalue ret; - ret.l = value; - return ret.j; -} - -static void throwex(JNIEnv *env, jobject this) -{ - static jmethodID mth_throwex = 0; - - if (!mth_throwex) - mth_throwex = (*env)->GetMethodID(env, dbclass, "throwex", "()V"); - - (*env)->CallVoidMethod(env, this, mth_throwex); -} - -static void throwexmsg(JNIEnv *env, const char *str) -{ - static jmethodID mth_throwexmsg = 0; - - if (!mth_throwexmsg) mth_throwexmsg = (*env)->GetStaticMethodID( - env, dbclass, "throwex", "(Ljava/lang/String;)V"); - - (*env)->CallStaticVoidMethod(env, dbclass, mth_throwexmsg, - (*env)->NewStringUTF(env, str)); -} - -static sqlite3 * gethandle(JNIEnv *env, jobject this) -{ - static jfieldID pointer = 0; - if (!pointer) pointer = (*env)->GetFieldID(env, dbclass, "pointer", "J"); - - return (sqlite3 *)toref((*env)->GetLongField(env, this, pointer)); -} - -static void sethandle(JNIEnv *env, jobject this, sqlite3 * ref) -{ - static jfieldID pointer = 0; - if (!pointer) pointer = (*env)->GetFieldID(env, dbclass, "pointer", "J"); - - (*env)->SetLongField(env, this, pointer, fromref(ref)); -} - -/* Returns number of 16-bit blocks in UTF-16 string, not including null. */ -static jsize jstrlen(const jchar *str) -{ - const jchar *s; - for (s = str; *s; s++); - return (jsize)(s - str); -} - - -// User Defined Function SUPPORT //////////////////////////////////// - -struct UDFData { - JavaVM *vm; - jobject func; - struct UDFData *next; // linked list of all UDFData instances -}; - -/* Returns the sqlite3_value for the given arg of the given function. - * If 0 is returned, an exception has been thrown to report the reason. */ -static sqlite3_value * tovalue(JNIEnv *env, jobject function, jint arg) -{ - jlong value_pntr = 0; - jint numArgs = 0; - static jfieldID func_value = 0, - func_args = 0; - - if (!func_value || !func_args) { - func_value = (*env)->GetFieldID(env, fclass, "value", "J"); - func_args = (*env)->GetFieldID(env, fclass, "args", "I"); - } - - // check we have any business being here - if (arg < 0) { throwexmsg(env, "negative arg out of range"); return 0; } - if (!function) { throwexmsg(env, "inconstent function"); return 0; } - - value_pntr = (*env)->GetLongField(env, function, func_value); - numArgs = (*env)->GetIntField(env, function, func_args); - - if (value_pntr == 0) { throwexmsg(env, "no current value"); return 0; } - if (arg >= numArgs) { throwexmsg(env, "arg out of range"); return 0; } - - return ((sqlite3_value**)toref(value_pntr))[arg]; -} - -/* called if an exception occured processing xFunc */ -static void xFunc_error(sqlite3_context *context, JNIEnv *env) -{ - const char *strmsg = 0; - jstring msg = 0; - jint msgsize = 0; - - jclass exclass = 0; - static jmethodID exp_msg = 0; - jthrowable ex = (*env)->ExceptionOccurred(env); - - (*env)->ExceptionClear(env); - - if (!exp_msg) { - exclass = (*env)->FindClass(env, "java/lang/Throwable"); - exp_msg = (*env)->GetMethodID( - env, exclass, "toString", "()Ljava/lang/String;"); - } - - msg = (jstring)(*env)->CallObjectMethod(env, ex, exp_msg); - if (!msg) { sqlite3_result_error(context, "unknown error", 13); return; } - - msgsize = (*env)->GetStringUTFLength(env, msg); - strmsg = (*env)->GetStringUTFChars(env, msg, 0); - assert(strmsg); // out-of-memory - - sqlite3_result_error(context, strmsg, msgsize); - - (*env)->ReleaseStringUTFChars(env, msg, strmsg); -} - -/* used to call xFunc, xStep and xFinal */ -static xCall( - sqlite3_context *context, - int args, - sqlite3_value** value, - jobject func, - jmethodID method) -{ - static jfieldID fld_context = 0, - fld_value = 0, - fld_args = 0; - JNIEnv *env = 0; - struct UDFData *udf = 0; - - udf = (struct UDFData*)sqlite3_user_data(context); - assert(udf); - (*udf->vm)->AttachCurrentThread(udf->vm, (void **)&env, 0); - if (!func) func = udf->func; - - if (!fld_context || !fld_value || !fld_args) { - fld_context = (*env)->GetFieldID(env, fclass, "context", "J"); - fld_value = (*env)->GetFieldID(env, fclass, "value", "J"); - fld_args = (*env)->GetFieldID(env, fclass, "args", "I"); - } - - (*env)->SetLongField(env, func, fld_context, fromref(context)); - (*env)->SetLongField(env, func, fld_value, value ? fromref(value) : 0); - (*env)->SetIntField(env, func, fld_args, args); - - (*env)->CallVoidMethod(env, func, method); - - (*env)->SetLongField(env, func, fld_context, 0); - (*env)->SetLongField(env, func, fld_value, 0); - (*env)->SetIntField(env, func, fld_args, 0); - - // check if xFunc threw an Exception - if ((*env)->ExceptionCheck(env)) xFunc_error(context, env); -} - - -void xFunc(sqlite3_context *context, int args, sqlite3_value** value) -{ - static jmethodID mth = 0; - if (!mth) { - JNIEnv *env; - struct UDFData *udf = (struct UDFData*)sqlite3_user_data(context); - (*udf->vm)->AttachCurrentThread(udf->vm, (void **)&env, 0); - mth = (*env)->GetMethodID(env, fclass, "xFunc", "()V"); - } - xCall(context, args, value, 0, mth); -} - -void xStep(sqlite3_context *context, int args, sqlite3_value** value) -{ - JNIEnv *env; - struct UDFData *udf; - jobject *func = 0; - static jmethodID mth = 0; - static jmethodID clone = 0; - - if (!mth || !clone) { - udf = (struct UDFData*)sqlite3_user_data(context); - (*udf->vm)->AttachCurrentThread(udf->vm, (void **)&env, 0); - - mth = (*env)->GetMethodID(env, aclass, "xStep", "()V"); - clone = (*env)->GetMethodID(env, aclass, "clone", - "()Ljava/lang/Object;"); - } - - // clone the Function.Aggregate instance and store a pointer - // in SQLite's aggregate_context (clean up in xFinal) - func = sqlite3_aggregate_context(context, sizeof(jobject)); - if (!*func) { - udf = (struct UDFData*)sqlite3_user_data(context); - (*udf->vm)->AttachCurrentThread(udf->vm, (void **)&env, 0); - - *func = (*env)->CallObjectMethod(env, udf->func, clone); - *func = (*env)->NewGlobalRef(env, *func); - } - - xCall(context, args, value, *func, mth); -} - -void xFinal(sqlite3_context *context) -{ - JNIEnv *env = 0; - struct UDFData *udf = 0; - jobject *func = 0; - static jmethodID mth = 0; - - udf = (struct UDFData*)sqlite3_user_data(context); - (*udf->vm)->AttachCurrentThread(udf->vm, (void **)&env, 0); - - if (!mth) mth = (*env)->GetMethodID(env, aclass, "xFinal", "()V"); - - func = sqlite3_aggregate_context(context, sizeof(jobject)); - assert(*func); // disaster - - xCall(context, 0, 0, *func, mth); - - // clean up Function.Aggregate instance - (*env)->DeleteGlobalRef(env, *func); -} - - -// INITIALISATION /////////////////////////////////////////////////// - -JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) -{ - JNIEnv* env = 0; - - if (JNI_OK != (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_2)) - return JNI_ERR; - - dbclass = (*env)->FindClass(env, "org/sqlite/NativeDB"); - if (!dbclass) return JNI_ERR; - dbclass = (*env)->NewGlobalRef(env, dbclass); - - fclass = (*env)->FindClass(env, "org/sqlite/Function"); - if (!fclass) return JNI_ERR; - fclass = (*env)->NewGlobalRef(env, fclass); - - aclass = (*env)->FindClass(env, "org/sqlite/Function$Aggregate"); - if (!aclass) return JNI_ERR; - aclass = (*env)->NewGlobalRef(env, aclass); - - return JNI_VERSION_1_2; -} - - -// WRAPPERS for sqlite_* functions ////////////////////////////////// - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB__1open( - JNIEnv *env, jobject this, jstring file) -{ - int ret; - sqlite3 *db = gethandle(env, this); - const char *str; - - if (db) { - throwexmsg(env, "DB already open"); - sqlite3_close(db); - return; - } - - str = (*env)->GetStringUTFChars(env, file, 0); - if (sqlite3_open(str, &db)) { - throwex(env, this); - sqlite3_close(db); - return; - } - (*env)->ReleaseStringUTFChars(env, file, str); - - sethandle(env, this, db); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB__1close( - JNIEnv *env, jobject this) -{ - if (sqlite3_close(gethandle(env, this)) != SQLITE_OK) - throwex(env, this); - sethandle(env, this, 0); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_interrupt(JNIEnv *env, jobject this) -{ - sqlite3_interrupt(gethandle(env, this)); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_busy_1timeout( - JNIEnv *env, jobject this, jint ms) -{ - sqlite3_busy_timeout(gethandle(env, this), ms); -} - -JNIEXPORT jlong JNICALL Java_org_sqlite_NativeDB_prepare( - JNIEnv *env, jobject this, jstring sql) -{ - sqlite3* db = gethandle(env, this); - sqlite3_stmt* stmt; - - const char *strsql = (*env)->GetStringUTFChars(env, sql, 0); - int status = sqlite3_prepare_v2(db, strsql, -1, &stmt, 0); - (*env)->ReleaseStringUTFChars(env, sql, strsql); - - if (status != SQLITE_OK) { - throwex(env, this); - return fromref(0); - } - return fromref(stmt); -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_errmsg(JNIEnv *env, jobject this) -{ - return (*env)->NewStringUTF(env, sqlite3_errmsg(gethandle(env, this))); -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_libversion( - JNIEnv *env, jobject this) -{ - return (*env)->NewStringUTF(env, sqlite3_libversion()); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_changes( - JNIEnv *env, jobject this) -{ - return sqlite3_changes(gethandle(env, this)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_finalize( - JNIEnv *env, jobject this, jlong stmt) -{ - return sqlite3_finalize(toref(stmt)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_step( - JNIEnv *env, jobject this, jlong stmt) -{ - return sqlite3_step(toref(stmt)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_reset( - JNIEnv *env, jobject this, jlong stmt) -{ - return sqlite3_reset(toref(stmt)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_clear_1bindings( - JNIEnv *env, jobject this, jlong stmt) -{ - int i; - int count = sqlite3_bind_parameter_count(toref(stmt)); - jint rc = SQLITE_OK; - for(i=1; rc==SQLITE_OK && i <= count; i++) { - rc = sqlite3_bind_null(toref(stmt), i); - } - return rc; -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1parameter_1count( - JNIEnv *env, jobject this, jlong stmt) -{ - return sqlite3_bind_parameter_count(toref(stmt)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_column_1count( - JNIEnv *env, jobject this, jlong stmt) -{ - return sqlite3_column_count(toref(stmt)); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_column_1type( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - return sqlite3_column_type(toref(stmt), col); -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_column_1decltype( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - const char *str = sqlite3_column_decltype(toref(stmt), col); - return (*env)->NewStringUTF(env, str); -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_column_1table_1name( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - const void *str = sqlite3_column_table_name16(toref(stmt), col); - return str ? (*env)->NewString(env, str, jstrlen(str)) : NULL; -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_column_1name( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - const void *str = sqlite3_column_name16(toref(stmt), col); - return str ? (*env)->NewString(env, str, jstrlen(str)) : NULL; -} - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_column_1text( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - return (*env)->NewStringUTF( - env, (const char*)sqlite3_column_text(toref(stmt), col)); -} - -JNIEXPORT jbyteArray JNICALL Java_org_sqlite_NativeDB_column_1blob( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - jsize length; - jbyteArray jBlob; - jbyte *a; - const void *blob = sqlite3_column_blob(toref(stmt), col); - if (!blob) return NULL; - - length = sqlite3_column_bytes(toref(stmt), col); - jBlob = (*env)->NewByteArray(env, length); - assert(jBlob); // out-of-memory - - a = (*env)->GetPrimitiveArrayCritical(env, jBlob, 0); - memcpy(a, blob, length); - (*env)->ReleasePrimitiveArrayCritical(env, jBlob, a, 0); - - return jBlob; -} - -JNIEXPORT jdouble JNICALL Java_org_sqlite_NativeDB_column_1double( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - return sqlite3_column_double(toref(stmt), col); -} - -JNIEXPORT jlong JNICALL Java_org_sqlite_NativeDB_column_1long( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - return sqlite3_column_int64(toref(stmt), col); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_column_1int( - JNIEnv *env, jobject this, jlong stmt, jint col) -{ - return sqlite3_column_int(toref(stmt), col); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1null( - JNIEnv *env, jobject this, jlong stmt, jint pos) -{ - return sqlite3_bind_null(toref(stmt), pos); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1int( - JNIEnv *env, jobject this, jlong stmt, jint pos, jint v) -{ - return sqlite3_bind_int(toref(stmt), pos, v); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1long( - JNIEnv *env, jobject this, jlong stmt, jint pos, jlong v) -{ - return sqlite3_bind_int64(toref(stmt), pos, v); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1double( - JNIEnv *env, jobject this, jlong stmt, jint pos, jdouble v) -{ - return sqlite3_bind_double(toref(stmt), pos, v); -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1text( - JNIEnv *env, jobject this, jlong stmt, jint pos, jstring v) -{ - const char *chars = (*env)->GetStringUTFChars(env, v, 0); - int rc = sqlite3_bind_text(toref(stmt), pos, chars, -1, SQLITE_TRANSIENT); - (*env)->ReleaseStringUTFChars(env, v, chars); - return rc; -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_bind_1blob( - JNIEnv *env, jobject this, jlong stmt, jint pos, jbyteArray v) -{ - jint rc; - void *a; - jsize size = (*env)->GetArrayLength(env, v); - assert(a = (*env)->GetPrimitiveArrayCritical(env, v, 0)); - rc = sqlite3_bind_blob(toref(stmt), pos, a, size, SQLITE_TRANSIENT); - (*env)->ReleasePrimitiveArrayCritical(env, v, a, JNI_ABORT); - return rc; -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1null( - JNIEnv *env, jobject this, jlong context) -{ - sqlite3_result_null(toref(context)); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1text( - JNIEnv *env, jobject this, jlong context, jstring value) -{ - const jchar *str; - jsize size; - - if (value == NULL) { sqlite3_result_null(toref(context)); return; } - size = (*env)->GetStringLength(env, value) * 2; - - str = (*env)->GetStringCritical(env, value, 0); - assert(str); // out-of-memory - sqlite3_result_text16(toref(context), str, size, SQLITE_TRANSIENT); - (*env)->ReleaseStringCritical(env, value, str); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1blob( - JNIEnv *env, jobject this, jlong context, jobject value) -{ - jbyte *bytes; - jsize size; - - if (value == NULL) { sqlite3_result_null(toref(context)); return; } - size = (*env)->GetArrayLength(env, value); - - // be careful with *Critical - bytes = (*env)->GetPrimitiveArrayCritical(env, value, 0); - assert(bytes); // out-of-memory - sqlite3_result_blob(toref(context), bytes, size, SQLITE_TRANSIENT); - (*env)->ReleasePrimitiveArrayCritical(env, value, bytes, JNI_ABORT); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1double( - JNIEnv *env, jobject this, jlong context, jdouble value) -{ - sqlite3_result_double(toref(context), value); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1long( - JNIEnv *env, jobject this, jlong context, jlong value) -{ - sqlite3_result_int64(toref(context), value); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_result_1int( - JNIEnv *env, jobject this, jlong context, jint value) -{ - sqlite3_result_int(toref(context), value); -} - - - - -JNIEXPORT jstring JNICALL Java_org_sqlite_NativeDB_value_1text( - JNIEnv *env, jobject this, jobject f, jint arg) -{ - jint length = 0; - const void *str = 0; - sqlite3_value *value = tovalue(env, f, arg); - if (!value) return NULL; - - length = sqlite3_value_bytes16(value) / 2; // in jchars - str = sqlite3_value_text16(value); - return str ? (*env)->NewString(env, str, length) : NULL; -} - -JNIEXPORT jbyteArray JNICALL Java_org_sqlite_NativeDB_value_1blob( - JNIEnv *env, jobject this, jobject f, jint arg) -{ - jsize length; - jbyteArray jBlob; - jbyte *a; - const void *blob; - sqlite3_value *value = tovalue(env, f, arg); - if (!value) return NULL; - - blob = sqlite3_value_blob(value); - if (!blob) return NULL; - - length = sqlite3_value_bytes(value); - jBlob = (*env)->NewByteArray(env, length); - assert(jBlob); // out-of-memory - - a = (*env)->GetPrimitiveArrayCritical(env, jBlob, 0); - memcpy(a, blob, length); - (*env)->ReleasePrimitiveArrayCritical(env, jBlob, a, 0); - - return jBlob; -} - -JNIEXPORT jdouble JNICALL Java_org_sqlite_NativeDB_value_1double( - JNIEnv *env, jobject this, jobject f, jint arg) -{ - sqlite3_value *value = tovalue(env, f, arg); - return value ? sqlite3_value_double(value) : 0; -} - -JNIEXPORT jlong JNICALL Java_org_sqlite_NativeDB_value_1long( - JNIEnv *env, jobject this, jobject f, jint arg) -{ - sqlite3_value *value = tovalue(env, f, arg); - return value ? sqlite3_value_int64(value) : 0; -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_value_1int( - JNIEnv *env, jobject this, jobject f, jint arg) -{ - sqlite3_value *value = tovalue(env, f, arg); - return value ? sqlite3_value_int(value) : 0; -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_value_1type( - JNIEnv *env, jobject this, jobject func, jint arg) -{ - return sqlite3_value_type(tovalue(env, func, arg)); -} - - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_create_1function( - JNIEnv *env, jobject this, jstring name, jobject func) -{ - jint ret = 0; - const char *strname = 0; - int isAgg = 0; - - static jfieldID udfdatalist = 0; - struct UDFData *udf = malloc(sizeof(struct UDFData)); - - assert(udf); // out-of-memory - - if (!udfdatalist) - udfdatalist = (*env)->GetFieldID(env, dbclass, "udfdatalist", "J"); - - isAgg = (*env)->IsInstanceOf(env, func, aclass); - udf->func = (*env)->NewGlobalRef(env, func); - (*env)->GetJavaVM(env, &udf->vm); - - // add new function def to linked list - udf->next = toref((*env)->GetLongField(env, this, udfdatalist)); - (*env)->SetLongField(env, this, udfdatalist, fromref(udf)); - - strname = (*env)->GetStringUTFChars(env, name, 0); - assert(strname); // out-of-memory - - ret = sqlite3_create_function( - gethandle(env, this), - strname, // function name - -1, // number of args - SQLITE_UTF16, // preferred chars - udf, - isAgg ? 0 :&xFunc, - isAgg ? &xStep : 0, - isAgg ? &xFinal : 0 - ); - - (*env)->ReleaseStringUTFChars(env, name, strname); - - return ret; -} - -JNIEXPORT jint JNICALL Java_org_sqlite_NativeDB_destroy_1function( - JNIEnv *env, jobject this, jstring name) -{ - const char* strname = (*env)->GetStringUTFChars(env, name, 0); - sqlite3_create_function( - gethandle(env, this), strname, -1, SQLITE_UTF16, 0, 0, 0, 0 - ); - (*env)->ReleaseStringUTFChars(env, name, strname); -} - -JNIEXPORT void JNICALL Java_org_sqlite_NativeDB_free_1functions( - JNIEnv *env, jobject this) -{ - // clean up all the malloc()ed UDFData instances using the - // linked list stored in DB.udfdatalist - jfieldID udfdatalist; - struct UDFData *udf, *udfpass; - - udfdatalist = (*env)->GetFieldID(env, dbclass, "udfdatalist", "J"); - udf = toref((*env)->GetLongField(env, this, udfdatalist)); - (*env)->SetLongField(env, this, udfdatalist, 0); - - while (udf) { - udfpass = udf->next; - (*env)->DeleteGlobalRef(env, udf->func); - free(udf); - udf = udfpass; - } -} - - -// COMPOUND FUNCTIONS /////////////////////////////////////////////// - -JNIEXPORT jobjectArray JNICALL Java_org_sqlite_NativeDB_column_1metadata( - JNIEnv *env, jobject this, jlong stmt) -{ - const char *zTableName, *zColumnName; - int pNotNull, pPrimaryKey, pAutoinc, i, colCount; - jobjectArray array; - jbooleanArray colData; - jboolean* colDataRaw; - sqlite3 *db; - sqlite3_stmt *dbstmt; - - db = gethandle(env, this); - dbstmt = toref(stmt); - - colCount = sqlite3_column_count(dbstmt); - array = (*env)->NewObjectArray( - env, colCount, (*env)->FindClass(env, "[Z"), NULL) ; - assert(array); // out-of-memory - - colDataRaw = (jboolean*)malloc(3 * sizeof(jboolean)); - assert(colDataRaw); // out-of-memory - - for (i = 0; i < colCount; i++) { - // load passed column name and table name - zColumnName = sqlite3_column_name(dbstmt, i); - zTableName = sqlite3_column_table_name(dbstmt, i); - - pNotNull = 0; - pPrimaryKey = 0; - pAutoinc = 0; - - // request metadata for column and load into output variables - if (zTableName && zColumnName) { - sqlite3_table_column_metadata( - db, 0, zTableName, zColumnName, - 0, 0, &pNotNull, &pPrimaryKey, &pAutoinc - ); - } - - // load relevant metadata into 2nd dimension of return results - colDataRaw[0] = pNotNull; - colDataRaw[1] = pPrimaryKey; - colDataRaw[2] = pAutoinc; - - colData = (*env)->NewBooleanArray(env, 3); - assert(colData); // out-of-memory - - (*env)->SetBooleanArrayRegion(env, colData, 0, 3, colDataRaw); - (*env)->SetObjectArrayElement(env, array, i, colData); - } - - free(colDataRaw); - - return array; -} - diff --git a/sqlitejdbc/src/org/sqlite/NativeDB.java b/sqlitejdbc/src/org/sqlite/NativeDB.java deleted file mode 100644 index eb7ea1b..0000000 --- a/sqlitejdbc/src/org/sqlite/NativeDB.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package org.sqlite; - -import java.io.File; -import java.sql.SQLException; - -/** This class provides a thin JNI layer over the SQLite3 C API. */ -final class NativeDB extends DB -{ - /** SQLite connection handle. */ - long pointer = 0; - - private static Boolean loaded = null; - - static boolean load() { - if (loaded != null) return loaded == Boolean.TRUE; - - String libpath = System.getProperty("org.sqlite.lib.path"); - String libname = System.getProperty("org.sqlite.lib.name"); - if (libname == null) libname = System.mapLibraryName("sqlitejdbc"); - - try { - if (libpath == null) System.loadLibrary("sqlitejdbc"); - else System.load(new File(libpath, libname).getAbsolutePath()); - } catch (UnsatisfiedLinkError e) { - loaded = Boolean.FALSE; - return false; - } - - loaded = Boolean.TRUE; - return true; - } - - - /** linked list of all instanced UDFDatas */ - private long udfdatalist = 0; - - - // WRAPPER FUNCTIONS //////////////////////////////////////////// - - protected native synchronized void _open(String file) throws SQLException; - protected native synchronized void _close() throws SQLException; - native synchronized void interrupt(); - native synchronized void busy_timeout(int ms); - //native synchronized void exec(String sql) throws SQLException; - protected native synchronized long prepare(String sql) throws SQLException; - native synchronized String errmsg(); - native synchronized String libversion(); - native synchronized int changes(); - - protected native synchronized int finalize(long stmt); - protected native synchronized int step(long stmt); - protected native synchronized int reset(long stmt); - native synchronized int clear_bindings(long stmt); - - native synchronized int bind_parameter_count(long stmt); - - native synchronized int column_count (long stmt); - native synchronized int column_type (long stmt, int col); - native synchronized String column_decltype (long stmt, int col); - native synchronized String column_table_name (long stmt, int col); - native synchronized String column_name (long stmt, int col); - native synchronized String column_text (long stmt, int col); - native synchronized byte[] column_blob (long stmt, int col); - native synchronized double column_double (long stmt, int col); - native synchronized long column_long (long stmt, int col); - native synchronized int column_int (long stmt, int col); - - native synchronized int bind_null (long stmt, int pos); - native synchronized int bind_int (long stmt, int pos, int v); - native synchronized int bind_long (long stmt, int pos, long v); - native synchronized int bind_double(long stmt, int pos, double v); - native synchronized int bind_text (long stmt, int pos, String v); - native synchronized int bind_blob (long stmt, int pos, byte[] v); - - native synchronized void result_null (long context); - native synchronized void result_text (long context, String val); - native synchronized void result_blob (long context, byte[] val); - native synchronized void result_double(long context, double val); - native synchronized void result_long (long context, long val); - native synchronized void result_int (long context, int val); - native synchronized void result_error (long context, String err); - - native synchronized int value_bytes (Function f, int arg); - native synchronized String value_text (Function f, int arg); - native synchronized byte[] value_blob (Function f, int arg); - native synchronized double value_double(Function f, int arg); - native synchronized long value_long (Function f, int arg); - native synchronized int value_int (Function f, int arg); - native synchronized int value_type (Function f, int arg); - - native synchronized int create_function(String name, Function func); - native synchronized int destroy_function(String name); - native synchronized void free_functions(); - - // COMPOUND FUNCTIONS (for optimisation) ///////////////////////// - - /** Provides metadata for the columns of a statement. Returns: - * res[col][0] = true if column constrained NOT NULL - * res[col][1] = true if column is part of the primary key - * res[col][2] = true if column is auto-increment - */ - native synchronized boolean[][] column_metadata(long stmt); - - static void throwex(String msg) throws SQLException { - throw new SQLException(msg); - } -} diff --git a/sqlitejdbc/src/org/sqlite/NestedDB.c b/sqlitejdbc/src/org/sqlite/NestedDB.c deleted file mode 100644 index bb8a4b8..0000000 --- a/sqlitejdbc/src/org/sqlite/NestedDB.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include "sqlite3.h" - -/* Provides access to metadata across NestedVM 7-argument limit on functions.*/ -struct metadata { - int pNotNull; - int pPrimaryKey; - int pAutoinc; -}; - -int column_metadata_helper( - sqlite3 *db, - sqlite3_stmt *stmt, - int col, - struct metadata *p -){ - const char *zTableName, *zColumnName; - int rc = 0; - - p->pNotNull = 0; - p->pPrimaryKey = 0; - p->pAutoinc = 0; - - zTableName = sqlite3_column_table_name(stmt, col); - zColumnName = sqlite3_column_name(stmt, col); - - if (zTableName && zColumnName) { - rc = sqlite3_table_column_metadata( - db, 0, zTableName, zColumnName, 0, 0, - &p->pNotNull, &p->pPrimaryKey, &p->pAutoinc - ); - } - - return rc; -} - - -extern int _call_java(int xType, int context, int args, int value); - -void xFunc_helper(sqlite3_context *context, int args, sqlite3_value** value) -{ - _call_java(1, (int)context, args, (int)value); -} - -void xStep_helper(sqlite3_context *context, int args, sqlite3_value** value) -{ - _call_java(2, (int)context, args, (int)value); -} - -void xFinal_helper(sqlite3_context *context) -{ - _call_java(3, (int)context, 0, 0); -} - -/* create function if pos is non-negative, aggregate if agg is true */ -int create_function_helper(sqlite3 *db, const char *name, int pos, int agg) -{ - return sqlite3_create_function(db, name, -1, SQLITE_ANY, (void*)pos, - pos>=0 && !agg ? &xFunc_helper : 0, - pos>=0 && agg ? &xStep_helper : 0, - pos>=0 && agg ? &xFinal_helper : 0); -} diff --git a/sqlitejdbc/src/org/sqlite/NestedDB.java b/sqlitejdbc/src/org/sqlite/NestedDB.java deleted file mode 100644 index a0d0314..0000000 --- a/sqlitejdbc/src/org/sqlite/NestedDB.java +++ /dev/null @@ -1,442 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import org.ibex.nestedvm.Runtime; - -import java.io.File; -import java.io.PrintWriter; -import java.sql.*; - -// FEATURE: strdup is wasteful, SQLite interface will take unterminated char* - -/** Communicates with the Java version of SQLite provided by NestedVM. */ -final class NestedDB extends DB implements Runtime.CallJavaCB -{ - /** database pointer */ - int handle = 0; - - /** sqlite binary embedded in nestedvm */ - private Runtime rt = null; - - /** user defined functions referenced by position (stored in used data) */ - private Function[] functions = null; - private String[] funcNames = null; - - - // WRAPPER FUNCTIONS //////////////////////////////////////////// - - protected synchronized void _open(String filename) throws SQLException { - if (handle != 0) throw new SQLException("DB already open"); - - // handle silly windows drive letter mapping - if (filename.length() > 2) { - char drive = Character.toLowerCase(filename.charAt(0)); - if (filename.charAt(1) == ':' && drive >= 'a' && drive <= 'z') { - - // convert to nestedvm's "/c:/file" format - filename = filename.substring(2); - filename = filename.replace('\\', '/'); - filename = "/" + drive + ":" + filename; - } - } - - // start the nestedvm runtime - try { - rt = (Runtime)Class.forName("org.sqlite.SQLite") - .newInstance(); - rt.start(); - } catch (Exception e) { - throw new CausedSQLException(e); - } - - // callback for user defined functions - rt.setCallJavaCB(this); - - // open the db and retrieve sqlite3_db* pointer - int passback = rt.xmalloc(4); - int str = rt.strdup(filename); - if (call("sqlite3_open", str, passback) != SQLITE_OK) - throwex(); - handle = deref(passback); - rt.free(str); - rt.free(passback); - } - - /* callback for Runtime.CallJavaCB above */ - public int call(int xType, int context, int args, int value) { - xUDF(xType, context, args, value); - return 0; - } - - protected synchronized void _close() throws SQLException { - if (handle == 0) return; - try { - if (call("sqlite3_close", handle) != SQLITE_OK) - throwex(); - } finally { - handle = 0; - rt.stop(); - rt = null; - } - } - - synchronized void interrupt() throws SQLException { - call("sqlite3_interrupt", handle); - } - synchronized void busy_timeout(int ms) throws SQLException { - call("sqlite3_busy_timeout", handle, ms); - } - protected synchronized long prepare(String sql) throws SQLException { - int passback = rt.xmalloc(4); - int str = rt.strdup(sql); - int ret = call("sqlite3_prepare_v2", handle, str, -1, passback, 0); - rt.free(str); - if (ret != SQLITE_OK) { - rt.free(passback); - throwex(); - } - int pointer = deref(passback); - rt.free(passback); - return pointer; - } - synchronized String errmsg() throws SQLException { - return cstring(call("sqlite3_errmsg", handle)); - } - synchronized String libversion() throws SQLException { - return cstring(call("sqlite3_libversion", handle)); - } - synchronized int changes() throws SQLException { - return call("sqlite3_changes", handle); } - - protected synchronized int finalize(long stmt) throws SQLException { - return call("sqlite3_finalize", (int)stmt); } - protected synchronized int step(long stmt) throws SQLException { - return call("sqlite3_step", (int)stmt); } - protected synchronized int reset(long stmt) throws SQLException { - return call("sqlite3_reset", (int)stmt); } - synchronized int clear_bindings(long stmt) throws SQLException { - return call("sqlite3_clear_bindings", (int)stmt); } - - synchronized int bind_parameter_count(long stmt) throws SQLException { - return call("sqlite3_bind_parameter_count", (int)stmt); } - - synchronized int column_count(long stmt) throws SQLException { - return call("sqlite3_column_count", (int)stmt); } - synchronized int column_type(long stmt, int col) throws SQLException { - return call("sqlite3_column_type", (int)stmt, col); } - synchronized String column_name(long stmt, int col) throws SQLException { - return utfstring(call("sqlite3_column_name", (int)stmt, col)); - } - synchronized String column_text(long stmt, int col) throws SQLException { - return utfstring(call("sqlite3_column_text", (int)stmt, col)); - } - synchronized byte[] column_blob(long stmt, int col) throws SQLException { - int addr = call("sqlite3_column_blob", (int)stmt, col); - if (addr == 0) return null; - byte[] blob = new byte[call("sqlite3_column_bytes", (int)stmt, col)]; - copyin(addr, blob, blob.length); - return blob; - } - synchronized double column_double(long stmt, int col) throws SQLException { - try { return Double.parseDouble(column_text(stmt, col)); } - catch (NumberFormatException e) { return Double.NaN; } // TODO - } - synchronized long column_long(long stmt, int col) throws SQLException { - try { return Long.parseLong(column_text(stmt, col)); } - catch (NumberFormatException e) { return 0; } // TODO - } - synchronized int column_int(long stmt, int col) throws SQLException { - return call("sqlite3_column_int", (int)stmt, col); } - synchronized String column_decltype(long stmt, int col) - throws SQLException { - return utfstring(call("sqlite3_column_decltype", (int)stmt, col)); - } - synchronized String column_table_name(long stmt, int col) - throws SQLException { - return utfstring(call("sqlite3_column_table_name", (int)stmt, col)); - } - - synchronized int bind_null(long stmt, int pos) throws SQLException { - return call("sqlite3_bind_null", (int)stmt, pos); - } - synchronized int bind_int(long stmt, int pos, int v) throws SQLException { - return call("sqlite3_bind_int", (int)stmt, pos, v); - } - synchronized int bind_long(long stmt, int pos, long v) throws SQLException { - return bind_text(stmt, pos, Long.toString(v)); // TODO - } - synchronized int bind_double(long stmt, int pos, double v) - throws SQLException { - return bind_text(stmt, pos, Double.toString(v)); // TODO - } - synchronized int bind_text(long stmt, int pos, String v) - throws SQLException { - if (v == null) return bind_null(stmt, pos); - return call("sqlite3_bind_text", (int)stmt, pos, rt.strdup(v), - -1, rt.lookupSymbol("free")); - } - synchronized int bind_blob(long stmt, int pos, byte[] buf) - throws SQLException { - if (buf == null || buf.length < 1) return bind_null(stmt, pos); - int len = buf.length; - int blob = rt.xmalloc(len); // free()ed by sqlite3_bind_blob - copyout(buf, blob, len); - return call("sqlite3_bind_blob", (int)stmt, pos, blob, len, - rt.lookupSymbol("free")); - } - - synchronized void result_null(long cxt) throws SQLException { - call("sqlite3_result_null", (int)cxt); } - synchronized void result_text(long cxt, String val) throws SQLException { - call("sqlite3_result_text", (int)cxt, rt.strdup(val), -1, - rt.lookupSymbol("free")); - } - synchronized void result_blob(long cxt, byte[] val) throws SQLException { - if (val == null || val.length == 0) { result_null(cxt); return; } - int blob = rt.xmalloc(val.length); - copyout(val, blob, val.length); - call("sqlite3_result_blob", (int)cxt, blob, - val.length, rt.lookupSymbol("free")); - } - synchronized void result_double(long cxt, double val) throws SQLException { - result_text(cxt, Double.toString(val)); } // TODO - synchronized void result_long(long cxt, long val) throws SQLException { - result_text(cxt, Long.toString(val)); } // TODO - synchronized void result_int(long cxt, int val) throws SQLException { - call("sqlite3_result_int", (int)cxt, val); } - synchronized void result_error(long cxt, String err) throws SQLException { - int str = rt.strdup(err); - call("sqlite3_result_error", (int)cxt, str, -1); - rt.free(str); - } - - synchronized int value_bytes(Function f, int arg) throws SQLException { - return call("sqlite3_value_bytes", value(f, arg)); - } - synchronized String value_text(Function f, int arg) throws SQLException { - return utfstring(call("sqlite3_value_text", value(f, arg))); - } - synchronized byte[] value_blob(Function f, int arg) throws SQLException { - int addr = call("sqlite3_value_blob", value(f, arg)); - if (addr == 0) return null; - byte[] blob = new byte[value_bytes(f, arg)]; - copyin(addr, blob, blob.length); - return blob; - } - synchronized double value_double(Function f, int arg) throws SQLException { - return Double.parseDouble(value_text(f, arg)); // TODO - } - synchronized long value_long(Function f, int arg) throws SQLException { - return Long.parseLong(value_text(f, arg)); // TODO - } - synchronized int value_int(Function f, int arg) throws SQLException { - return call("sqlite3_value_int", value(f, arg)); - } - synchronized int value_type(Function f, int arg) throws SQLException { - return call("sqlite3_value_type", value(f, arg)); - } - - private int value(Function f, int arg) throws SQLException { - return deref((int)f.value + (arg*4)); - } - - - synchronized int create_function(String name, Function func) - throws SQLException { - if (functions == null) { - functions = new Function[10]; - funcNames = new String[10]; - } - - // find a position - int pos; - for (pos=0; pos < functions.length; pos++) - if (functions[pos] == null) break; - - if (pos == functions.length) { // expand function arrays - Function[] fnew = new Function[functions.length * 2]; - String[] nnew = new String[funcNames.length * 2]; - System.arraycopy(functions, 0, fnew, 0, functions.length); - System.arraycopy(funcNames, 0, nnew, 0, funcNames.length); - functions = fnew; - funcNames = nnew; - } - - // register function - functions[pos] = func; - funcNames[pos] = name; - int rc; - int str = rt.strdup(name); - rc = call("create_function_helper", handle, str, pos, - func instanceof Function.Aggregate ? 1 : 0); - rt.free(str); - return rc; - } - - synchronized int destroy_function(String name) throws SQLException { - if (name == null) return 0; - - // find function position number - int pos; - for (pos = 0; pos < funcNames.length; pos++) - if (name.equals(funcNames[pos])) break; - if (pos == funcNames.length) return 0; - - functions[pos] = null; - funcNames[pos] = null; - - // deregister function - int rc; - int str = rt.strdup(name); - rc = call("create_function_helper", handle, str, -1, 0); - rt.free(str); - return rc; - } - - /* unused as we use the user_data pointer to store a single word */ - synchronized void free_functions() {} - - /** Callback used by xFunc (1), xStep (2) and xFinal (3). */ - synchronized void xUDF(int xType, int context, int args, int value) { - Function func = null; - - try { - int pos = call("sqlite3_user_data", context); - func = functions[pos]; - if (func == null) - throw new SQLException("function state inconsistent"); - - func.context = context; - func.value = value; - func.args = args; - - switch (xType) { - case 1: func.xFunc(); break; - case 2: ((Function.Aggregate)func).xStep(); break; - case 3: ((Function.Aggregate)func).xFinal(); break; - } - } catch (SQLException e) { - try { - String err = e.toString(); - if (err == null) err = "unknown error"; - int str = rt.strdup(err); - call("sqlite3_result_error", context, str, -1); - rt.free(str); - } catch (SQLException exp) { - exp.printStackTrace();//TODO - } - } finally { - if (func != null) { - func.context = 0; - func.value = 0; - func.args = 0; - } - } - } - - - /** Calls support function found in upstream/sqlite-metadata.patch */ - synchronized boolean[][] column_metadata(long stmt) throws SQLException { - int colCount = call("sqlite3_column_count", (int)stmt); - boolean[][] meta = new boolean[colCount][3]; - int pass; - - pass = rt.xmalloc(12); // struct metadata - - for (int i=0; i < colCount; i++) { - call("column_metadata_helper", handle, (int)stmt, i, pass); - meta[i][0] = deref(pass) == 1; - meta[i][1] = deref(pass + 4) == 1; - meta[i][2] = deref(pass + 8) == 1; - } - - rt.free(pass); - return meta; - } - - - // HELPER FUNCTIONS ///////////////////////////////////////////// - - /** safe to reuse parameter arrays as all functions are syncrhonized */ - private final int[] - p0 = new int[] {}, - p1 = new int[] { 0 }, - p2 = new int[] { 0, 0 }, - p3 = new int[] { 0, 0, 0 }, - p4 = new int[] { 0, 0, 0, 0 }, - p5 = new int[] { 0, 0, 0, 0, 0 }; - - private int call(String addr, int a0) throws SQLException { - p1[0] = a0; return call(addr, p1); } - private int call(String addr, int a0, int a1) throws SQLException { - p2[0] = a0; p2[1] = a1; return call(addr, p2); } - private int call(String addr, int a0, int a1, int a2) throws SQLException { - p3[0] = a0; p3[1] = a1; p3[2] = a2; return call(addr, p3); } - private int call(String addr, int a0, int a1, int a2, int a3) - throws SQLException { - p4[0] = a0; p4[1] = a1; p4[2] = a2; p4[3] = a3; - return call(addr, p4); - } - private int call(String addr, int a0, int a1, int a2, int a3, int a4) - throws SQLException { - p5[0] = a0; p5[1] = a1; p5[2] = a2; p5[3] = a3; p5[4] = a4; - return call(addr, p5); - } - private int call(String func, int[] args) throws SQLException { - try { - return rt.call(func, args); - } catch (Runtime.CallException e) { throw new CausedSQLException(e); } - } - - /** Dereferences a pointer, returning the word it points to. */ - private int deref(int pointer) throws SQLException { - try { return rt.memRead(pointer); } - catch (Runtime.ReadFaultException e) { throw new CausedSQLException(e);} - } - private String utfstring(int str) throws SQLException { - try { return rt.utfstring(str); } - catch (Runtime.ReadFaultException e) { throw new CausedSQLException(e);} - } - private String cstring(int str) throws SQLException { - try { return rt.cstring(str); } - catch (Runtime.ReadFaultException e) { throw new CausedSQLException(e);} - } - private void copyin(int addr, byte[] buf, int count) throws SQLException { - try { rt.copyin(addr, buf, count); } - catch (Runtime.ReadFaultException e) { throw new CausedSQLException(e);} - } - private void copyout(byte[] buf, int addr, int count) throws SQLException { - try { rt.copyout(buf, addr, count); } - catch (Runtime.FaultException e) { throw new CausedSQLException(e);} - } - - /** Maps any exception onto an SQLException. */ - private static final class CausedSQLException extends SQLException { - private final Exception cause; - CausedSQLException(Exception e) { - if (e == null) throw new RuntimeException("null exception cause"); - cause = e; - } - public Throwable getCause() { return cause; } - public void printStackTrace() { cause.printStackTrace(); } - public void printStackTrace(PrintWriter s) { cause.printStackTrace(s); } - public Throwable fillInStackTrace() { return cause.fillInStackTrace(); } - public StackTraceElement[] getStackTrace() { - return cause.getStackTrace(); } - public String getMessage() { return cause.getMessage(); } - } -} diff --git a/sqlitejdbc/src/org/sqlite/PrepStmt.java b/sqlitejdbc/src/org/sqlite/PrepStmt.java deleted file mode 100644 index 28b37dd..0000000 --- a/sqlitejdbc/src/org/sqlite/PrepStmt.java +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package org.sqlite; - -import java.io.Reader; -import java.io.InputStream; -import java.net.URL; -import java.sql.*; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Calendar; - -final class PrepStmt extends Stmt - implements PreparedStatement, ParameterMetaData, Codes -{ - private int columnCount; - private int paramCount; - - PrepStmt(Conn conn, String sql) throws SQLException { - super(conn); - - this.sql = sql; - db.prepare(this); - rs.colsMeta = db.column_names(pointer); - columnCount = db.column_count(pointer); - paramCount = db.bind_parameter_count(pointer); - batch = new Object[paramCount]; - batchPos = 0; - } - - public void close() throws SQLException { - batch = null; - clearParameters(); - super.close(); - } - - public void clearParameters() throws SQLException { - checkOpen(); - db.reset(pointer); - clearBatch(); - } - - protected void finalize() throws SQLException { close(); } - - public boolean execute() throws SQLException { - checkOpen(); - rs.close(); - db.reset(pointer); - resultsWaiting = db.execute(this, batch); - return columnCount != 0; - } - - public ResultSet executeQuery() throws SQLException { - checkOpen(); - if (columnCount == 0) - throw new SQLException("query does not return results"); - rs.close(); - db.reset(pointer); - resultsWaiting = db.execute(this, batch); - return getResultSet(); - } - - public int executeUpdate() throws SQLException { - checkOpen(); - if (columnCount != 0) - throw new SQLException("query returns results"); - rs.close(); - db.reset(pointer); - return db.executeUpdate(this, batch); - } - - public int[] executeBatch() throws SQLException { - if (batchPos == 0) return new int[] {}; - return db.executeBatch(pointer, batchPos / paramCount, batch); - } - - public int getUpdateCount() throws SQLException { - checkOpen(); - if (pointer == 0 || resultsWaiting) return -1; - return db.changes(); - } - - public void addBatch() throws SQLException { - checkOpen(); - batchPos += paramCount; - if (batchPos + paramCount > batch.length) { - Object[] nb = new Object[batch.length * 2]; - System.arraycopy(batch, 0, nb, 0, batch.length); - batch = nb; - } - } - - - // ParameterMetaData FUNCTIONS ////////////////////////////////// - - public ParameterMetaData getParameterMetaData() { return this; } - - public int getParameterCount() throws SQLException { - checkOpen(); return paramCount; } - public String getParameterClassName(int param) throws SQLException { - checkOpen(); return "java.lang.String"; } - public String getParameterTypeName(int pos) { return "VARCHAR"; } - public int getParameterType(int pos) { return Types.VARCHAR; } - public int getParameterMode(int pos) { return parameterModeIn; } - public int getPrecision(int pos) { return 0; } - public int getScale(int pos) { return 0; } - public int isNullable(int pos) { return parameterNullable; } - public boolean isSigned(int pos) { return true; } - public Statement getStatement() { return this; } - - - // PARAMETER FUNCTIONS ////////////////////////////////////////// - - private void batch(int pos, Object value) throws SQLException { - checkOpen(); - if (batch == null) batch = new Object[paramCount]; - batch[batchPos + pos - 1] = value; - } - - public void setBoolean(int pos, boolean value) throws SQLException { - setInt(pos, value ? 1 : 0); - } - public void setByte(int pos, byte value) throws SQLException { - setInt(pos, (int)value); - } - public void setBytes(int pos, byte[] value) throws SQLException { - batch(pos, value); - } - public void setDouble(int pos, double value) throws SQLException { - batch(pos, new Double(value)); - } - public void setFloat(int pos, float value) throws SQLException { - setDouble(pos, value); - } - public void setInt(int pos, int value) throws SQLException { - batch(pos, new Integer(value)); - } - public void setLong(int pos, long value) throws SQLException { - batch(pos, new Long(value)); - } - public void setNull(int pos, int u1) throws SQLException { - setNull(pos, u1, null); - } - public void setNull(int pos, int u1, String u2) throws SQLException { - batch(pos, null); - } - public void setObject(int pos , Object value) throws SQLException { - if (value == null) - batch(pos, null); - else if (value instanceof java.util.Date) - batch(pos, new Long(((java.util.Date)value).getTime())); - else if (value instanceof Long) batch(pos, value); - else if (value instanceof Integer) batch(pos, value); - else if (value instanceof Float) batch(pos, value); - else if (value instanceof Double) batch(pos, value); - else - batch(pos, value.toString()); - } - public void setObject(int p, Object v, int t) throws SQLException { - setObject(p, v); } - public void setObject(int p, Object v, int t, int s) throws SQLException { - setObject(p, v); } - public void setShort(int pos, short value) throws SQLException { - setInt(pos, (int)value); } - public void setString(int pos, String value) throws SQLException { - batch(pos, value); - } - public void setDate(int pos, Date x) throws SQLException { - setLong(pos, x.getTime()); } - public void setDate(int pos, Date x, Calendar cal) throws SQLException { - setLong(pos, x.getTime()); } - public void setTime(int pos, Time x) throws SQLException { - setLong(pos, x.getTime()); } - public void setTime(int pos, Time x, Calendar cal) throws SQLException { - setLong(pos, x.getTime()); } - public void setTimestamp(int pos, Timestamp x) throws SQLException { - setLong(pos, x.getTime()); } - public void setTimestamp(int pos, Timestamp x, Calendar cal) - throws SQLException { setLong(pos, x.getTime()); } - - public ResultSetMetaData getMetaData() throws SQLException { - checkOpen(); return rs; } - - - // UNUSED /////////////////////////////////////////////////////// - - public boolean execute(String sql) - throws SQLException { throw unused(); } - public int executeUpdate(String sql) - throws SQLException { throw unused(); } - public ResultSet executeQuery(String sql) - throws SQLException { throw unused(); } - public void addBatch(String sql) - throws SQLException { throw unused(); } - - private SQLException unused() { - return new SQLException("not supported by PreparedStatment"); - } -} diff --git a/sqlitejdbc/src/org/sqlite/RS.java b/sqlitejdbc/src/org/sqlite/RS.java deleted file mode 100644 index 055676b..0000000 --- a/sqlitejdbc/src/org/sqlite/RS.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import java.sql.*; - -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.util.Calendar; -import java.util.Map; - -/** - * Implements a JDBC ResultSet. - */ -final class RS extends Unused implements ResultSet, ResultSetMetaData, Codes -{ - private final Stmt stmt; - private final DB db; - - boolean open = false ; // true means have results and can iterate them - int maxRows; // max. number of rows as set by a Statement - String[] cols = null; // if null, the RS is closed() - String[] colsMeta = null; // same as cols, but used by Meta interface - boolean[][] meta = null; - - private int limitRows; // 0 means no limit, must check against maxRows - private int row = 1; // number of current row, starts at 1 - private int lastCol; // last column accessed, for wasNull(). -1 if none - - RS(Stmt stmt) { - this.stmt = stmt; - this.db = stmt.db; - } - - - // INTERNAL FUNCTIONS /////////////////////////////////////////// - - boolean isOpen() { return open; } - - /* Throws SQLException if ResultSet is not open. */ - void checkOpen() throws SQLException { - if (!open) throw new SQLException("ResultSet closed"); - } - - // takes col in [1,x] form, returns in [0,x-1] form - private int checkCol(int col) throws SQLException { - if (colsMeta == null) throw new IllegalStateException( - "SQLite JDBC: inconsistent internal state"); - if (col < 1 || col > colsMeta.length) throw new SQLException( - "column " + col + " out of bounds [1," + colsMeta.length + "]"); - return --col; - } - - // takes col in [1,x] form, marks it as last accessed and returns [0,x-1] - private int markCol(int col) throws SQLException { - checkOpen(); checkCol(col); lastCol = col; return --col; - } - - private void checkMeta() throws SQLException { - checkCol(1); - if (meta == null) meta = db.column_metadata(stmt.pointer); - } - - - // ResultSet Functions ////////////////////////////////////////// - - public void close() throws SQLException { - cols = null; - colsMeta = null; - meta = null; - open = false; - limitRows = 0; - row = 1; - lastCol = -1; - - if (stmt == null) - return; - if (stmt != null && stmt.pointer != 0) - db.reset(stmt.pointer); - } - - // returns col in [1,x] form - public int findColumn(String col) throws SQLException { - checkOpen(); - for (int i=0; i < cols.length; i++) - if (col.equalsIgnoreCase(cols[i])) return i+1; - throw new SQLException("no such column: '"+col+"'"); - } - - public boolean next() throws SQLException { - //XXX System.out.println("next(): open="+open+", row="+row+", maxRows="+maxRows+", limitRows="+limitRows); - if (!open) return false; // finished ResultSet - lastCol = -1; - - // first row is loaded by execute(), so do not step() again - if (row == 1) { row++; return true; } - - // check if we are row limited by the statement or the ResultSet - if (maxRows != 0 && row > maxRows) return false; - if (limitRows != 0 && row >= limitRows) return false; - - // do the real work - switch (db.step(stmt.pointer)) { - case SQLITE_DONE: - close(); // agressive closing to avoid writer starvation - return false; - case SQLITE_ROW: row++; return true; - case SQLITE_BUSY: - throw new SQLException("database locked"); - default: - db.throwex(); return false; - } - } - - public int getType() throws SQLException { return TYPE_FORWARD_ONLY; } - - public int getFetchSize() throws SQLException { return limitRows; } - public void setFetchSize(int rows) throws SQLException { - if (0 > rows || (maxRows != 0 && rows > maxRows)) - throw new SQLException("fetch size " + rows - + " out of bounds " + maxRows); - limitRows = rows; - } - - public int getFetchDirection() throws SQLException { - checkOpen(); return ResultSet.FETCH_FORWARD; } - public void setFetchDirection(int d) throws SQLException { - checkOpen(); - if (d != ResultSet.FETCH_FORWARD) - throw new SQLException("only FETCH_FORWARD direction supported"); - } - - public boolean isAfterLast() throws SQLException { return !open; } - public boolean isBeforeFirst() throws SQLException { - return open && row == 1; } - public boolean isFirst() throws SQLException { return row == 2; } - public boolean isLast() throws SQLException { // FIXME - throw new SQLException("function not yet implemented for SQLite"); } - - protected void finalize() throws SQLException { close(); } - - public int getRow() throws SQLException { return row; } - - public boolean wasNull() throws SQLException { - return db.column_type(stmt.pointer, markCol(lastCol)) == SQLITE_NULL; - } - - - // DATA ACCESS FUNCTIONS //////////////////////////////////////// - - public boolean getBoolean(int col) throws SQLException { - return getInt(col) == 0 ? false : true; } - public boolean getBoolean(String col) throws SQLException { - return getBoolean(findColumn(col)); } - - public byte getByte(int col) throws SQLException { - return (byte)getInt(col); } - public byte getByte(String col) throws SQLException { - return getByte(findColumn(col)); } - - public byte[] getBytes(int col) throws SQLException { - return db.column_blob(stmt.pointer, markCol(col)); } - public byte[] getBytes(String col) throws SQLException { - return getBytes(findColumn(col)); } - - public Date getDate(int col) throws SQLException { - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return null; - return new Date(db.column_long(stmt.pointer, markCol(col))); - } - public Date getDate(int col, Calendar cal) throws SQLException { - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return null; - if (cal == null) return getDate(col); - cal.setTimeInMillis(db.column_long(stmt.pointer, markCol(col))); - return new Date(cal.getTime().getTime()); - } - public Date getDate(String col) throws SQLException { - return getDate(findColumn(col), Calendar.getInstance()); } - public Date getDate(String col, Calendar cal) throws SQLException { - return getDate(findColumn(col), cal); } - - public double getDouble(int col) throws SQLException { - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return 0; - return db.column_double(stmt.pointer, markCol(col)); - } - public double getDouble(String col) throws SQLException { - return getDouble(findColumn(col)); } - - public float getFloat(int col) throws SQLException { - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return 0; - return (float)db.column_double(stmt.pointer, markCol(col)); - } - public float getFloat(String col) throws SQLException { - return getFloat(findColumn(col)); } - - public int getInt(int col) throws SQLException { - return db.column_int(stmt.pointer, markCol(col)); } - public int getInt(String col) throws SQLException { - return getInt(findColumn(col)); } - - public long getLong(int col) throws SQLException { - return db.column_long(stmt.pointer, markCol(col)); } - public long getLong(String col) throws SQLException { - return getLong(findColumn(col)); } - - public short getShort(int col) throws SQLException { - return (short)getInt(col); } - public short getShort(String col) throws SQLException { - return getShort(findColumn(col)); } - - public String getString(int col) throws SQLException { - return db.column_text(stmt.pointer, markCol(col)); } - public String getString(String col) throws SQLException { - return getString(findColumn(col)); } - - public Time getTime(int col) throws SQLException { - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return null; - return new Time(db.column_long(stmt.pointer, markCol(col))); } - public Time getTime(int col, Calendar cal) throws SQLException { - if (cal == null) return getTime(col); - if (db.column_type(stmt.pointer, markCol(col)) == SQLITE_NULL) - return null; - cal.setTimeInMillis(db.column_long(stmt.pointer, markCol(col))); - return new Time(cal.getTime().getTime()); - } - public Time getTime(String col) throws SQLException { - return getTime(findColumn(col)); } - public Time getTime(String col, Calendar cal) throws SQLException { - return getTime(findColumn(col), cal); } - - public Timestamp getTimestamp(int col) throws SQLException { - return new Timestamp(db.column_long(stmt.pointer, markCol(col))); } - public Timestamp getTimestamp(int col, Calendar cal) throws SQLException { - if (cal == null) return getTimestamp(col); - cal.setTimeInMillis(db.column_long(stmt.pointer, markCol(col))); - return new Timestamp(cal.getTime().getTime()); - } - public Timestamp getTimestamp(String col) throws SQLException { - return getTimestamp(findColumn(col)); } - public Timestamp getTimestamp(String c, Calendar ca) throws SQLException { - return getTimestamp(findColumn(c), ca); } - - public Object getObject(int col) throws SQLException { - switch (db.column_type(stmt.pointer, checkCol(col))) { - case SQLITE_INTEGER: - long val = getLong(col); - if (val > (long)Integer.MAX_VALUE - || val < (long)Integer.MIN_VALUE) - return new Long(val); - else - return new Integer((int)val); - case SQLITE_FLOAT: return new Double(getDouble(col)); - case SQLITE_BLOB: return getBytes(col); - case SQLITE_NULL: return null; - case SQLITE_TEXT: - default: - return getString(col); - } - } - public Object getObject(String col) throws SQLException { - return getObject(findColumn(col)); } - - public Statement getStatement() { return stmt; } - public String getCursorName() throws SQLException { return null; } - public SQLWarning getWarnings() throws SQLException { return null; } - public void clearWarnings() throws SQLException {} - - // ResultSetMetaData Functions ////////////////////////////////// - - // we do not need to check the RS is open, only that colsMeta - // is not null, done with checkCol(int). - - public ResultSetMetaData getMetaData() throws SQLException { - return this; } - - public String getCatalogName(int col) throws SQLException { - return db.column_table_name(stmt.pointer, checkCol(col)); } - public String getColumnClassName(int col) throws SQLException { - checkCol(col); return "java.lang.Object"; } - public int getColumnCount() throws SQLException { - checkCol(1); return colsMeta.length; - } - public int getColumnDisplaySize(int col) throws SQLException { - return Integer.MAX_VALUE; } - public String getColumnLabel(int col) throws SQLException { - return getColumnName(col); } - public String getColumnName(int col) throws SQLException { - return db.column_name(stmt.pointer, checkCol(col)); } - public int getColumnType(int col) throws SQLException { - switch (db.column_type(stmt.pointer, checkCol(col))) { - case SQLITE_INTEGER: return Types.INTEGER; - case SQLITE_FLOAT: return Types.FLOAT; - case SQLITE_BLOB: return Types.BLOB; - case SQLITE_NULL: return Types.NULL; - case SQLITE_TEXT: - default: - return Types.VARCHAR; - } - } - public String getColumnTypeName(int col) throws SQLException { - return db.column_decltype(stmt.pointer, checkCol(col)); - } - public int getPrecision(int col) throws SQLException { return 0; } // FIXME - public int getScale(int col) throws SQLException { return 0; } - public String getSchemaName(int col) throws SQLException { return ""; } - public String getTableName(int col) throws SQLException { - return db.column_table_name(stmt.pointer, checkCol(col)); } - public int isNullable(int col) throws SQLException { - checkMeta(); - return meta[checkCol(col)][1] ? columnNoNulls: columnNullable; - } - public boolean isAutoIncrement(int col) throws SQLException { - checkMeta(); return meta[checkCol(col)][2]; } - public boolean isCaseSensitive(int col) throws SQLException { return true; } - public boolean isCurrency(int col) throws SQLException { return false; } - public boolean isDefinitelyWritable(int col) throws SQLException { - return true; } // FIXME: check db file constraints? - public boolean isReadOnly(int col) throws SQLException { return false; } - public boolean isSearchable(int col) throws SQLException { return true; } - public boolean isSigned(int col) throws SQLException { return false; } - public boolean isWritable(int col) throws SQLException { return true; } - - public int getConcurrency() throws SQLException { return CONCUR_READ_ONLY; } - - public boolean rowDeleted() throws SQLException { return false; } - public boolean rowInserted() throws SQLException { return false; } - public boolean rowUpdated() throws SQLException { return false; } -} diff --git a/sqlitejdbc/src/org/sqlite/Stmt.java b/sqlitejdbc/src/org/sqlite/Stmt.java deleted file mode 100644 index c5980b8..0000000 --- a/sqlitejdbc/src/org/sqlite/Stmt.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -package org.sqlite; - -import java.sql.*; -import java.util.ArrayList; - -class Stmt extends Unused implements Statement, Codes -{ - final Conn conn; - final DB db; - final RS rs; - - long pointer; - String sql = null; - - int batchPos; - Object[] batch = null; - boolean resultsWaiting = false; - - Stmt(Conn c) { - conn = c; - db = conn.db(); - rs = new RS(this); - } - - protected final void checkOpen() throws SQLException { - if (pointer == 0) throw new SQLException("statement is not executing"); - } - boolean isOpen() throws SQLException { - return (pointer != 0); - } - - /** Calls sqlite3_step() and sets up results. Expects a clean stmt. */ - protected boolean exec() throws SQLException { - if (sql == null) throw new SQLException( - "SQLiteJDBC internal error: sql==null"); - if (rs.isOpen()) throw new SQLException( - "SQLite JDBC internal error: rs.isOpen() on exec."); - - boolean rc = false; - try { - rc = db.execute(this, null); - } finally { - resultsWaiting = rc; - } - - return db.column_count(pointer) != 0; - } - - - // PUBLIC INTERFACE ///////////////////////////////////////////// - - public void close() throws SQLException { - if (pointer == 0) return; - rs.close(); - batch = null; - batchPos = 0; - int resp = db.finalize(this); - if (resp != SQLITE_OK && resp != SQLITE_MISUSE) - db.throwex(); - } - - protected void finalize() throws SQLException { close(); } - - public boolean execute(String sql) throws SQLException { - close(); - this.sql = sql; - db.prepare(this); - return exec(); - } - - public ResultSet executeQuery(String sql) throws SQLException { - close(); - this.sql = sql; - db.prepare(this); - if (!exec()) { - close(); - throw new SQLException("query does not return ResultSet"); - } - return getResultSet(); - } - - public int executeUpdate(String sql) throws SQLException { - close(); - this.sql = sql; - int changes = 0; - try { - db.prepare(this); - changes = db.executeUpdate(this, null); - } finally { close(); } - return changes; - } - - public ResultSet getResultSet() throws SQLException { - checkOpen(); - if (rs.isOpen()) throw new SQLException("ResultSet already requested"); - if (db.column_count(pointer) == 0) throw new SQLException( - "no ResultSet available"); - if (rs.colsMeta == null) - rs.colsMeta = db.column_names(pointer); - rs.cols = rs.colsMeta; - - rs.open = resultsWaiting; - resultsWaiting = false; - return rs; - } - - /* - * This function has a complex behaviour best understood by carefully - * reading the JavaDoc for getMoreResults() and considering the test - * StatementTest.execute(). - */ - public int getUpdateCount() throws SQLException { - if (pointer != 0 - && !rs.isOpen() - && !resultsWaiting - && db.column_count(pointer) == 0) - return db.changes(); - return -1; - } - - public void addBatch(String sql) throws SQLException { - close(); - if (batch == null || batchPos + 1 >= batch.length) - batch = new Object[Math.max(10, batchPos * 2)]; - batch[batchPos++] = sql; - } - - public void clearBatch() throws SQLException { - batchPos = 0; - if (batch != null) - for (int i=0; i < batch.length; i++) - batch[i] = null; - } - - public int[] executeBatch() throws SQLException { - // TODO: optimise - close(); - if (batch == null || batchPos == 0) return new int[] {}; - - int[] changes = new int[batchPos]; - - synchronized (db) { try { - for (int i=0; i < changes.length; i++) { - try { - this.sql = (String)batch[i]; - db.prepare(this); - changes[i] = db.executeUpdate(this, null); - } catch (SQLException e) { - throw new BatchUpdateException( - "batch entry " + i + ": " + e.getMessage(), changes); - } finally { - db.finalize(this); - } - } - } finally { - clearBatch(); - } } - - return changes; - } - - public void setCursorName(String name) {} - - public SQLWarning getWarnings() throws SQLException { return null; } - public void clearWarnings() throws SQLException {} - - public Connection getConnection() throws SQLException { - return conn; } - - public void cancel() throws SQLException { rs.checkOpen(); db.interrupt(); } - public int getQueryTimeout() throws SQLException { - return conn.getTimeout(); } - public void setQueryTimeout(int seconds) throws SQLException { - if (seconds < 0) throw new SQLException("query timeout must be >= 0"); - conn.setTimeout(1000 * seconds); - } - - // TODO: write test - public int getMaxRows() throws SQLException { - checkOpen(); - return rs.maxRows; - } - public void setMaxRows(int max) throws SQLException { - checkOpen(); - if (max < 0) throw new SQLException("max row count must be >= 0"); - rs.maxRows = max; - } - - public int getMaxFieldSize() throws SQLException { return 0; } - public void setMaxFieldSize(int max) throws SQLException { - if (max < 0) throw new SQLException( - "max field size "+max+" cannot be negative"); - } - - public int getFetchSize() throws SQLException { return rs.getFetchSize(); } - public void setFetchSize(int r) throws SQLException { rs.setFetchSize(r); } - public int getFetchDirection() throws SQLException { - return rs.getFetchDirection(); - } - public void setFetchDirection(int d) throws SQLException { - rs.setFetchDirection(d); - } - - /** As SQLite's last_insert_rowid() function is DB-specific not - * statement specific, this function introduces a race condition - * if the same connection is used by two threads and both insert. */ - public ResultSet getGeneratedKeys() throws SQLException { - return ((MetaData)conn.getMetaData()).getGeneratedKeys(); - } - - /** SQLite does not support multiple results from execute(). */ - public boolean getMoreResults() throws SQLException { - return getMoreResults(0); - } - public boolean getMoreResults(int c) throws SQLException { - checkOpen(); - close(); // as we never have another result, clean up pointer - return false; - } - - public int getResultSetConcurrency() throws SQLException { - return ResultSet.CONCUR_READ_ONLY; } - public int getResultSetHoldability() throws SQLException { - return ResultSet.CLOSE_CURSORS_AT_COMMIT; } - public int getResultSetType() throws SQLException { - return ResultSet.TYPE_FORWARD_ONLY; } -} diff --git a/sqlitejdbc/src/org/sqlite/Unused.java b/sqlitejdbc/src/org/sqlite/Unused.java deleted file mode 100644 index 1957699..0000000 --- a/sqlitejdbc/src/org/sqlite/Unused.java +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2007 David Crawshaw - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package org.sqlite; - -import java.io.*; -import java.math.*; -import java.net.*; -import java.sql.*; -import java.util.Map; - -/** Unused JDBC functions from Statement, PreparedStatement and ResultSet. */ -abstract class Unused -{ - private SQLException unused() { - return new SQLException("not implemented by SQLite JDBC driver"); - } - - - // Statement //////////////////////////////////////////////////// - - public void setEscapeProcessing(boolean enable) - throws SQLException { throw unused(); } - public boolean execute(String sql, int[] colinds) - throws SQLException { throw unused(); } - public boolean execute(String sql, String[] colnames) - throws SQLException { throw unused(); } - public int executeUpdate(String sql, int autoKeys) - throws SQLException { throw unused(); } - public int executeUpdate(String sql, int[] colinds) - throws SQLException { throw unused(); } - public int executeUpdate(String sql, String[] cols) - throws SQLException { throw unused(); } - public boolean execute(String sql, int autokeys) - throws SQLException { throw unused(); } - - - // PreparedStatement //////////////////////////////////////////// - - public void setArray(int i, Array x) - throws SQLException { throw unused(); } - public void setAsciiStream(int parameterIndex, InputStream x, int length) - throws SQLException { throw unused(); } - public void setBigDecimal(int parameterIndex, BigDecimal x) - throws SQLException { throw unused(); } - public void setBinaryStream(int parameterIndex, InputStream x, int length) - throws SQLException { throw unused(); } - public void setBlob(int i, Blob x) - throws SQLException { throw unused(); } - public void setCharacterStream(int pos, Reader reader, int length) - throws SQLException { throw unused(); } - public void setClob(int i, Clob x) - throws SQLException { throw unused(); } - public void setRef(int i, Ref x) - throws SQLException { throw unused(); } - public void setUnicodeStream(int pos, InputStream x, int length) - throws SQLException { throw unused(); } - public void setURL(int pos, URL x) - throws SQLException { throw unused(); } - - - // ResultSet //////////////////////////////////////////////////// - - public Array getArray(int i) - throws SQLException { throw unused(); } - public Array getArray(String col) - throws SQLException { throw unused(); } - public InputStream getAsciiStream(int col) - throws SQLException { throw unused(); } - public InputStream getAsciiStream(String col) - throws SQLException { throw unused(); } - public BigDecimal getBigDecimal(int col) - throws SQLException { throw unused(); } - public BigDecimal getBigDecimal(int col, int s) - throws SQLException { throw unused(); } - public BigDecimal getBigDecimal(String col) - throws SQLException { throw unused(); } - public BigDecimal getBigDecimal(String col, int s) - throws SQLException { throw unused(); } - public InputStream getBinaryStream(int col) - throws SQLException { throw unused(); } - public InputStream getBinaryStream(String col) - throws SQLException { throw unused(); } - public Blob getBlob(int col) - throws SQLException { throw unused(); } - public Blob getBlob(String col) - throws SQLException { throw unused(); } - public Reader getCharacterStream(int col) - throws SQLException { throw unused(); } - public Reader getCharacterStream(String col) - throws SQLException { throw unused(); } - public Clob getClob(int col) - throws SQLException { throw unused(); } - public Clob getClob(String col) - throws SQLException { throw unused(); } - public Object getObject(int col, Map map) - throws SQLException { throw unused(); } - public Object getObject(String col, Map map) - throws SQLException { throw unused(); } - public Ref getRef(int i) - throws SQLException { throw unused(); } - public Ref getRef(String col) - throws SQLException { throw unused(); } - - public InputStream getUnicodeStream(int col) - throws SQLException { throw unused(); } - public InputStream getUnicodeStream(String col) - throws SQLException { throw unused(); } - public URL getURL(int col) - throws SQLException { throw unused(); } - public URL getURL(String col) - throws SQLException { throw unused(); } - - public void insertRow() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public void moveToCurrentRow() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public void moveToInsertRow() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public boolean last() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public boolean previous() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public boolean relative(int rows) throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public boolean absolute(int row) throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public void afterLast() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public void beforeFirst() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - public boolean first() throws SQLException { - throw new SQLException("ResultSet is TYPE_FORWARD_ONLY"); } - - public void cancelRowUpdates() - throws SQLException { throw unused(); } - public void deleteRow() - throws SQLException { throw unused(); } - - public void updateArray(int col, Array x) - throws SQLException { throw unused(); } - public void updateArray(String col, Array x) - throws SQLException { throw unused(); } - public void updateAsciiStream(int col, InputStream x, int l) - throws SQLException { throw unused(); } - public void updateAsciiStream(String col, InputStream x, int l) - throws SQLException { throw unused(); } - public void updateBigDecimal(int col, BigDecimal x) - throws SQLException { throw unused(); } - public void updateBigDecimal(String col, BigDecimal x) - throws SQLException { throw unused(); } - public void updateBinaryStream(int c, InputStream x, int l) - throws SQLException { throw unused(); } - public void updateBinaryStream(String c, InputStream x, int l) - throws SQLException { throw unused(); } - public void updateBlob(int col, Blob x) - throws SQLException { throw unused(); } - public void updateBlob(String col, Blob x) - throws SQLException { throw unused(); } - public void updateBoolean(int col, boolean x) - throws SQLException { throw unused(); } - public void updateBoolean(String col, boolean x) - throws SQLException { throw unused(); } - public void updateByte(int col, byte x) - throws SQLException { throw unused(); } - public void updateByte(String col, byte x) - throws SQLException { throw unused(); } - public void updateBytes(int col, byte[] x) - throws SQLException { throw unused(); } - public void updateBytes(String col, byte[] x) - throws SQLException { throw unused(); } - public void updateCharacterStream(int c, Reader x, int l) - throws SQLException { throw unused(); } - public void updateCharacterStream(String c, Reader r, int l) - throws SQLException { throw unused(); } - public void updateClob(int col, Clob x) - throws SQLException { throw unused(); } - public void updateClob(String col, Clob x) - throws SQLException { throw unused(); } - public void updateDate(int col, Date x) - throws SQLException { throw unused(); } - public void updateDate(String col, Date x) - throws SQLException { throw unused(); } - public void updateDouble(int col, double x) - throws SQLException { throw unused(); } - public void updateDouble(String col, double x) - throws SQLException { throw unused(); } - public void updateFloat(int col, float x) - throws SQLException { throw unused(); } - public void updateFloat(String col, float x) - throws SQLException { throw unused(); } - public void updateInt(int col, int x) - throws SQLException { throw unused(); } - public void updateInt(String col, int x) - throws SQLException { throw unused(); } - public void updateLong(int col, long x) - throws SQLException { throw unused(); } - public void updateLong(String col, long x) - throws SQLException { throw unused(); } - public void updateNull(int col) - throws SQLException { throw unused(); } - public void updateNull(String col) - throws SQLException { throw unused(); } - public void updateObject(int c, Object x) - throws SQLException { throw unused(); } - public void updateObject(int c, Object x, int s) - throws SQLException { throw unused(); } - public void updateObject(String col, Object x) - throws SQLException { throw unused(); } - public void updateObject(String c, Object x, int s) - throws SQLException { throw unused(); } - public void updateRef(int col, Ref x) - throws SQLException { throw unused(); } - public void updateRef(String c, Ref x) - throws SQLException { throw unused(); } - public void updateRow() - throws SQLException { throw unused(); } - public void updateShort(int c, short x) - throws SQLException { throw unused(); } - public void updateShort(String c, short x) - throws SQLException { throw unused(); } - public void updateString(int c, String x) - throws SQLException { throw unused(); } - public void updateString(String c, String x) - throws SQLException { throw unused(); } - public void updateTime(int c, Time x) - throws SQLException { throw unused(); } - public void updateTime(String c, Time x) - throws SQLException { throw unused(); } - public void updateTimestamp(int c, Timestamp x) - throws SQLException { throw unused(); } - public void updateTimestamp(String c, Timestamp x) - throws SQLException { throw unused(); } - - public void refreshRow() - throws SQLException { throw unused(); } -} diff --git a/sqlitejdbc/src/test/ConnectionTest.java b/sqlitejdbc/src/test/ConnectionTest.java deleted file mode 100644 index e78f9ea..0000000 --- a/sqlitejdbc/src/test/ConnectionTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package test; - -import java.io.File; -import java.sql.*; -import org.junit.*; -import static org.junit.Assert.*; - -/** These tests check whether access to files is woring correctly and - * some Connection.close() cases. */ -public class ConnectionTest -{ - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Test public void openMemory() throws SQLException { - Connection conn = DriverManager.getConnection("jdbc:sqlite:"); - conn.close(); - } - - @Test public void isClosed() throws SQLException { - Connection conn = DriverManager.getConnection("jdbc:sqlite:"); - conn.close(); - assertTrue(conn.isClosed()); - } - - @Test public void openFile() throws SQLException { - File testdb = new File("test.db"); - if (testdb.exists()) testdb.delete(); - assertFalse(testdb.exists()); - Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db"); - conn.close(); - assertTrue(testdb.exists()); - testdb.delete(); - } - - @Test(expected= SQLException.class) - public void closeTest() throws SQLException { - Connection conn = DriverManager.getConnection("jdbc:sqlite:"); - PreparedStatement prep = conn.prepareStatement("select null;"); - ResultSet rs = prep.executeQuery(); - conn.close(); - prep.clearParameters(); - } -} diff --git a/sqlitejdbc/src/test/DBMetaDataTest.java b/sqlitejdbc/src/test/DBMetaDataTest.java deleted file mode 100644 index e6f7992..0000000 --- a/sqlitejdbc/src/test/DBMetaDataTest.java +++ /dev/null @@ -1,413 +0,0 @@ -package test; - -import java.sql.*; -import org.junit.*; -import static org.junit.Assert.*; - -/** These tests are designed to stress Statements on memory databases. */ -public class DBMetaDataTest -{ - private Connection conn; - private Statement stat; - private DatabaseMetaData meta; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - conn = DriverManager.getConnection("jdbc:sqlite:"); - stat = conn.createStatement(); - stat.executeUpdate( - "create table test (id integer primary key, fn, sn);"); - stat.executeUpdate("create view testView as select * from test;"); - meta = conn.getMetaData(); - } - - @After public void close() throws SQLException { - meta = null; - stat.close(); - conn.close(); - } - - @Test public void getTables() throws SQLException { - ResultSet rs = meta.getTables(null, null, null, null); - assertNotNull(rs); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "TEST"); // 3 - assertEquals(rs.getString("TABLE_TYPE"), "TABLE"); // 4 - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "TESTVIEW"); - assertEquals(rs.getString("TABLE_TYPE"), "VIEW"); - rs.close(); - - rs = meta.getTables(null, null, "bob", null); - assertFalse(rs.next()); - rs.close(); - rs = meta.getTables(null, null, "test", null); - assertTrue(rs.next()); - assertFalse(rs.next()); - rs.close(); - rs = meta.getTables(null, null, "test%", null); - assertTrue(rs.next()); - assertTrue(rs.next()); - rs.close(); - - rs = meta.getTables(null, null, null, new String[] { "table" }); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "TEST"); - assertFalse(rs.next()); - rs.close(); - - rs = meta.getTables(null, null, null, new String[] { "view" }); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "TESTVIEW"); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void getTableTypes() throws SQLException { - ResultSet rs = meta.getTableTypes(); - assertNotNull(rs); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_TYPE"), "TABLE"); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_TYPE"), "VIEW"); - assertFalse(rs.next()); - } - - @Test public void getTypeInfo() throws SQLException { - ResultSet rs = meta.getTypeInfo(); - assertNotNull(rs); - assertTrue(rs.next()); - assertEquals(rs.getString("TYPE_NAME"), "BLOB"); - assertTrue(rs.next()); - assertEquals(rs.getString("TYPE_NAME"), "INTEGER"); - assertTrue(rs.next()); - assertEquals(rs.getString("TYPE_NAME"), "NULL"); - assertTrue(rs.next()); - assertEquals(rs.getString("TYPE_NAME"), "REAL"); - assertTrue(rs.next()); - assertEquals(rs.getString("TYPE_NAME"), "TEXT"); - assertFalse(rs.next()); - } - - @Test public void getColumns() throws SQLException { - ResultSet rs = meta.getColumns(null, null, "test", "id"); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "test"); - assertEquals(rs.getString("COLUMN_NAME"), "id"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "test", "fn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "fn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "test", "sn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "sn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "test", "%"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "id"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "fn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "sn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "test", "%n"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "fn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "sn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "test%", "%"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "id"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "fn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "sn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "%", "%"); - assertTrue(rs.next()); - assertEquals(rs.getString("TABLE_NAME"), "test"); - assertEquals(rs.getString("COLUMN_NAME"), "id"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "fn"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "sn"); - assertFalse(rs.next()); - - rs = meta.getColumns(null, null, "doesnotexist", "%"); - assertFalse(rs.next()); - } - - @Test public void columnOrderOfgetTables() throws SQLException { - ResultSet rs = meta.getTables(null, null, null, null); - assertTrue(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 10); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TABLE_NAME"); - assertEquals(rsmeta.getColumnName(4), "TABLE_TYPE"); - assertEquals(rsmeta.getColumnName(5), "REMARKS"); - assertEquals(rsmeta.getColumnName(6), "TYPE_CAT"); - assertEquals(rsmeta.getColumnName(7), "TYPE_SCHEM"); - assertEquals(rsmeta.getColumnName(8), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(9), "SELF_REFERENCING_COL_NAME"); - assertEquals(rsmeta.getColumnName(10), "REF_GENERATION"); - } - - @Test public void columnOrderOfgetTableTypes() throws SQLException { - ResultSet rs = meta.getTableTypes(); - assertTrue(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 1); - assertEquals(rsmeta.getColumnName(1), "TABLE_TYPE"); - } - - @Test public void columnOrderOfgetTypeInfo() throws SQLException { - ResultSet rs = meta.getTypeInfo(); - assertTrue(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 18); - assertEquals(rsmeta.getColumnName(1), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(2), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(3), "PRECISION"); - assertEquals(rsmeta.getColumnName(4), "LITERAL_PREFIX"); - assertEquals(rsmeta.getColumnName(5), "LITERAL_SUFFIX"); - assertEquals(rsmeta.getColumnName(6), "CREATE_PARAMS"); - assertEquals(rsmeta.getColumnName(7), "NULLABLE"); - assertEquals(rsmeta.getColumnName(8), "CASE_SENSITIVE"); - assertEquals(rsmeta.getColumnName(9), "SEARCHABLE"); - assertEquals(rsmeta.getColumnName(10), "UNSIGNED_ATTRIBUTE"); - assertEquals(rsmeta.getColumnName(11), "FIXED_PREC_SCALE"); - assertEquals(rsmeta.getColumnName(12), "AUTO_INCREMENT"); - assertEquals(rsmeta.getColumnName(13), "LOCAL_TYPE_NAME"); - assertEquals(rsmeta.getColumnName(14), "MINIMUM_SCALE"); - assertEquals(rsmeta.getColumnName(15), "MAXIMUM_SCALE"); - assertEquals(rsmeta.getColumnName(16), "SQL_DATA_TYPE"); - assertEquals(rsmeta.getColumnName(17), "SQL_DATETIME_SUB"); - assertEquals(rsmeta.getColumnName(18), "NUM_PREC_RADIX"); - } - - @Test public void columnOrderOfgetColumns() throws SQLException { - ResultSet rs = meta.getColumns(null, null, "test", null); - assertTrue(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 22); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TABLE_NAME"); - assertEquals(rsmeta.getColumnName(4), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(5), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(6), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(7), "COLUMN_SIZE"); - assertEquals(rsmeta.getColumnName(8), "BUFFER_LENGTH"); - assertEquals(rsmeta.getColumnName(9), "DECIMAL_DIGITS"); - assertEquals(rsmeta.getColumnName(10), "NUM_PREC_RADIX"); - assertEquals(rsmeta.getColumnName(11), "NULLABLE"); - assertEquals(rsmeta.getColumnName(12), "REMARKS"); - assertEquals(rsmeta.getColumnName(13), "COLUMN_DEF"); - assertEquals(rsmeta.getColumnName(14), "SQL_DATA_TYPE"); - assertEquals(rsmeta.getColumnName(15), "SQL_DATETIME_SUB"); - assertEquals(rsmeta.getColumnName(16), "CHAR_OCTET_LENGTH"); - assertEquals(rsmeta.getColumnName(17), "ORDINAL_POSITION"); - assertEquals(rsmeta.getColumnName(18), "IS_NULLABLE"); - // should be SCOPE_CATALOG, but misspelt in the standard - assertEquals(rsmeta.getColumnName(19), "SCOPE_CATLOG"); - assertEquals(rsmeta.getColumnName(20), "SCOPE_SCHEMA"); - assertEquals(rsmeta.getColumnName(21), "SCOPE_TABLE"); - assertEquals(rsmeta.getColumnName(22), "SOURCE_DATA_TYPE"); - } - - // the following functions always return an empty resultset, so - // do not bother testing their parameters, only the column types - - @Test public void columnOrderOfgetProcedures() throws SQLException { - ResultSet rs = meta.getProcedures(null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 8); - assertEquals(rsmeta.getColumnName(1), "PROCEDURE_CAT"); - assertEquals(rsmeta.getColumnName(2), "PROCEDURE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "PROCEDURE_NAME"); - // currently (Java 1.5), cols 4,5,6 are undefined - assertEquals(rsmeta.getColumnName(7), "REMARKS"); - assertEquals(rsmeta.getColumnName(8), "PROCEDURE_TYPE"); - } - - @Test public void columnOrderOfgetProcedurColumns() throws SQLException { - ResultSet rs = meta.getProcedureColumns(null, null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 13); - assertEquals(rsmeta.getColumnName(1), "PROCEDURE_CAT"); - assertEquals(rsmeta.getColumnName(2), "PROCEDURE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "PROCEDURE_NAME"); - assertEquals(rsmeta.getColumnName(4), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(5), "COLUMN_TYPE"); - assertEquals(rsmeta.getColumnName(6), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(7), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(8), "PRECISION"); - assertEquals(rsmeta.getColumnName(9), "LENGTH"); - assertEquals(rsmeta.getColumnName(10), "SCALE"); - assertEquals(rsmeta.getColumnName(11), "RADIX"); - assertEquals(rsmeta.getColumnName(12), "NULLABLE"); - assertEquals(rsmeta.getColumnName(13), "REMARKS"); - } - - @Test public void columnOrderOfgetSchemas() throws SQLException { - ResultSet rs = meta.getSchemas(); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 2); - assertEquals(rsmeta.getColumnName(1), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(2), "TABLE_CATALOG"); - } - - @Test public void columnOrderOfgetCatalogs() throws SQLException { - ResultSet rs = meta.getCatalogs(); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 1); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - } - - @Test public void columnOrderOfgetColumnPrivileges() throws SQLException { - ResultSet rs = meta.getColumnPrivileges(null, null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 8); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TABLE_NAME"); - assertEquals(rsmeta.getColumnName(4), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(5), "GRANTOR"); - assertEquals(rsmeta.getColumnName(6), "GRANTEE"); - assertEquals(rsmeta.getColumnName(7), "PRIVILEGE"); - assertEquals(rsmeta.getColumnName(8), "IS_GRANTABLE"); - } - - @Test public void columnOrderOfgetTablePrivileges() throws SQLException { - ResultSet rs = meta.getTablePrivileges(null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 7); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TABLE_NAME"); - assertEquals(rsmeta.getColumnName(4), "GRANTOR"); - assertEquals(rsmeta.getColumnName(5), "GRANTEE"); - assertEquals(rsmeta.getColumnName(6), "PRIVILEGE"); - assertEquals(rsmeta.getColumnName(7), "IS_GRANTABLE"); - } - - @Test public void columnOrderOfgetBestRowIdentifier() throws SQLException { - ResultSet rs = meta.getBestRowIdentifier(null, null, null, 0, false); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 8); - assertEquals(rsmeta.getColumnName(1), "SCOPE"); - assertEquals(rsmeta.getColumnName(2), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(3), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(4), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(5), "COLUMN_SIZE"); - assertEquals(rsmeta.getColumnName(6), "BUFFER_LENGTH"); - assertEquals(rsmeta.getColumnName(7), "DECIMAL_DIGITS"); - assertEquals(rsmeta.getColumnName(8), "PSEUDO_COLUMN"); - } - - @Test public void columnOrderOfgetVersionColumns() throws SQLException { - ResultSet rs = meta.getVersionColumns(null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 8); - assertEquals(rsmeta.getColumnName(1), "SCOPE"); - assertEquals(rsmeta.getColumnName(2), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(3), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(4), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(5), "COLUMN_SIZE"); - assertEquals(rsmeta.getColumnName(6), "BUFFER_LENGTH"); - assertEquals(rsmeta.getColumnName(7), "DECIMAL_DIGITS"); - assertEquals(rsmeta.getColumnName(8), "PSEUDO_COLUMN"); - } - - @Test public void columnOrderOfgetPrimaryKeys() throws SQLException { - ResultSet rs; - ResultSetMetaData rsmeta; - - stat.executeUpdate("create table nopk (c1, c2, c3, c4);"); - stat.executeUpdate("create table pk1 (col1 primary key, col2, col3);"); - stat.executeUpdate("create table pk2 (col1, col2 primary key, col3);"); - stat.executeUpdate("create table pk3 (col1, col2, col3, col4, " - + "primary key (col2, col3));"); - - rs = meta.getPrimaryKeys(null, null, "nopk"); - assertFalse(rs.next()); - rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 6); - assertEquals(rsmeta.getColumnName(1), "TABLE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TABLE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TABLE_NAME"); - assertEquals(rsmeta.getColumnName(4), "COLUMN_NAME"); - assertEquals(rsmeta.getColumnName(5), "KEY_SEQ"); - assertEquals(rsmeta.getColumnName(6), "PK_NAME"); - rs.close(); - - rs = meta.getPrimaryKeys(null, null, "pk1"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "col1"); - assertFalse(rs.next()); - rs.close(); - - rs = meta.getPrimaryKeys(null, null, "pk2"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "col2"); - assertFalse(rs.next()); - rs.close(); - - rs = meta.getPrimaryKeys(null, null, "pk3"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "col2"); - assertTrue(rs.next()); - assertEquals(rs.getString("COLUMN_NAME"), "col3"); - assertFalse(rs.next()); - rs.close(); - } - - /* TODO - @Test public void columnOrderOfgetImportedKeys() throws SQLException { - @Test public void columnOrderOfgetExportedKeys() throws SQLException { - @Test public void columnOrderOfgetCrossReference() throws SQLException { - @Test public void columnOrderOfgetTypeInfo() throws SQLException { - @Test public void columnOrderOfgetIndexInfo() throws SQLException { - @Test public void columnOrderOfgetSuperTypes() throws SQLException { - @Test public void columnOrderOfgetSuperTables() throws SQLException { - @Test public void columnOrderOfgetAttributes() throws SQLException {*/ - - @Test public void columnOrderOfgetUDTs() throws SQLException { - ResultSet rs = meta.getUDTs(null, null, null, null); - assertFalse(rs.next()); - ResultSetMetaData rsmeta = rs.getMetaData(); - assertEquals(rsmeta.getColumnCount(), 7); - assertEquals(rsmeta.getColumnName(1), "TYPE_CAT"); - assertEquals(rsmeta.getColumnName(2), "TYPE_SCHEM"); - assertEquals(rsmeta.getColumnName(3), "TYPE_NAME"); - assertEquals(rsmeta.getColumnName(4), "CLASS_NAME"); - assertEquals(rsmeta.getColumnName(5), "DATA_TYPE"); - assertEquals(rsmeta.getColumnName(6), "REMARKS"); - assertEquals(rsmeta.getColumnName(7), "BASE_TYPE"); - } - - @Test public void version() throws SQLException { - assertNotNull(meta.getDatabaseProductVersion()); - } -} diff --git a/sqlitejdbc/src/test/PrepStmtTest.java b/sqlitejdbc/src/test/PrepStmtTest.java deleted file mode 100644 index 5229da6..0000000 --- a/sqlitejdbc/src/test/PrepStmtTest.java +++ /dev/null @@ -1,487 +0,0 @@ -package test; - -import java.sql.*; -import java.util.StringTokenizer; -import org.junit.*; -import static org.junit.Assert.*; - -/** These tests are designed to stress PreparedStatements on memory dbs. */ -public class PrepStmtTest -{ - static byte[] b1 = new byte[] { 1,2,7,4,2,6,2,8,5,2,3,1,5,3,6,3,3,6,2,5 }; - static byte[] b2 = "To be or not to be.".getBytes(); - static byte[] b3 = "Question!#$%".getBytes(); - static String utf01 = "\uD840\uDC40"; - static String utf02 = "\uD840\uDC47 "; - static String utf03 = " \uD840\uDC43"; - static String utf04 = " \uD840\uDC42 "; - static String utf05 = "\uD840\uDC40\uD840\uDC44"; - static String utf06 = "Hello World, \uD840\uDC40 \uD880\uDC99"; - static String utf07 = "\uD840\uDC41 testing \uD880\uDC99"; - static String utf08 = "\uD840\uDC40\uD840\uDC44 testing"; - - private Connection conn; - private Statement stat; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - conn = DriverManager.getConnection("jdbc:sqlite:"); - stat = conn.createStatement(); - } - - @After public void close() throws SQLException { - stat.close(); - conn.close(); - } - - @Test public void update() throws SQLException { - assertEquals(conn.prepareStatement( - "create table s1 (c1);").executeUpdate(), 0); - PreparedStatement prep = conn.prepareStatement( - "insert into s1 values (?);"); - prep.setInt(1, 3); assertEquals(prep.executeUpdate(), 1); - prep.setInt(1, 5); assertEquals(prep.executeUpdate(), 1); - prep.setInt(1, 7); assertEquals(prep.executeUpdate(), 1); - prep.close(); - - // check results with normal statement - ResultSet rs = stat.executeQuery("select sum(c1) from s1;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 15); - rs.close(); - } - - @Test public void multiUpdate() throws SQLException { - stat.executeUpdate("create table test (c1);"); - PreparedStatement prep = conn.prepareStatement( - "insert into test values (?);"); - - for (int i=0; i < 10; i++) { - prep.setInt(1, i); - prep.executeUpdate(); - prep.execute(); - } - - prep.close(); - stat.executeUpdate("drop table test;"); - } - - @Test public void emptyRS() throws SQLException { - PreparedStatement prep = conn.prepareStatement("select null limit 0;"); - ResultSet rs = prep.executeQuery(); - assertFalse(rs.next()); - rs.close(); - prep.close(); - } - - @Test public void singleRowRS() throws SQLException { - PreparedStatement prep = conn.prepareStatement("select ?;"); - prep.setInt(1, Integer.MAX_VALUE); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), Integer.MAX_VALUE); - assertEquals(rs.getString(1), Integer.toString(Integer.MAX_VALUE)); - assertEquals(rs.getDouble(1), - new Integer(Integer.MAX_VALUE).doubleValue()); - assertFalse(rs.next()); - rs.close(); - prep.close(); - } - - @Test public void twoRowRS() throws SQLException { - PreparedStatement prep = conn.prepareStatement( - "select ? union all select ?;"); - prep.setDouble(1, Double.MAX_VALUE); - prep.setDouble(2, Double.MIN_VALUE); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getDouble(1), Double.MAX_VALUE); - assertTrue(rs.next()); - assertEquals(rs.getDouble(1), Double.MIN_VALUE); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void stringRS() throws SQLException { - String name = "Gandhi"; - PreparedStatement prep = conn.prepareStatement("select ?;"); - prep.setString(1, name); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), name); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void finalizePrep() throws SQLException { - conn.prepareStatement("select null;"); - System.gc(); - } - - @Test public void set() throws SQLException { - ResultSet rs; - PreparedStatement prep = conn.prepareStatement("select ?, ?, ?;"); - - // integers - prep.setInt(1, Integer.MIN_VALUE); - prep.setInt(2, Integer.MAX_VALUE); - prep.setInt(3, 0); - rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), Integer.MIN_VALUE); - assertEquals(rs.getInt(2), Integer.MAX_VALUE); - assertEquals(rs.getInt(3), 0); - - // strings - String name = "Winston Leonard Churchill"; - String fn = name.substring(0, 7), - mn = name.substring(8, 15), - sn = name.substring(16, 25); - prep.clearParameters(); - prep.setString(1, fn); - prep.setString(2, mn); - prep.setString(3, sn); - prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), fn); - assertEquals(rs.getString(2), mn); - assertEquals(rs.getString(3), sn); - - // mixed - prep.setString(1, name); - prep.setString(2, null); - prep.setLong(3, Long.MAX_VALUE); - prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), name); - assertNull(rs.getString(2)); - assertTrue(rs.wasNull()); - assertEquals(rs.getLong(3), Long.MAX_VALUE); - - // bytes - prep.setBytes(1, b1); - prep.setBytes(2, b2); - prep.setBytes(3, b3); - prep.executeQuery(); - assertTrue(rs.next()); - assertArrayEq(rs.getBytes(1), b1); - assertArrayEq(rs.getBytes(2), b2); - assertArrayEq(rs.getBytes(3), b3); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void colNameAccess() throws SQLException { - PreparedStatement prep = conn.prepareStatement( - "select ? as col1, ? as col2, ? as bingo;"); - prep.setNull(1, 0); - prep.setFloat(2, Float.MIN_VALUE); - prep.setShort(3, Short.MIN_VALUE); - prep.executeQuery(); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertNull(rs.getString("col1")); - assertTrue(rs.wasNull()); - assertEquals(rs.getFloat("col2"), Float.MIN_VALUE); - assertEquals(rs.getShort("bingo"), Short.MIN_VALUE); - rs.close(); - prep.close(); - } - - @Test public void insert1000() throws SQLException { - stat.executeUpdate("create table in1000 (a);"); - PreparedStatement prep = conn.prepareStatement( - "insert into in1000 values (?);"); - conn.setAutoCommit(false); - for (int i=0; i < 1000; i++) { - prep.setInt(1, i); - prep.executeUpdate(); - } - conn.commit(); - - ResultSet rs = stat.executeQuery("select count(a) from in1000;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 1000); - rs.close(); - } - - @Ignore - @Test public void getObject() throws SQLException { - stat.executeUpdate("create table testobj (" - + "c1 integer, c2 float, c3, c4 varchar, c5 bit, c6, c7);"); - PreparedStatement prep = conn.prepareStatement( - "insert into testobj values (?,?,?,?,?,?,?);"); - - prep.setInt (1, Integer.MAX_VALUE); - prep.setFloat (2, Float.MAX_VALUE); - prep.setDouble (3, Double.MAX_VALUE); - prep.setLong (4, Long.MAX_VALUE); - prep.setBoolean(5, false); - prep.setByte (6, (byte)7); - prep.setBytes (7, b1); - prep.executeUpdate(); - - ResultSet rs = stat.executeQuery( - "select c1,c2,c3,c4,c5,c6,c7 from testobj;"); - assertTrue(rs.next()); - - assertEquals(rs.getInt(1), Integer.MAX_VALUE); - assertEquals((int)rs.getLong(1), Integer.MAX_VALUE); - assertEquals(rs.getFloat(2), Float.MAX_VALUE); - assertEquals(rs.getDouble(3), Double.MAX_VALUE); - assertEquals(rs.getLong(4), Long.MAX_VALUE); - assertFalse(rs.getBoolean(5)); - assertEquals(rs.getByte(6), (byte)7); - assertArrayEq(rs.getBytes(7), b1); - - assertNotNull(rs.getObject(1)); - assertNotNull(rs.getObject(2)); - assertNotNull(rs.getObject(3)); - assertNotNull(rs.getObject(4)); - assertNotNull(rs.getObject(5)); - assertNotNull(rs.getObject(6)); - assertNotNull(rs.getObject(7)); - assertTrue(rs.getObject(1) instanceof Integer); - assertTrue(rs.getObject(2) instanceof Double); - assertTrue(rs.getObject(3) instanceof Double); - assertTrue(rs.getObject(4) instanceof String); - assertTrue(rs.getObject(5) instanceof Integer); - assertTrue(rs.getObject(6) instanceof Integer); - assertTrue(rs.getObject(7) instanceof byte[]); - rs.close(); - } - - @Test public void tokens() throws SQLException { - /* checks for a bug where a substring is read by the driver as the - * full original string, caused by my idiocyin assuming the - * pascal-style string was null terminated. Thanks Oliver Randschau. */ - StringTokenizer st = new StringTokenizer("one two three"); - st.nextToken(); - String substr = st.nextToken(); - - PreparedStatement prep = conn.prepareStatement("select ?;"); - prep.setString(1, substr); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), substr); - } - - @Test public void utf() throws SQLException { - ResultSet rs = stat.executeQuery("select '" - +utf01+"','"+utf02+"','"+utf03+"','"+utf04+"','" - +utf05+"','"+utf06+"','"+utf07+"','"+utf08+"';"); - assertEquals(rs.getString(1), utf01); - assertEquals(rs.getString(2), utf02); - assertEquals(rs.getString(3), utf03); - assertEquals(rs.getString(4), utf04); - assertEquals(rs.getString(5), utf05); - assertEquals(rs.getString(6), utf06); - assertEquals(rs.getString(7), utf07); - assertEquals(rs.getString(8), utf08); - rs.close(); - - PreparedStatement prep = conn.prepareStatement( - "select ?,?,?,?,?,?,?,?;"); - prep.setString(1, utf01); prep.setString(2, utf02); - prep.setString(3, utf03); prep.setString(4, utf04); - prep.setString(5, utf05); prep.setString(6, utf06); - prep.setString(7, utf07); prep.setString(8, utf08); - rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), utf01); - assertEquals(rs.getString(2), utf02); - assertEquals(rs.getString(3), utf03); - assertEquals(rs.getString(4), utf04); - assertEquals(rs.getString(5), utf05); - assertEquals(rs.getString(6), utf06); - assertEquals(rs.getString(7), utf07); - assertEquals(rs.getString(8), utf08); - rs.close(); - } - - @Test public void batch() throws SQLException { - ResultSet rs; - - stat.executeUpdate("create table test (c1, c2, c3, c4);"); - PreparedStatement prep = conn.prepareStatement( - "insert into test values (?,?,?,?);"); - for (int i=0; i < 10; i++) { - prep.setInt(1, Integer.MIN_VALUE + i); - prep.setFloat(2, Float.MIN_VALUE + i); - prep.setString(3, "Hello " + i); - prep.setDouble(4, Double.MAX_VALUE + i); - prep.addBatch(); - } - assertArrayEq(prep.executeBatch(), new int[] { 1,1,1,1,1,1,1,1,1,1 }); - prep.close(); - - rs = stat.executeQuery("select * from test;"); - for (int i=0; i < 10; i++) { - assertTrue(rs.next()); - assertEquals(rs.getInt(1), Integer.MIN_VALUE + i); - assertEquals(rs.getFloat(2), Float.MIN_VALUE + i); - assertEquals(rs.getString(3), "Hello " + i); - assertEquals(rs.getDouble(4), Double.MAX_VALUE + i); - } - rs.close(); - stat.executeUpdate("drop table test;"); - } - - @Test public void dblock() throws SQLException { - stat.executeUpdate("create table test (c1);"); - stat.executeUpdate("insert into test values (1);"); - conn.prepareStatement("select * from test;").executeQuery().close(); - stat.executeUpdate("drop table test;"); - - } - - @Test public void dbclose() throws SQLException { - conn.prepareStatement("select ?;").setString(1, "Hello World"); - conn.prepareStatement("select null;").close(); - conn.prepareStatement("select null;").executeQuery().close(); - conn.prepareStatement("create table t (c);").executeUpdate(); - conn.prepareStatement("select null;"); - } - - @Test public void batchOneParam() throws SQLException { - stat.executeUpdate("create table test (c1);"); - PreparedStatement prep = conn.prepareStatement( - "insert into test values (?);"); - for (int i=0; i < 10; i++) { - prep.setInt(1, Integer.MIN_VALUE + i); - prep.addBatch(); - } - assertArrayEq(prep.executeBatch(), new int[] { 1,1,1,1,1,1,1,1,1,1 }); - prep.close(); - ResultSet rs = stat.executeQuery("select count(*) from test;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 10); - rs.close(); - } - - @Test public void paramMetaData() throws SQLException { - PreparedStatement prep = conn.prepareStatement("select ?,?,?,?;"); - assertEquals(prep.getParameterMetaData().getParameterCount(), 4); - } - - @Test public void metaData() throws SQLException { - PreparedStatement prep = conn.prepareStatement( - "select ? as col1, ? as col2, ? as delta;"); - ResultSetMetaData meta = prep.getMetaData(); - assertEquals(meta.getColumnCount(), 3); - assertEquals(meta.getColumnName(1), "col1"); - assertEquals(meta.getColumnName(2), "col2"); - assertEquals(meta.getColumnName(3), "delta"); - /*assertEquals(meta.getColumnType(1), Types.INTEGER); - assertEquals(meta.getColumnType(2), Types.INTEGER); - assertEquals(meta.getColumnType(3), Types.INTEGER);*/ - - meta = prep.executeQuery().getMetaData(); - assertEquals(meta.getColumnCount(), 3); - prep.close(); - } - - @Test public void date1() throws SQLException { - Date d1 = new Date(987654321); - - stat.execute("create table t (c1);"); - PreparedStatement prep = conn.prepareStatement( - "insert into t values(?);"); - prep.setDate(1, d1); - prep.executeUpdate(); - - ResultSet rs = stat.executeQuery("select c1 from t;"); - assertTrue(rs.next()); - assertEquals(rs.getLong(1), d1.getTime()); - assertTrue(rs.getDate(1).equals(d1)); - rs.close(); - } - - @Test public void date2() throws SQLException { - Date d1 = new Date(1092941466000L); - stat.execute("create table t (c1);"); - PreparedStatement prep = conn.prepareStatement( - "insert into t values (datetime(?/1000, 'unixepoch'));"); - prep.setDate(1, d1); - prep.executeUpdate(); - - ResultSet rs = stat.executeQuery( - "select strftime('%s', c1) * 1000 from t;"); - assertTrue(rs.next()); - assertEquals(rs.getLong(1), d1.getTime()); - assertTrue(rs.getDate(1).equals(d1)); - } - - @Test public void changeSchema() throws SQLException { - stat.execute("create table t (c1);"); - PreparedStatement prep = conn.prepareStatement( - "insert into t values (?);"); - conn.createStatement().execute("create table t2 (c2);"); - prep.setInt(1, 1000); - prep.execute(); - prep.executeUpdate(); - } - - @Test public void reusingSetValues() throws SQLException { - PreparedStatement prep = conn.prepareStatement("select ?,?;"); - prep.setInt(1, 9); - - for (int i=0; i < 10; i++) { - prep.setInt(2, i); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 9); - assertEquals(rs.getInt(2), i); - } - - for (int i=0; i < 10; i++) { - prep.setInt(2, i); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 9); - assertEquals(rs.getInt(2), i); - rs.close(); - } - - prep.close(); - } - - @Test(expected= SQLException.class) - public void noSuchTable() throws SQLException { - PreparedStatement prep = - conn.prepareStatement("select * from doesnotexist;"); - prep.executeQuery(); - } - - @Test(expected= SQLException.class) - public void noSuchCol() throws SQLException { - PreparedStatement prep = - conn.prepareStatement("select notacol from (select 1);"); - prep.executeQuery(); - } - - @Test(expected= SQLException.class) - public void noSuchColName() throws SQLException { - ResultSet rs = conn.prepareStatement("select 1;").executeQuery(); - assertTrue(rs.next()); - rs.getInt("noSuchColName"); - } - - private void assertArrayEq(byte[] a, byte[] b) { - assertNotNull(a); - assertNotNull(b); - assertEquals(a.length, b.length); - for (int i=0; i < a.length; i++) - assertEquals(a[i], b[i]); - } - private void assertArrayEq(int[] a, int[] b) { - assertNotNull(a); - assertNotNull(b); - assertEquals(a.length, b.length); - for (int i=0; i < a.length; i++) - assertEquals(a[i], b[i]); - } -} diff --git a/sqlitejdbc/src/test/RSMetaDataTest.java b/sqlitejdbc/src/test/RSMetaDataTest.java deleted file mode 100644 index 8ff621c..0000000 --- a/sqlitejdbc/src/test/RSMetaDataTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package test; - -import java.sql.*; -import org.junit.*; -import static org.junit.Assert.*; - -public class RSMetaDataTest -{ - private Connection conn; - private Statement stat; - private ResultSetMetaData meta; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - conn = DriverManager.getConnection("jdbc:sqlite:"); - stat = conn.createStatement(); - stat.executeUpdate( - "create table People (pid integer primary key autoincrement, " - + " firstname string, surname string, dob date);"); - stat.executeUpdate( - "insert into people values (null, 'Mohandas', 'Gandhi', " - + " '1869-10-02');"); - meta = stat.executeQuery( - "select pid, firstname, surname from people;").getMetaData(); - } - - @After public void close() throws SQLException { - stat.executeUpdate("drop table people;"); - stat.close(); - conn.close(); - } - - @Test public void catalogName() throws SQLException { - assertEquals(meta.getCatalogName(1), "People"); - } - - @Test public void columns() throws SQLException { - assertEquals(meta.getColumnCount(), 3); - assertEquals(meta.getColumnName(1), "pid"); - assertEquals(meta.getColumnName(2), "firstname"); - assertEquals(meta.getColumnName(3), "surname"); - assertEquals(meta.getColumnType(1), Types.INTEGER); - assertEquals(meta.getColumnType(2), Types.VARCHAR); - assertEquals(meta.getColumnType(3), Types.VARCHAR); - assertTrue(meta.isAutoIncrement(1)); - assertFalse(meta.isAutoIncrement(2)); - assertFalse(meta.isAutoIncrement(3)); - assertEquals(meta.isNullable(1), meta.columnNoNulls); - assertEquals(meta.isNullable(2), meta.columnNullable); - assertEquals(meta.isNullable(3), meta.columnNullable); - } - - @Test public void differentRS() throws SQLException { - meta = stat.executeQuery("select * from people;").getMetaData(); - assertEquals(meta.getColumnCount(), 4); - assertEquals(meta.getColumnName(1), "pid"); - assertEquals(meta.getColumnName(2), "firstname"); - assertEquals(meta.getColumnName(3), "surname"); - assertEquals(meta.getColumnName(4), "dob"); - } - - @Test public void nullable() throws SQLException { - meta = stat.executeQuery("select null;").getMetaData(); - assertEquals(meta.isNullable(1), ResultSetMetaData.columnNullable); - } - - @Test(expected= SQLException.class) - public void badCatalogIndex() throws SQLException { meta.getCatalogName(4);} - - @Test(expected= SQLException.class) - public void badColumnIndex() throws SQLException { meta.getColumnName(4); } - -} diff --git a/sqlitejdbc/src/test/StatementTest.java b/sqlitejdbc/src/test/StatementTest.java deleted file mode 100644 index 3dd000d..0000000 --- a/sqlitejdbc/src/test/StatementTest.java +++ /dev/null @@ -1,305 +0,0 @@ -package test; - -import java.sql.*; -import org.junit.*; -import static org.junit.Assert.*; - -/** These tests are designed to stress Statements on memory databases. */ -public class StatementTest -{ - private Connection conn; - private Statement stat; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - conn = DriverManager.getConnection("jdbc:sqlite:"); - stat = conn.createStatement(); - } - - @After public void close() throws SQLException { - stat.close(); - conn.close(); - } - - @Test public void stmtUpdate() throws SQLException { - assertEquals(stat.executeUpdate("create table s1 (c1);"), 0); - assertEquals(stat.executeUpdate("insert into s1 values (0);"), 1); - assertEquals(stat.executeUpdate("insert into s1 values (1);"), 1); - assertEquals(stat.executeUpdate("insert into s1 values (2);"), 1); - assertEquals(stat.executeUpdate("update s1 set c1 = 5;"), 3); - assertEquals(stat.executeUpdate("delete from s1;"), 0); - assertEquals(stat.executeUpdate("drop table s1;"), 0); - } - - @Test public void emptyRS() throws SQLException { - ResultSet rs = stat.executeQuery("select null limit 0;"); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void singleRowRS() throws SQLException { - ResultSet rs = stat.executeQuery("select " + Integer.MAX_VALUE + ";"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), Integer.MAX_VALUE); - assertEquals(rs.getString(1), Integer.toString(Integer.MAX_VALUE)); - assertEquals(rs.getDouble(1), - new Integer(Integer.MAX_VALUE).doubleValue()); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void twoRowRS() throws SQLException { - ResultSet rs = stat.executeQuery("select 9 union all select 7;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 9); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 7); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void autoClose() throws SQLException { - conn.createStatement().executeQuery("select 1;"); - } - - @Test public void stringRS() throws SQLException { - ResultSet rs = stat.executeQuery("select \"Russell\";"); - assertTrue(rs.next()); - assertEquals(rs.getString(1), "Russell"); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void execute() throws SQLException { - assertTrue(stat.execute("select null;")); - ResultSet rs = stat.getResultSet(); - assertNotNull(rs); - assertTrue(rs.next()); - assertNull(rs.getString(1)); - assertTrue(rs.wasNull()); - assertFalse(stat.getMoreResults()); - assertEquals(stat.getUpdateCount(), -1); - - assertTrue(stat.execute("select null;")); - assertFalse(stat.getMoreResults()); - assertEquals(stat.getUpdateCount(), -1); - - assertFalse(stat.execute("create table test (c1);")); - assertEquals(stat.getUpdateCount(), 0); - assertFalse(stat.getMoreResults()); - assertEquals(stat.getUpdateCount(), -1); - } - - @Test public void colNameAccess() throws SQLException { - assertEquals(stat.executeUpdate( - "create table tab (id, firstname, surname);"), 0); - assertEquals(stat.executeUpdate( - "insert into tab values (0, 'Bob', 'Builder');"), 1); - assertEquals(stat.executeUpdate( - "insert into tab values (1, 'Fred', 'Blogs');"), 1); - assertEquals(stat.executeUpdate( - "insert into tab values (2, 'John', 'Smith');"), 1); - ResultSet rs = stat.executeQuery("select * from tab;"); - assertTrue(rs.next()); - assertEquals(rs.getInt("id"), 0); - assertEquals(rs.getString("firstname"), "Bob"); - assertEquals(rs.getString("surname"), "Builder"); - assertTrue(rs.next()); - assertEquals(rs.getInt("id"), 1); - assertEquals(rs.getString("firstname"), "Fred"); - assertEquals(rs.getString("surname"), "Blogs"); - assertTrue(rs.next()); - assertEquals(rs.getInt("id"), 2); - assertEquals( rs.getString("id"), "2"); - assertEquals(rs.getString("firstname"), "John"); - assertEquals(rs.getString("surname"), "Smith"); - assertFalse(rs.next()); - rs.close(); - assertEquals(stat.executeUpdate("drop table tab;"), 1); - } - - @Test public void nulls() throws SQLException { - ResultSet rs = stat.executeQuery("select null union all select null;"); - assertTrue(rs.next()); - assertNull(rs.getString(1)); - assertTrue(rs.wasNull()); - assertTrue(rs.next()); - assertNull(rs.getString(1)); - assertTrue(rs.wasNull()); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void tempTable() throws SQLException { - assertEquals(stat.executeUpdate("create temp table myTemp (a);"), 0); - assertEquals(stat.executeUpdate("insert into myTemp values (2);"), 1); - } - - @Test public void insert1000() throws SQLException { - assertEquals(stat.executeUpdate("create table in1000 (a);"), 0); - conn.setAutoCommit(false); - for (int i=0; i < 1000; i++) - assertEquals(stat.executeUpdate( - "insert into in1000 values ("+i+");"), 1); - conn.commit(); - - ResultSet rs = stat.executeQuery("select count(a) from in1000;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 1000); - rs.close(); - - assertEquals(stat.executeUpdate("drop table in1000;"), 1); - } - - private void assertArrayEq(int[] a, int[] b) { - assertNotNull(a); - assertNotNull(b); - assertEquals(a.length, b.length); - for (int i=0; i < a.length; i++) - assertEquals(a[i], b[i]); - } - - @Test public void batch() throws SQLException { - stat.addBatch("create table batch (c1);"); - stat.addBatch("insert into batch values (1);"); - stat.addBatch("insert into batch values (1);"); - stat.addBatch("insert into batch values (2);"); - stat.addBatch("insert into batch values (3);"); - stat.addBatch("insert into batch values (4);"); - assertArrayEq(new int[] { 0, 1, 1, 1, 1, 1 }, stat.executeBatch()); - assertArrayEq(new int[] { }, stat.executeBatch()); - stat.clearBatch(); - stat.addBatch("insert into batch values (9);"); - assertArrayEq(new int[] { 1 }, stat.executeBatch()); - assertArrayEq(new int[] {}, stat.executeBatch()); - stat.clearBatch(); - stat.addBatch("insert into batch values (7);"); - stat.addBatch("insert into batch values (7);"); - assertArrayEq(new int[] { 1, 1 }, stat.executeBatch()); - stat.clearBatch(); - - ResultSet rs = stat.executeQuery("select count(*) from batch;"); - assertTrue(rs.next()); - assertEquals(8, rs.getInt(1)); - rs.close(); - } - - @Test public void closeOnFalseNext() throws SQLException { - stat.executeUpdate("create table t1 (c1);"); - conn.createStatement().executeQuery("select * from t1;").next(); - stat.executeUpdate("drop table t1;"); - } - - @Test public void getGeneratedKeys() throws SQLException { - ResultSet rs; - stat.executeUpdate("create table t1 (c1 integer primary key, v);"); - stat.executeUpdate("insert into t1 (v) values ('red');"); - rs = stat.getGeneratedKeys(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 1); - rs.close(); - stat.executeUpdate("insert into t1 (v) values ('blue');"); - rs = stat.getGeneratedKeys(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 2); - rs.close(); - } - - @Test public void isBeforeFirst() throws SQLException { - ResultSet rs = stat.executeQuery("select 1 union all select 2;"); - assertTrue(rs.isBeforeFirst()); - assertTrue(rs.next()); - assertTrue(rs.isFirst()); - assertEquals(rs.getInt(1), 1); - assertTrue(rs.next()); - assertFalse(rs.isBeforeFirst()); - assertFalse(rs.isFirst()); - assertEquals(rs.getInt(1), 2); - assertFalse(rs.next()); - assertFalse(rs.isBeforeFirst()); - rs.close(); - } - - @Test public void columnNaming() throws SQLException { - stat.executeUpdate("create table t1 (c1 integer);"); - stat.executeUpdate("create table t2 (c1 integer);"); - stat.executeUpdate("insert into t1 values (1);"); - stat.executeUpdate("insert into t2 values (1);"); - ResultSet rs = stat.executeQuery( - "select a.c1 AS c1 from t1 a, t2 where a.c1=t2.c1;"); - assertTrue(rs.next()); - assertEquals(rs.getInt("c1"), 1); - rs.close(); - } - - @Test public void nullDate() throws SQLException { - ResultSet rs = stat.executeQuery("select null;"); - assertTrue(rs.next()); - assertEquals(rs.getDate(1), null); - assertEquals(rs.getTime(1), null); - rs.close(); - } - - @Ignore - @Test(expected= SQLException.class) - public void ambiguousColumnNaming() throws SQLException { - stat.executeUpdate("create table t1 (c1 int);"); - stat.executeUpdate("create table t2 (c1 int, c2 int);"); - stat.executeUpdate("insert into t1 values (1);"); - stat.executeUpdate("insert into t2 values (2, 1);"); - ResultSet rs = stat.executeQuery( - "select a.c1, b.c1 from t1 a, t2 b where a.c1=b.c2;"); - assertTrue(rs.next()); - assertEquals(rs.getInt("c1"), 1); - rs.close(); - } - - @Test(expected= SQLException.class) - public void failToDropWhenRSOpen() throws SQLException { - stat.executeUpdate("create table t1 (c1);"); - stat.executeUpdate("insert into t1 values (4);"); - stat.executeUpdate("insert into t1 values (4);"); - conn.createStatement().executeQuery("select * from t1;").next(); - stat.executeUpdate("drop table t1;"); - } - - @Test(expected= SQLException.class) - public void executeNoRS() throws SQLException { - assertFalse(stat.execute("insert into test values (8);")); - stat.getResultSet(); - } - - @Test(expected= SQLException.class) - public void executeClearRS() throws SQLException { - assertTrue(stat.execute("select null;")); - assertNotNull(stat.getResultSet()); - assertFalse(stat.getMoreResults()); - stat.getResultSet(); - } - - @Test(expected= BatchUpdateException.class) - public void batchReturnsResults() throws SQLException { - stat.addBatch("select null;"); - stat.executeBatch(); - } - - @Test(expected= SQLException.class) - public void noSuchTable() throws SQLException { - stat.executeQuery("select * from doesnotexist;"); - } - - @Test(expected= SQLException.class) - public void noSuchCol() throws SQLException { - stat.executeQuery("select notacol from (select 1);"); - } - - @Test(expected= SQLException.class) - public void noSuchColName() throws SQLException { - ResultSet rs = stat.executeQuery("select 1;"); - assertTrue(rs.next()); - rs.getInt("noSuchColName"); - } -} diff --git a/sqlitejdbc/src/test/TransactionTest.java b/sqlitejdbc/src/test/TransactionTest.java deleted file mode 100644 index 6ca5019..0000000 --- a/sqlitejdbc/src/test/TransactionTest.java +++ /dev/null @@ -1,224 +0,0 @@ -package test; - -import java.io.File; -import java.sql.*; -import org.junit.*; -import static org.junit.Assert.*; - -/** These tests assume that Statements and PreparedStatements are working - * as per normal and test the interactions of commit(), rollback() and - * setAutoCommit(boolean) with multiple connections to the same db. */ -public class TransactionTest -{ - private Connection conn1, conn2, conn3; - private Statement stat1, stat2, stat3; - - boolean done = false; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - new File("test-trans.db").delete(); - conn1 = DriverManager.getConnection("jdbc:sqlite:test-trans.db"); - conn2 = DriverManager.getConnection("jdbc:sqlite:test-trans.db"); - conn3 = DriverManager.getConnection("jdbc:sqlite:test-trans.db"); - stat1 = conn1.createStatement(); - stat2 = conn2.createStatement(); - stat3 = conn3.createStatement(); - } - - @After public void close() throws Exception { - stat1.close(); stat2.close(); stat3.close(); - conn1.close(); conn2.close(); conn3.close(); - new File("test-trans.db").delete(); - } - - @Test public void multiConn() throws SQLException { - stat1.executeUpdate("create table test (c1);"); - stat1.executeUpdate("insert into test values (1);"); - stat2.executeUpdate("insert into test values (2);"); - stat3.executeUpdate("insert into test values (3);"); - - ResultSet rs = stat1.executeQuery("select sum(c1) from test;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 6); - rs.close(); - - rs = stat3.executeQuery("select sum(c1) from test;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 6); - rs.close(); - } - - @Test public void locking() throws SQLException { - stat1.executeUpdate("create table test (c1);"); - stat1.executeUpdate("begin immediate;"); - stat2.executeUpdate("select * from test;"); - } - - @Test public void insert() throws SQLException { - ResultSet rs; - String countSql = "select count(*) from trans;"; - - stat1.executeUpdate("create table trans (c1);"); - conn1.setAutoCommit(false); - - assertEquals(1, stat1.executeUpdate("insert into trans values (4);")); - - // transaction not yet commited, conn1 can see, conn2 can not - rs = stat1.executeQuery(countSql); - assertTrue(rs.next()); - assertEquals(1, rs.getInt(1)); - rs.close(); - rs = stat2.executeQuery(countSql); - assertTrue(rs.next()); - assertEquals(0, rs.getInt(1)); - rs.close(); - - conn1.commit(); - - // all connects can see data - rs = stat2.executeQuery(countSql); - assertTrue(rs.next()); - assertEquals(1, rs.getInt(1)); - rs.close(); - } - - @Test public void rollback() throws SQLException { - String select = "select * from trans;"; - ResultSet rs; - - stat1.executeUpdate("create table trans (c1);"); - conn1.setAutoCommit(false); - stat1.executeUpdate("insert into trans values (3);"); - - rs = stat1.executeQuery(select); - assertTrue(rs.next()); - rs.close(); - - conn1.rollback(); - - rs = stat1.executeQuery(select); - assertFalse(rs.next()); - rs.close(); - } - - @Test public void multiRollback() throws SQLException { - ResultSet rs; - - stat1.executeUpdate("create table t (c1);"); - conn1.setAutoCommit(false); - stat1.executeUpdate("insert into t values (1);"); - conn1.commit(); - stat1.executeUpdate("insert into t values (1);"); - conn1.rollback(); - stat1.addBatch("insert into t values (2);"); - stat1.addBatch("insert into t values (3);"); - stat1.executeBatch(); - conn1.commit(); - stat1.addBatch("insert into t values (7);"); - stat1.executeBatch(); - conn1.rollback(); - stat1.executeUpdate("insert into t values (4);"); - conn1.setAutoCommit(true); - stat1.executeUpdate("insert into t values (5);"); - conn1.setAutoCommit(false); - PreparedStatement p = conn1.prepareStatement( - "insert into t values (?);"); - p.setInt(1, 6); - p.executeUpdate(); - p.setInt(1, 7); - p.executeUpdate(); - - // conn1 can see (1+...+7), conn2 can see (1+...+5) - rs = stat1.executeQuery("select sum(c1) from t;"); - assertTrue(rs.next()); - assertEquals(1+2+3+4+5+6+7, rs.getInt(1)); - rs.close(); - rs = stat2.executeQuery("select sum(c1) from t;"); - assertTrue(rs.next()); - assertEquals(1+2+3+4+5, rs.getInt(1)); - rs.close(); - } - - @Test - public void transactionsDontMindReads() throws SQLException { - stat1.executeUpdate("create table t (c1);"); - stat1.executeUpdate("insert into t values (1);"); - stat1.executeUpdate("insert into t values (2);"); - ResultSet rs = stat1.executeQuery("select * from t;"); - assertTrue(rs.next()); // select is open - - conn2.setAutoCommit(false); - stat1.executeUpdate("insert into t values (2);"); - - rs.close(); - conn2.commit(); - } - - @Test - public void secondConnWillWait() throws Exception { - stat1.executeUpdate("create table t (c1);"); - stat1.executeUpdate("insert into t values (1);"); - stat1.executeUpdate("insert into t values (2);"); - ResultSet rs = stat1.executeQuery("select * from t;"); - assertTrue(rs.next()); - - final TransactionTest lock = this; - lock.done = false; - new Thread() { public void run() { - try { - stat2.executeUpdate("insert into t values (3);"); - } catch (SQLException e) { - e.printStackTrace(); - return; - } - - synchronized (lock) { - lock.done = true; - lock.notify(); - } - } }.start(); - - Thread.sleep(100); - rs.close(); - - synchronized (lock) { - lock.wait(5000); - if (!lock.done) - throw new Exception("should be done"); - } - } - - @Test(expected= SQLException.class) - public void secondConnMustTimeout() throws SQLException { - stat1.setQueryTimeout(1); - stat1.executeUpdate("create table t (c1);"); - stat1.executeUpdate("insert into t values (1);"); - stat1.executeUpdate("insert into t values (2);"); - ResultSet rs = stat1.executeQuery("select * from t;"); - assertTrue(rs.next()); - - stat2.executeUpdate("insert into t values (3);"); // can't be done - } - - @Test(expected= SQLException.class) - public void cantUpdateWhileReading() throws SQLException { - stat1.executeUpdate("create table t (c1);"); - stat1.executeUpdate("insert into t values (1);"); - stat1.executeUpdate("insert into t values (2);"); - ResultSet rs = conn1.createStatement().executeQuery("select * from t;"); - assertTrue(rs.next()); - - stat1.executeUpdate("insert into t values (3);"); // can't be done - } - - @Test(expected= SQLException.class) - public void cantCommit() throws SQLException { conn1.commit(); } - - @Test(expected= SQLException.class) - public void cantRollback() throws SQLException { conn1.rollback(); } - -} diff --git a/sqlitejdbc/src/test/UDFTest.java b/sqlitejdbc/src/test/UDFTest.java deleted file mode 100644 index 18a3245..0000000 --- a/sqlitejdbc/src/test/UDFTest.java +++ /dev/null @@ -1,313 +0,0 @@ -package test; - -import java.io.File; -import java.sql.*; -import java.util.*; -import org.sqlite.Function; -import org.junit.*; -import static org.junit.Assert.*; - -/** Tests User Defined Functions. */ -public class UDFTest -{ - private static int val = 0; - private static byte[] b1 = new byte[] { 2, 5, -4, 8, -1, 3, -5 }; - private static int gotTrigger = 0; - - private Connection conn; - private Statement stat; - - @BeforeClass public static void forName() throws Exception { - Class.forName("org.sqlite.JDBC"); - } - - @Before public void connect() throws Exception { - conn = DriverManager.getConnection("jdbc:sqlite:"); - stat = conn.createStatement(); - } - - @After public void close() throws SQLException { - stat.close(); - conn.close(); - } - - @Test public void calling() throws SQLException { - Function.create(conn, "f1", new Function() { - public void xFunc() throws SQLException { val = 4; } - }); - stat.executeQuery("select f1();").close(); - assertEquals(val, 4); - } - - @Test public void returning() throws SQLException { - Function.create(conn, "f2", new Function() { - public void xFunc() throws SQLException { result(4); } - }); - ResultSet rs = stat.executeQuery("select f2();"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 4); - rs.close(); - - for (int i=0; i < 20; i++) { - rs = stat.executeQuery("select (f2() + " + i + ");"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 4 + i); - rs.close(); - } - } - - @Test public void accessArgs() throws SQLException { - Function.create(conn, "f3", new Function() { - public void xFunc() throws SQLException { result(value_int(0)); } - }); - for (int i=0; i < 15; i++) { - ResultSet rs = stat.executeQuery("select f3("+i+");"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), i); - rs.close(); - } - } - - @Test public void multipleArgs() throws SQLException { - Function.create(conn, "f4", new Function() { - public void xFunc() throws SQLException { - int ret = 0; - for (int i=0; i < args(); i++) ret += value_int(i); - result(ret); - } - }); - ResultSet rs = stat.executeQuery("select f4(2, 3, 9, -5);"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 9); - rs.close(); - rs = stat.executeQuery("select f4(2);"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 2); - rs.close(); - rs = stat.executeQuery("select f4(-3, -4, -5);"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), -12); - } - - @Test public void returnTypes() throws SQLException { - Function.create(conn, "f5", new Function() { - public void xFunc() throws SQLException { result("Hello World"); } - }); - ResultSet rs = stat.executeQuery("select f5();"); - assertTrue(rs.next()); - assertEquals(rs.getString(1), "Hello World"); - - Function.create(conn, "f6", new Function() { - public void xFunc() throws SQLException { result(Long.MAX_VALUE); } - }); - rs.close(); rs = stat.executeQuery("select f6();"); - assertTrue(rs.next()); - assertEquals(rs.getLong(1), Long.MAX_VALUE); - - Function.create(conn, "f7", new Function() { - public void xFunc() throws SQLException {result(Double.MAX_VALUE);} - }); - rs.close(); rs = stat.executeQuery("select f7();"); - assertTrue(rs.next()); - assertEquals(rs.getDouble(1), Double.MAX_VALUE); - - Function.create(conn, "f8", new Function() { - public void xFunc() throws SQLException { result(b1); } - }); - rs.close(); rs = stat.executeQuery("select f8();"); - assertTrue(rs.next()); - assertArrayEq(rs.getBytes(1), b1); - } - - @Test public void returnArgInt() throws SQLException { - Function.create(conn, "farg_int", new Function() { - public void xFunc() throws SQLException { result(value_int(0)); } - }); - PreparedStatement prep = conn.prepareStatement("select farg_int(?);"); - prep.setInt(1, Integer.MAX_VALUE); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), Integer.MAX_VALUE); - prep.close(); - } - - @Test public void returnArgLong() throws SQLException { - Function.create(conn, "farg_long", new Function() { - public void xFunc() throws SQLException { result(value_long(0)); } - }); - PreparedStatement prep = conn.prepareStatement("select farg_long(?);"); - prep.setLong(1, Long.MAX_VALUE); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getLong(1), Long.MAX_VALUE); - prep.close(); - } - - @Test public void returnArgDouble() throws SQLException { - Function.create(conn, "farg_doub", new Function() { - public void xFunc() throws SQLException { result(value_double(0)); } - }); - PreparedStatement prep = conn.prepareStatement("select farg_doub(?);"); - prep.setDouble(1, Double.MAX_VALUE); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getDouble(1), Double.MAX_VALUE); - prep.close(); - } - - @Test public void returnArgBlob() throws SQLException { - Function.create(conn, "farg_blob", new Function() { - public void xFunc() throws SQLException { result(value_blob(0)); } - }); - PreparedStatement prep = conn.prepareStatement("select farg_blob(?);"); - prep.setBytes(1, b1); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertArrayEq(rs.getBytes(1), b1); - prep.close(); - } - - @Test public void returnArgString() throws SQLException { - Function.create(conn, "farg_str", new Function() { - public void xFunc() throws SQLException { result(value_text(0)); } - }); - PreparedStatement prep = conn.prepareStatement("select farg_str(?);"); - prep.setString(1, "Hello"); - ResultSet rs = prep.executeQuery(); - assertTrue(rs.next()); - assertEquals(rs.getString(1), "Hello"); - prep.close(); - } - - @Test(expected= SQLException.class) - public void customErr() throws SQLException { - Function.create(conn, "f9", new Function() { - public void xFunc() throws SQLException { - throw new SQLException("myErr"); } - }); - stat.executeQuery("select f9();"); - } - - @Test public void trigger() throws SQLException { - Function.create(conn, "inform", new Function() { - protected void xFunc() throws SQLException { - gotTrigger = value_int(0); } - }); - stat.executeUpdate("create table trigtest (c1);"); - stat.executeUpdate( - "create trigger trigt after insert on trigtest" - + " begin select inform(new.c1); end;" - ); - stat.executeUpdate("insert into trigtest values (5);"); - assertEquals(gotTrigger, 5); - } - - @Test public void aggregate() throws SQLException { - Function.create(conn, "mySum", new Function.Aggregate() { - private int val = 0; - protected void xStep() throws SQLException { - for (int i=0; i < args(); i++) val += value_int(i); - } - protected void xFinal() throws SQLException { - result(val); - } - }); - stat.executeUpdate("create table t (c1);"); - stat.executeUpdate("insert into t values (5);"); - stat.executeUpdate("insert into t values (3);"); - stat.executeUpdate("insert into t values (8);"); - stat.executeUpdate("insert into t values (2);"); - stat.executeUpdate("insert into t values (7);"); - ResultSet rs = stat.executeQuery("select mySum(c1), sum(c1) from t;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), rs.getInt(2)); - } - - @Test public void destroy() throws SQLException { - Function.create(conn, "f1", new Function() { - public void xFunc() throws SQLException { val = 9; } - }); - stat.executeQuery("select f1();").close(); - assertEquals(val, 9); - - Function.destroy(conn, "f1"); - Function.destroy(conn, "f1"); - } - - @Test public void manyfunctions() throws SQLException { - Function.create(conn, "f1", new Function() { - public void xFunc() throws SQLException { result(1); } }); - Function.create(conn, "f2", new Function() { - public void xFunc() throws SQLException { result(2); } }); - Function.create(conn, "f3", new Function() { - public void xFunc() throws SQLException { result(3); } }); - Function.create(conn, "f4", new Function() { - public void xFunc() throws SQLException { result(4); } }); - Function.create(conn, "f5", new Function() { - public void xFunc() throws SQLException { result(5); } }); - Function.create(conn, "f6", new Function() { - public void xFunc() throws SQLException { result(6); } }); - Function.create(conn, "f7", new Function() { - public void xFunc() throws SQLException { result(7); } }); - Function.create(conn, "f8", new Function() { - public void xFunc() throws SQLException { result(8); } }); - Function.create(conn, "f9", new Function() { - public void xFunc() throws SQLException { result(9); } }); - Function.create(conn, "f10", new Function() { - public void xFunc() throws SQLException { result(10); } }); - Function.create(conn, "f11", new Function() { - public void xFunc() throws SQLException { result(11); } }); - - ResultSet rs = stat.executeQuery( - "select f1() + f2() + f3() + f4() + f5() + f6()" - + " + f7() + f8() + f9() + f10() + f11();"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), 1+2+3+4+5+6+7+8+9+10+11); - rs.close(); - } - - @Test public void multipleThreads() throws Exception { - Function func = new Function() { - int sum = 0; - protected void xFunc() { try { - sum += value_int(1); - } catch (SQLException e) { e.printStackTrace(); } } - public String toString() { return String.valueOf(sum); } - }; - Function.create(conn, "func", func); - stat.executeUpdate("create table foo (col integer);"); - stat.executeUpdate( - "create trigger foo_trigger after insert on foo begin" - + " select func(new.rowid, new.col); end;"); - int times = 1000; - List threads = new LinkedList(); - for (int tn=0; tn < times; tn++) { - threads.add(new Thread("func thread " + tn) { - public void run() { try { - Statement s = conn.createStatement(); - s.executeUpdate("insert into foo values (1);"); - s.close(); - } catch (SQLException e) { e.printStackTrace(); } } - }); - } - for (Thread thread: threads) thread.start(); - for (Thread thread: threads) thread.join(); - - // check that all of the threads successfully executed - ResultSet rs = stat.executeQuery("select sum(col) from foo;"); - assertTrue(rs.next()); - assertEquals(rs.getInt(1), times); - rs.close(); - - // check that custom function was executed each time - assertEquals(Integer.parseInt(func.toString()), times); - } - - private void assertArrayEq(byte[] a, byte[] b) { - assertNotNull(a); - assertNotNull(b); - assertEquals(a.length, b.length); - for (int i=0; i < a.length; i++) - assertEquals(a[i], b[i]); - } -} diff --git a/sqlitejdbc/web/ad.inc b/sqlitejdbc/web/ad.inc deleted file mode 100644 index 38df44c..0000000 --- a/sqlitejdbc/web/ad.inc +++ /dev/null @@ -1,13 +0,0 @@ -
- - -
diff --git a/sqlitejdbc/web/content.css b/sqlitejdbc/web/content.css deleted file mode 100644 index f7f12d8..0000000 --- a/sqlitejdbc/web/content.css +++ /dev/null @@ -1,102 +0,0 @@ -body { - color: #333333; - font: 12px/18px "Lucida Grande", Geneva, Arial, Verdana, sans-serif; -} -p { - font: 12px/18px "Lucida Grande", Geneva, Arial, Verdana, sans-serif; -} -h1, h2, h3, h4 { - font-family: 'Trebuchet MS', arial, sans-serif; -} - -#subheading { - font-family: "Lucida Grande", Verdana, sans-serif; - margin-left: 20px; - margin-top: -20px; - color: silver; -} - -#content { - border-top: 1px solid black; - border-right: 1px dashed black; -} - -#aside { - border-top: 1px solid black; -} - -#footer { - color: gray; - border-top: 1px solid silver; - font-size: 10px; -} - -/* old stuff */ - -div.content { -background-color: white; -border-left: 1px solid black; -border-bottom: 1px solid black; -margin-left: 10px; -margin-top: 0px; -padding-top: 5px; -padding-left: 15px; -padding-right:15px; -} -div.ad { -float: right; -padding: 8px; -margin: 20px; -} -p.note { -font-style: italic; -} -p.date { -text-align: right; -} -p.sig { -text-align: right; -font-family: monospace; -} -p.item { -text-indent: 2%; -} -li { - font: 12px/18px "Lucida Grande", Geneva, Arial, Verdana, sans-serif; -} -pre.code { - font: 12px/18px Monaco, monospace; - background-color: #EEEEEE; - padding-left: 5px; -} - -.string { color: red; } -.numeric { color: red; } -.operator { color: #cc9900; } -.statement { color: #663300; } -.comment { color: blue; } -.property { color: purple; } -table.data { -border-width: 1px; -border-spacing: 0px; -border-color: gray; -border-style: outset; -border-collapse: separate; -} -table.data th { -font-weight: normal; -font-style: italic; -text-align: left; -padding: 2px; -border-width: 1px; -border-style: inset; -border-color: gray; -} -table.data td { -text-align: right; -padding: 2px; -border-width: 1px; -border-style: inset; -border-color: gray; -} - diff --git a/sqlitejdbc/web/functions.html b/sqlitejdbc/web/functions.html deleted file mode 100644 index 52412ff..0000000 --- a/sqlitejdbc/web/functions.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - SQLiteJDBC - Custom Functions - - -
- - -
- - - -
-

2006-08-22

- - - - diff --git a/sqlitejdbc/web/index.html b/sqlitejdbc/web/index.html deleted file mode 100644 index 6af20fb..0000000 --- a/sqlitejdbc/web/index.html +++ /dev/null @@ -1,174 +0,0 @@ - -SQLite JDBC Driver - - - - - - - - - -
-

SQLiteJDBC

-
100% Pure Java
-
-

A JDBC driver for SQLite. It comes in two flavours, a 100% Pure Java driver -based on NestedVM or a native JNI -library. The pure java driver is compatible, you can follow the Java dream and -use it anywhere with no worries. The native driver is fast, and I recommend it -wherever possible. Binaries are provided for Windows and Mac OS X.

- -

News

-
    -
  • 2008-05-11: Version v047 released: major internal work - plugs a long standing memory leak.
  • -
  • 2008-04-17: Version v044 released: minor bug fixes and - an upgrade to 3.5.8.
  • -
  • 2008-03-16: Version v043 released: support for multiple - connections in the Pure Java version on Java 6.
  • -
  • 2008-03-05: Version v042 released: switch to using the - amalgamation source, integrate FTS3 (full text search), and - bring back the pure java builds.
  • -
  • 2008-03-05: Bring back the Linux binary.
  • -
  • 2008-03-03: Version v041 released: possible data corruption - bug fix, - details.
  • -
- -

Getting Started

- -

Read the usage page for some basic details. -The short story is:

- -
-import java.sql.*;
-
-public class Test {
-    public static void main(String[] args) throws Exception {
-        Class.forName("org.sqlite.JDBC");
-        Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
-        Statement stat = conn.createStatement();
-        stat.executeUpdate("drop table if exists people;");
-        stat.executeUpdate("create table people (name, occupation);");
-        PreparedStatement prep = conn.prepareStatement(
-            "insert into people values (?, ?);");
-
-        prep.setString(1, "Gandhi");
-        prep.setString(2, "politics");
-        prep.addBatch();
-        prep.setString(1, "Turing");
-        prep.setString(2, "computers");
-        prep.addBatch();
-        prep.setString(1, "Wittgenstein");
-        prep.setString(2, "smartypants");
-        prep.addBatch();
-
-        conn.setAutoCommit(false);
-        prep.executeBatch();
-        conn.setAutoCommit(true);
-
-        ResultSet rs = stat.executeQuery("select * from people;");
-        while (rs.next()) {
-            System.out.println("name = " + rs.getString("name"));
-            System.out.println("job = " + rs.getString("occupation"));
-        }
-        rs.close();
-        conn.close();
-    }
-}
-
-Run with: -java -cp .:sqlitejdbc-v047-native.jar -Djava.library.path=. Test - -

Getting Help

-

If you have any problems or questions, there is a public mailing list -http://groups.google.com/group/sqlitejdbc -which I read.

- -

Keeping Informed

- -

To be informed when a new release is made, I recommend subscribing to the -freshmeat project for -this driver. Every release I make goes up there immediately with a short -summary of the changes. They provide a free email service with these details -and don't load you up with spam.

- - - - -

Released under a BSD license.

- -

Version control for this project is handled with -darcs. You can access the darcs repo -via either:
-     -http://www.zentus.com/sqlitejdbc/src
-or
-     -/afs/hcoop.net/user/c/cr/crawshaw/web/zentus/sqlitejdbc/src -

- -

My other projects.

- - -
-

Current Version: v047 (SQLite 3.5.8)

- -

Download

- - - - - -

Documentation

- - -

 

- -
- - - - diff --git a/sqlitejdbc/web/javasource.css b/sqlitejdbc/web/javasource.css deleted file mode 100644 index eecb881..0000000 --- a/sqlitejdbc/web/javasource.css +++ /dev/null @@ -1,61 +0,0 @@ -/* Java2HTML - Colour Definitions*/ -#CharacerLiteral { color: #DD00DD; } -#StringLiteral { color: #DD0000; } -#SingleLineComment { color: #008000; } -#FormalComment { color: #008000; } -#MultiLineComment { color: #008000; } -#Abstract { color: #0000FF ; font-weight: bold } -#Boolean { color: #0000FF ; font-weight: bold } -#Break { color: #0000FF ; font-weight: bold } -#Byte { color: #0000FF ; font-weight: bold } -#Case { color: #0000FF ; font-weight: bold } -#Catch { color: #0000FF ; font-weight: bold } -#Char { color: #0000FF ; font-weight: bold } -#Class { color: #0000FF ; font-weight: bold } -#Const { color: #0000FF ; font-weight: bold } -#Continue { color: #0000FF ; font-weight: bold } -#Default { color: #0000FF ; font-weight: bold } -#Do { color: #0000FF ; font-weight: bold } -#Double { color: #0000FF ; font-weight: bold } -#Else { color: #0000FF ; font-weight: bold } -#Extends { color: #0000FF ; font-weight: bold } -#False { color: #0000FF ; font-weight: bold } -#Final { color: #0000FF ; font-weight: bold } -#Finally { color: #0000FF ; font-weight: bold } -#Float { color: #0000FF ; font-weight: bold } -#For { color: #0000FF ; font-weight: bold } -#Goto { color: #0000FF ; font-weight: bold } -#If { color: #0000FF ; font-weight: bold } -#Implements { color: #0000FF ; font-weight: bold } -#Import { color: #0000FF ; font-weight: bold } -#InstanceOf { color: #0000FF ; font-weight: bold } -#Int { color: #0000FF ; font-weight: bold } -#Interface { color: #0000FF ; font-weight: bold } -#Long { color: #0000FF ; font-weight: bold } -#Native { color: #0000FF ; font-weight: bold } -#New { color: #0000FF ; font-weight: bold } -#Package { color: #0000FF ; font-weight: bold } -#Private { color: #0000FF ; font-weight: bold } -#Protected { color: #0000FF ; font-weight: bold } -#Public { color: #0000FF ; font-weight: bold } -#Return { color: #0000FF ; font-weight: bold } -#Short { color: #0000FF ; font-weight: bold } -#Static { color: #0000FF ; font-weight: bold } -#Super { color: #0000FF ; font-weight: bold } -#Switch { color: #0000FF ; font-weight: bold } -#Synchronized { color: #0000FF ; font-weight: bold } -#This { color: #0000FF ; font-weight: bold } -#Throw { color: #0000FF ; font-weight: bold } -#Throws { color: #0000FF ; font-weight: bold } -#Transient { color: #0000FF ; font-weight: bold } -#True { color: #0000FF ; font-weight: bold } -#Try { color: #0000FF ; font-weight: bold } -#Void { color: #0000FF ; font-weight: bold } -#Volatile { color: #0000FF ; font-weight: bold } -#While { color: #0000FF ; font-weight: bold } -#StrictFP { color: #0000FF ; font-weight: bold } -#IntegerLiteral { color: #0000AA } -#DecimalLiteral { color: #000000 } -#HexLiteral { color: #000000 } -#OctalLiteral { color: #000000 } -#FloatPointLiteral { color: #000000 } diff --git a/sqlitejdbc/web/nav.inc b/sqlitejdbc/web/nav.inc deleted file mode 100644 index 8d07cef..0000000 --- a/sqlitejdbc/web/nav.inc +++ /dev/null @@ -1,10 +0,0 @@ -

- <- | - SQLiteJDBC | - Changelog | - Usage | - Speed | - Custom Functions | - Javadoc -

- diff --git a/sqlitejdbc/web/speed.html b/sqlitejdbc/web/speed.html deleted file mode 100644 index acff440..0000000 --- a/sqlitejdbc/web/speed.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - SQLiteJDBC - Speed - - -
- - -
- - - -
-

SQLiteJDBC

- -

- <- | - SQLiteJDBC | - Changelog | - Usage | - Speed | - Custom Functions | - Javadoc -

- -

Speed

- -

SQLite is fast. Java core is fast. JNI is fast. The result is thin -libraries like SQLiteJDBC are also fast. Below are some numbers I made -up to prove it.

- -

You can make up these numbers yourself by downloading the source -tarball and typing make speed.

- -

More tests, comparisons and pretty graphs coming as I find the -time.

- -

Memory Database

- - - - - - - - -
 Fast MacNormal Linux
1000 Inserts (prep)9ms10ms
1000 Inserts26ms27ms
With Transactions
1000 Inserts (prep)7ms8ms
1000 Inserts25ms25ms
- -

File database

- - - - - - -
 Fast MacNormal Linux
With Transactions
1000 Inserts (prep)20ms37ms
1000 Inserts37ms53ms
- -

Systems

- - - -
Fast MacBlack Macbook - Intel Core Duo 2ghz
Normal LiunxAMD Duron 1.6ghz
- -

All have plenty of RAM.

- -
-

2006-08-10

- - - - diff --git a/sqlitejdbc/web/usage.html b/sqlitejdbc/web/usage.html deleted file mode 100644 index 11e1c64..0000000 --- a/sqlitejdbc/web/usage.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - SQLiteJDBC - Usage - - -
- - -
- - - -
-

SQLiteJDBC

- -

- <- | - SQLiteJDBC | - Changelog | - Usage | - Speed | - Custom Functions | - Javadoc -

- -

Usage

- -

Download the binary for the platform you are developing on. Open the -tarball and copy the two files into your application directory:

-
-    sqlitejdbc.jar
-    sqlitejdbc.dll (or libsqlitejdbc.so or libsqlitejdbc.jnilib)
-
- -

Reference the driver in your code:

-
-    Class.forName("org.sqlite.JDBC");
-    Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");
-    // ... use the database ...
-    conn.close();
-
- -

And call your program with the driver's JAR file in the classpath -and the C library in the librarypath. E.g.

-
-    java -cp sqlitejdbc.jar -Djava.library.path=. yourclass
-
- -

That's it.

- -

Dates and Time

- -

SQLiteJDBC implements ResultSet.getDate()/getTime() and -PreparedStatement.setDate()/setTime() in the only efficient -way the JDBC spec allows for, which is storing the time as a 64-bit -long of milliseconds since UTC. This is the standard unix timestamp.

- -

This does not conflict with the SQLite - standard -format as long as care is taken to transform the unix timestamp -into what SQLite functions use, either at the point where the date is -stored or when using it elsewhere in SQLite. For example:

- -
-    prep = conn.prepareStatement("insert into test values (?);");
-    prep.setDate(1, new Date(1000));
-    prep.executeUpdate();
-
-    rs = stat.executeQuery("select * from test;");
-    rs.getString(1) == "1000";
-
- -In the above example the date is being stored as a unix timestamp. -To store the date in the standard SQLite format, transform it with -the datetime() and strftime() functions: - -
-    prep = conn.prepareStatement(
-        "insert into test values datetime(? / 1000, 'unixepoch');");
-    prep.setDate(1, new Date(1092941466000));
-    prep.executeUpdate();
-
-    rs = stat.executeQuery("select * from test;");
-    assert(rs.getString(1).equals("2004-08-10 18:51:06"));
-
-    rs = stat.executeQuery("select strftime('%s', col1) * 1000 from test;");
-    assert(rs.getDate(1).equals(new Date(987654321)));
-
- - - -

Compiling

- -

Download the source tarball, extract, set your $JAVA_HOME -env variable and type:

-
-    $ make
-
-

See the README for more details.

- -
-

2006-09-26

- - - - -- 2.11.0
-

SQLiteJDBC

- -

- <- | - SQLiteJDBC | - Changelog | - Usage | - Speed | - Custom Functions | - Javadoc -

- -

Custom Functions

- -

As of v018, SQLiteJDBC now provides a custom interface for -creating custom functions accessible inside SQLite, written in -Java.

- -

All you have to do is subclass -org.sqlite.Function and -implement xFunc(). Pass the new instance to -Function.create() and SQLite is ready to call it.

- -

Basic Example

- -
-import java.sql.*;
-import org.sqlite.Function;
-
-public class Test {
-    public static void main(String[] args) {
-        Class.forName("org.sqlite.JDBC");
-        Connection conn = DriverManager.getConnection("jdbc:sqlite:");
-
-        Function.create(conn, "myFunc", new Function() {
-            protected void xFunc() throws SQLException {
-                System.out.println("myFunc called!");
-            }
-        });
-
-        conn.createStatement().execute("select myFunc();");
-        conn.close();
-    }
-}
-
- -

Aggregate Functions

- -

By subclassing Function.Aggregate and implementing xStep() -and xFinal() you can create an aggregate function. E.g.

- -
-    Class.forName("org.sqlite.JDBC");
-    Connection conn = DriverManager.getConnection("jdbc:sqlite:");
-
-    Function.create(conn, "mySum", new Function.Aggregate() {
-        private int sum = 0;
-        protected void xStep() throws SQLException {
-            sum += value_int(0);
-        }
-        protected void xFinal() throws SQLException {
-            result(sum);
-        }
-    });
-
-    Statement stat = conn.createStatement();
-    stat.executeUpdate("create table t1 (c1);");
-    stat.executeUpdate("insert into t1 values (2);");
-    stat.executeUpdate("insert into t1 values (4);");
-    stat.executeUpdate("insert into t1 values (3);");
-    ResultSet rs = stat.executeQuery("select mySum(c1) from t1;");
-    rs.next();
-    System.out.println("mySum = " + rs.getInt(1));
-
- -

Prints mySum = 9. It is safe to use internal variables as -every time an aggregate function is called it is clone()ed to -ensure thread safety.

- -

Triggers

- -

The most interesting use of custom functions are making SQLite triggers. -This way your Java application can be informed of changes in your tables.

- -
-import java.sql.*;
-import org.sqlite.Function;
-
-public class Test {
-    public static void main(String[] args) {
-        Class.forName("org.sqlite.JDBC");
-        Connection conn = DriverManager.getConnection("jdbc:sqlite:");
-
-        Function.create(conn, "myFunc", new Function() {
-            protected void xFunc() {
-                System.out.println("database updated");
-            }
-        });
-
-        Statement stat = conn.createStatement();
-        stat.executeUpdate("create table table1 (col1, col2);");
-        stat.executeUpdate(
-            "create trigger trig1 after insert on table1 begin" +
-            "    select callTrig();" +
-            "end;"
-        );
-
-        stat.executeUpdate("insert into table1 values (1, 2);");
-        conn.close();
-    }
-}
-
- -

Arguments and Results

- -

The protected functions value_<type>(int), -result(<type>) of -org.sqlite.Function provide access -to arguments and the ability to return a value.

- -
-    Function.create(conn, "mySum", new Function() {
-        protected void xFunc() throws SQLException {
-            int s = 0;
-            for (int i=0; i < arg(); i++)
-                s += value_int(i);
-            result(s);
-        }
-    });
-
-    ResultSet rs = conn.createStatement().execute(
-        "select mySum(1, 3, 5);");
-    rs.next();
-
-    System.out.println(rs.getInt(1));
-
- -

Prints 9.

- -