missing
This commit is contained in:
parent
106e4bc13f
commit
d680fa0755
39
packages/myddas/pl/CMakeLists.txt
Normal file
39
packages/myddas/pl/CMakeLists.txt
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
set( MYDDAS_YPP
|
||||||
|
myddas.ypp
|
||||||
|
myddas_assert_predicates.ypp
|
||||||
|
myddas_top_level.ypp
|
||||||
|
myddas_errors.ypp
|
||||||
|
myddas_prolog2sql.ypp
|
||||||
|
myddas_mysql.ypp
|
||||||
|
myddas_postgres.ypp
|
||||||
|
myddas_sqlite3.ypp
|
||||||
|
myddas_util_predicates.ypp
|
||||||
|
myddas_prolog2sql_optimizer.ypp )
|
||||||
|
|
||||||
|
set (MYDDAS_YAP "")
|
||||||
|
function(cpp_compile output filename)
|
||||||
|
set(header_extension "yap")
|
||||||
|
get_filename_component(base ${filename} NAME_WE)
|
||||||
|
set(base_abs ${CMAKE_CURRENT_BINARY_DIR}/${base})
|
||||||
|
set(outfile ${base_abs}.yap)
|
||||||
|
set(${output} ${${output}} ${outfile} PARENT_SCOPE)
|
||||||
|
#message("outfile=${outfile}: ${CMAKE_C_COMPILER} -E -Xpreprocessor P ${CMAKE_CURRENT_SOURCE_DIR}/${filename}\n")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${outfile}
|
||||||
|
COMMAND ${CMAKE_C_COMPILER} ${MYDDAS_FLAGS} -x c -E -P -w ${CMAKE_CURRENT_SOURCE_DIR}/${filename} -o ${outfile}
|
||||||
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${filename}")
|
||||||
|
set_source_files_properties(${outfile} PROPERTIES GENERATED TRUE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
foreach(file ${MYDDAS_YPP})
|
||||||
|
message("infile=${file}\n")
|
||||||
|
cpp_compile( MYDDAS_YAP ${file})
|
||||||
|
#message("outfiles=${MYDDAS_YAP}\n")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
Add_custom_target (plmyddas ALL DEPENDS ${MYDDAS_YPP} ${MYDDAS_YAP} ) # WORKING_DIRECTORY ${CMAKE_BINARY_DIR} )
|
||||||
|
|
||||||
|
|
||||||
|
install(FILES ${MYDDAS_YAP}
|
||||||
|
DESTINATION ${libpl}
|
||||||
|
)
|
15
packages/myddas/sqlite3/Android/AndroidManifest.xml
Normal file
15
packages/myddas/sqlite3/Android/AndroidManifest.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.sqlite.app.customsqlite"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
|
||||||
|
<activity android:name="CustomSqlite"
|
||||||
|
android:label="@string/app_name">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
17
packages/myddas/sqlite3/Android/ant.properties
Normal file
17
packages/myddas/sqlite3/Android/ant.properties
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# This file is used to override default values used by the Ant build system.
|
||||||
|
#
|
||||||
|
# This file must be checked into Version Control Systems, as it is
|
||||||
|
# integral to the build system of your project.
|
||||||
|
|
||||||
|
# This file is only used by the Ant script.
|
||||||
|
|
||||||
|
# You can use this to override default values such as
|
||||||
|
# 'source.dir' for the location of your java source folder and
|
||||||
|
# 'out.dir' for the location of your output folder.
|
||||||
|
|
||||||
|
# You can also use it define how the release builds are signed by declaring
|
||||||
|
# the following properties:
|
||||||
|
# 'key.store' for the location of your keystore and
|
||||||
|
# 'key.alias' for the name of the key to use.
|
||||||
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
|
|
92
packages/myddas/sqlite3/Android/build.xml
Normal file
92
packages/myddas/sqlite3/Android/build.xml
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="CustomSqlite" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contains the path to the SDK. It should *NOT* be checked into
|
||||||
|
Version Control Systems. -->
|
||||||
|
<property file="local.properties" />
|
||||||
|
|
||||||
|
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||||
|
'android' tool to add properties to it.
|
||||||
|
This is the place to change some Ant specific build properties.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
source.dir
|
||||||
|
The name of the source directory. Default is 'src'.
|
||||||
|
out.dir
|
||||||
|
The name of the output directory. Default is 'bin'.
|
||||||
|
|
||||||
|
For other overridable properties, look at the beginning of the rules
|
||||||
|
files in the SDK, at tools/ant/build.xml
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should
|
||||||
|
be updated using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="ant.properties" />
|
||||||
|
|
||||||
|
<!-- if sdk.dir was not set from one of the property file, then
|
||||||
|
get it from the ANDROID_HOME env var.
|
||||||
|
This must be done before we load project.properties since
|
||||||
|
the proguard config can use sdk.dir -->
|
||||||
|
<property environment="env" />
|
||||||
|
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||||
|
<isset property="env.ANDROID_HOME" />
|
||||||
|
</condition>
|
||||||
|
|
||||||
|
<!-- The project.properties file is created and updated by the 'android'
|
||||||
|
tool, as well as ADT.
|
||||||
|
|
||||||
|
This contains project specific properties such as project target, and library
|
||||||
|
dependencies. Lower level build properties are stored in ant.properties
|
||||||
|
(or in .classpath for Eclipse projects).
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems. -->
|
||||||
|
<loadproperties srcFile="project.properties" />
|
||||||
|
|
||||||
|
<!-- quick check on sdk.dir -->
|
||||||
|
<fail
|
||||||
|
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||||
|
unless="sdk.dir"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Import per project custom build rules if present at the root of the project.
|
||||||
|
This is the place to put custom intermediary targets such as:
|
||||||
|
-pre-build
|
||||||
|
-pre-compile
|
||||||
|
-post-compile (This is typically used for code obfuscation.
|
||||||
|
Compiled code location: ${out.classes.absolute.dir}
|
||||||
|
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||||
|
-post-package
|
||||||
|
-post-build
|
||||||
|
-pre-clean
|
||||||
|
-->
|
||||||
|
<import file="custom_rules.xml" optional="true" />
|
||||||
|
|
||||||
|
<!-- Import the actual build file.
|
||||||
|
|
||||||
|
To customize existing targets, there are two options:
|
||||||
|
- Customize only one target:
|
||||||
|
- copy/paste the target into this file, *before* the
|
||||||
|
<import> task.
|
||||||
|
- customize it to your needs.
|
||||||
|
- Customize the whole content of build.xml
|
||||||
|
- copy/paste the content of the rules files (minus the top node)
|
||||||
|
into this file, replacing the <import> task.
|
||||||
|
- customize to your needs.
|
||||||
|
|
||||||
|
***********************
|
||||||
|
****** IMPORTANT ******
|
||||||
|
***********************
|
||||||
|
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||||
|
in order to avoid having your file be overridden by tools such as "android update project"
|
||||||
|
-->
|
||||||
|
<!-- version-tag: 1 -->
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||||
|
|
||||||
|
</project>
|
4
packages/myddas/sqlite3/Android/jni/Android.mk
Normal file
4
packages/myddas/sqlite3/Android/jni/Android.mk
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
include $(LOCAL_PATH)/sqlite/Android.mk
|
||||||
|
|
1
packages/myddas/sqlite3/Android/jni/Application.mk
Normal file
1
packages/myddas/sqlite3/Android/jni/Application.mk
Normal file
@ -0,0 +1 @@
|
|||||||
|
APP_STL:=stlport_static
|
File diff suppressed because it is too large
Load Diff
10
packages/myddas/sqlite3/Android/local.properties
Normal file
10
packages/myddas/sqlite3/Android/local.properties
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must *NOT* be checked into Version Control Systems,
|
||||||
|
# as it contains information specific to your local configuration.
|
||||||
|
|
||||||
|
# location of the SDK. This is only used by Ant
|
||||||
|
# For customization when using a Version Control System, please read the
|
||||||
|
# header note.
|
||||||
|
sdk.dir=/home/dan/adt-bundle-linux-x86-20131030/sdk/
|
20
packages/myddas/sqlite3/Android/proguard-project.txt
Normal file
20
packages/myddas/sqlite3/Android/proguard-project.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
14
packages/myddas/sqlite3/Android/project.properties
Normal file
14
packages/myddas/sqlite3/Android/project.properties
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-19
|
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 5.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
36
packages/myddas/sqlite3/Android/res/layout/main.xml
Normal file
36
packages/myddas/sqlite3/Android/res/layout/main.xml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent">
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="CustomSqlite Tests"
|
||||||
|
android:typeface="monospace"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Run the tests"
|
||||||
|
android:onClick="run_the_tests"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_widget"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="<this text should be replaced by the test output>"
|
||||||
|
android:typeface="monospace"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
4
packages/myddas/sqlite3/Android/res/values/strings.xml
Normal file
4
packages/myddas/sqlite3/Android/res/values/strings.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">CustomSqlite</string>
|
||||||
|
</resources>
|
@ -0,0 +1,416 @@
|
|||||||
|
|
||||||
|
package org.sqlite.app.customsqlite;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import java.lang.InterruptedException;
|
||||||
|
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
||||||
|
import org.sqlite.database.sqlite.SQLiteStatement;
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabaseCorruptException;
|
||||||
|
import org.sqlite.database.sqlite.SQLiteOpenHelper;
|
||||||
|
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
/*
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteStatement;
|
||||||
|
*/
|
||||||
|
|
||||||
|
import org.sqlite.database.DatabaseErrorHandler;
|
||||||
|
class DoNotDeleteErrorHandler implements DatabaseErrorHandler {
|
||||||
|
private static final String TAG = "DoNotDeleteErrorHandler";
|
||||||
|
public void onCorruption(SQLiteDatabase dbObj) {
|
||||||
|
Log.e(TAG, "Corruption reported by sqlite on database: " + dbObj.getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CustomSqlite extends Activity
|
||||||
|
{
|
||||||
|
private TextView myTV; /* Text view widget */
|
||||||
|
private int myNTest; /* Number of tests attempted */
|
||||||
|
private int myNErr; /* Number of tests failed */
|
||||||
|
|
||||||
|
File DB_PATH;
|
||||||
|
|
||||||
|
/** Called when the activity is first created. */
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState){
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.main);
|
||||||
|
myTV = (TextView)findViewById(R.id.tv_widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void report_version(){
|
||||||
|
SQLiteDatabase db = null;
|
||||||
|
SQLiteStatement st;
|
||||||
|
String res;
|
||||||
|
|
||||||
|
db = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
|
||||||
|
st = db.compileStatement("SELECT sqlite_version()");
|
||||||
|
res = st.simpleQueryForString();
|
||||||
|
|
||||||
|
myTV.append("SQLite version " + res + "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void test_warning(String name, String warning){
|
||||||
|
myTV.append("WARNING:" + name + ": " + warning + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void test_result(String name, String res, String expected){
|
||||||
|
myTV.append(name + "... ");
|
||||||
|
myNTest++;
|
||||||
|
|
||||||
|
if( res.equals(expected) ){
|
||||||
|
myTV.append("ok\n");
|
||||||
|
} else {
|
||||||
|
myNErr++;
|
||||||
|
myTV.append("FAILED\n");
|
||||||
|
myTV.append(" res= \"" + res + "\"\n");
|
||||||
|
myTV.append(" expected=\"" + expected + "\"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Test if the database at DB_PATH is encrypted or not. The db
|
||||||
|
** is assumed to be encrypted if the first 6 bytes are anything
|
||||||
|
** other than "SQLite".
|
||||||
|
**
|
||||||
|
** If the test reveals that the db is encrypted, return the string
|
||||||
|
** "encrypted". Otherwise, "unencrypted".
|
||||||
|
*/
|
||||||
|
public String db_is_encrypted() throws Exception {
|
||||||
|
FileInputStream in = new FileInputStream(DB_PATH);
|
||||||
|
|
||||||
|
byte[] buffer = new byte[6];
|
||||||
|
in.read(buffer, 0, 6);
|
||||||
|
|
||||||
|
String res = "encrypted";
|
||||||
|
if( Arrays.equals(buffer, (new String("SQLite")).getBytes()) ){
|
||||||
|
res = "unencrypted";
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Test that a database connection may be accessed from a second thread.
|
||||||
|
*/
|
||||||
|
public void thread_test_1(){
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
final SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
|
||||||
|
String db_path2 = DB_PATH.toString() + "2";
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x, y)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (1, 2), (3, 4)");
|
||||||
|
|
||||||
|
Thread t = new Thread( new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
SQLiteStatement st = db.compileStatement("SELECT sum(x+y) FROM t1");
|
||||||
|
String res = st.simpleQueryForString();
|
||||||
|
test_result("thread_test_1", res, "10");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
t.start();
|
||||||
|
try {
|
||||||
|
t.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Test that a database connection may be accessed from a second thread.
|
||||||
|
*/
|
||||||
|
public void thread_test_2(){
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
final SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x, y)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (1, 2), (3, 4)");
|
||||||
|
|
||||||
|
db.enableWriteAheadLogging();
|
||||||
|
db.beginTransactionNonExclusive();
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (5, 6)");
|
||||||
|
|
||||||
|
Thread t = new Thread( new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
SQLiteStatement st = db.compileStatement("SELECT sum(x+y) FROM t1");
|
||||||
|
String res = st.simpleQueryForString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
t.start();
|
||||||
|
String res = "concurrent";
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i=0; i<20 && t.isAlive(); i++){
|
||||||
|
try { Thread.sleep(100); } catch(InterruptedException e) {}
|
||||||
|
}
|
||||||
|
if( t.isAlive() ){ res = "blocked"; }
|
||||||
|
|
||||||
|
db.endTransaction();
|
||||||
|
try { t.join(); } catch(InterruptedException e) {}
|
||||||
|
if( SQLiteDatabase.hasCodec() ){
|
||||||
|
test_result("thread_test_2", res, "blocked");
|
||||||
|
} else {
|
||||||
|
test_result("thread_test_2", res, "concurrent");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Use a Cursor to loop through the results of a SELECT query.
|
||||||
|
*/
|
||||||
|
public void csr_test_2() throws Exception {
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
String res = "";
|
||||||
|
String expect = "";
|
||||||
|
int i;
|
||||||
|
int nRow = 0;
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x)");
|
||||||
|
db.execSQL("BEGIN");
|
||||||
|
for(i=0; i<1000; i++){
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('one'), ('two'), ('three')");
|
||||||
|
expect += ".one.two.three";
|
||||||
|
}
|
||||||
|
db.execSQL("COMMIT");
|
||||||
|
Cursor c = db.rawQuery("SELECT x FROM t1", null);
|
||||||
|
if( c!=null ){
|
||||||
|
boolean bRes;
|
||||||
|
for(bRes=c.moveToFirst(); bRes; bRes=c.moveToNext()){
|
||||||
|
String x = c.getString(0);
|
||||||
|
res = res + "." + x;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
test_warning("csr_test_1", "c==NULL");
|
||||||
|
}
|
||||||
|
test_result("csr_test_2.1", res, expect);
|
||||||
|
|
||||||
|
db.execSQL("BEGIN");
|
||||||
|
for(i=0; i<1000; i++){
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (X'123456'), (X'789ABC'), (X'DEF012')");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (45), (46), (47)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (8.1), (8.2), (8.3)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES (NULL), (NULL), (NULL)");
|
||||||
|
}
|
||||||
|
db.execSQL("COMMIT");
|
||||||
|
|
||||||
|
c = db.rawQuery("SELECT x FROM t1", null);
|
||||||
|
if( c!=null ){
|
||||||
|
boolean bRes;
|
||||||
|
for(bRes=c.moveToFirst(); bRes; bRes=c.moveToNext()) nRow++;
|
||||||
|
}else{
|
||||||
|
test_warning("csr_test_1", "c==NULL");
|
||||||
|
}
|
||||||
|
test_result("csr_test_2.2", "" + nRow, "15000");
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String string_from_t1_x(SQLiteDatabase db){
|
||||||
|
String res = "";
|
||||||
|
|
||||||
|
Cursor c = db.rawQuery("SELECT x FROM t1", null);
|
||||||
|
boolean bRes;
|
||||||
|
for(bRes=c.moveToFirst(); bRes; bRes=c.moveToNext()){
|
||||||
|
String x = c.getString(0);
|
||||||
|
res = res + "." + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void csr_test_1() throws Exception {
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
String res = "";
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('one'), ('two'), ('three')");
|
||||||
|
|
||||||
|
res = string_from_t1_x(db);
|
||||||
|
test_result("csr_test_1.1", res, ".one.two.three");
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
test_result("csr_test_1.2", db_is_encrypted(), "unencrypted");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stmt_jrnl_test_1() throws Exception {
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
String res = "";
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x, y UNIQUE)");
|
||||||
|
db.execSQL("BEGIN");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES(1, 1), (2, 2), (3, 3)");
|
||||||
|
db.execSQL("UPDATE t1 SET y=y+3");
|
||||||
|
db.execSQL("COMMIT");
|
||||||
|
db.close();
|
||||||
|
test_result("stmt_jrnl_test_1.1", "did not crash", "did not crash");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void supp_char_test_1() throws Exception {
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
String res = "";
|
||||||
|
String smiley = new String( Character.toChars(0x10000) );
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('a" + smiley + "b')");
|
||||||
|
|
||||||
|
res = string_from_t1_x(db);
|
||||||
|
|
||||||
|
test_result("supp_char_test1." + smiley, res, ".a" + smiley + "b");
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** If this is a SEE build, check that encrypted databases work.
|
||||||
|
*/
|
||||||
|
public void see_test_1() throws Exception {
|
||||||
|
if( !SQLiteDatabase.hasCodec() ) return;
|
||||||
|
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
String res = "";
|
||||||
|
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
db.execSQL("PRAGMA key = 'secretkey'");
|
||||||
|
|
||||||
|
db.execSQL("CREATE TABLE t1(x)");
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('one'), ('two'), ('three')");
|
||||||
|
|
||||||
|
res = string_from_t1_x(db);
|
||||||
|
test_result("see_test_1.1", res, ".one.two.three");
|
||||||
|
db.close();
|
||||||
|
|
||||||
|
test_result("see_test_1.2", db_is_encrypted(), "encrypted");
|
||||||
|
|
||||||
|
db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null);
|
||||||
|
db.execSQL("PRAGMA key = 'secretkey'");
|
||||||
|
res = string_from_t1_x(db);
|
||||||
|
test_result("see_test_1.3", res, ".one.two.three");
|
||||||
|
db.close();
|
||||||
|
|
||||||
|
res = "unencrypted";
|
||||||
|
try {
|
||||||
|
db = SQLiteDatabase.openOrCreateDatabase(DB_PATH.getPath(), null);
|
||||||
|
string_from_t1_x(db);
|
||||||
|
} catch ( SQLiteDatabaseCorruptException e ){
|
||||||
|
res = "encrypted";
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
test_result("see_test_1.4", res, "encrypted");
|
||||||
|
|
||||||
|
res = "unencrypted";
|
||||||
|
try {
|
||||||
|
db = SQLiteDatabase.openOrCreateDatabase(DB_PATH.getPath(), null);
|
||||||
|
db.execSQL("PRAGMA key = 'otherkey'");
|
||||||
|
string_from_t1_x(db);
|
||||||
|
} catch ( SQLiteDatabaseCorruptException e ){
|
||||||
|
res = "encrypted";
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
test_result("see_test_1.5", res, "encrypted");
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyHelper extends SQLiteOpenHelper {
|
||||||
|
public MyHelper(Context ctx){
|
||||||
|
super(ctx, DB_PATH.getPath(), null, 1);
|
||||||
|
}
|
||||||
|
public void onConfigure(SQLiteDatabase db){
|
||||||
|
db.execSQL("PRAGMA key = 'secret'");
|
||||||
|
}
|
||||||
|
public void onCreate(SQLiteDatabase db){
|
||||||
|
db.execSQL("CREATE TABLE t1(x)");
|
||||||
|
}
|
||||||
|
public void onUpgrade(SQLiteDatabase db, int iOld, int iNew){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Check that SQLiteOpenHelper works.
|
||||||
|
*/
|
||||||
|
public void helper_test_1() throws Exception {
|
||||||
|
/* SQLiteDatabase.deleteDatabase(DB_PATH); */
|
||||||
|
|
||||||
|
MyHelper helper = new MyHelper(this);
|
||||||
|
SQLiteDatabase db = helper.getWritableDatabase();
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('x'), ('y'), ('z')");
|
||||||
|
|
||||||
|
String res = string_from_t1_x(db);
|
||||||
|
test_result("helper.1", res, ".x.y.z");
|
||||||
|
|
||||||
|
helper.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** If this is a SEE build, check that SQLiteOpenHelper still works.
|
||||||
|
*/
|
||||||
|
public void see_test_2() throws Exception {
|
||||||
|
if( !SQLiteDatabase.hasCodec() ) return;
|
||||||
|
SQLiteDatabase.deleteDatabase(DB_PATH);
|
||||||
|
|
||||||
|
MyHelper helper = new MyHelper(this);
|
||||||
|
SQLiteDatabase db = helper.getWritableDatabase();
|
||||||
|
db.execSQL("INSERT INTO t1 VALUES ('x'), ('y'), ('z')");
|
||||||
|
|
||||||
|
String res = string_from_t1_x(db);
|
||||||
|
test_result("see_test_2.1", res, ".x.y.z");
|
||||||
|
test_result("see_test_2.2", db_is_encrypted(), "encrypted");
|
||||||
|
|
||||||
|
helper.close();
|
||||||
|
helper = new MyHelper(this);
|
||||||
|
db = helper.getReadableDatabase();
|
||||||
|
test_result("see_test_2.3", res, ".x.y.z");
|
||||||
|
|
||||||
|
db = helper.getWritableDatabase();
|
||||||
|
test_result("see_test_2.4", res, ".x.y.z");
|
||||||
|
|
||||||
|
test_result("see_test_2.5", db_is_encrypted(), "encrypted");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run_the_tests(View view){
|
||||||
|
System.loadLibrary("sqliteX");
|
||||||
|
DB_PATH = getApplicationContext().getDatabasePath("test.db");
|
||||||
|
DB_PATH.getParentFile().mkdirs();
|
||||||
|
|
||||||
|
myTV.setText("");
|
||||||
|
myNErr = 0;
|
||||||
|
myNTest = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
report_version();
|
||||||
|
helper_test_1();
|
||||||
|
supp_char_test_1();
|
||||||
|
csr_test_1();
|
||||||
|
csr_test_2();
|
||||||
|
thread_test_1();
|
||||||
|
thread_test_2();
|
||||||
|
see_test_1();
|
||||||
|
see_test_2();
|
||||||
|
stmt_jrnl_test_1();
|
||||||
|
|
||||||
|
myTV.append("\n" + myNErr + " errors from " + myNTest + " tests\n");
|
||||||
|
} catch(Exception e) {
|
||||||
|
myTV.append("Exception: " + e.toString() + "\n");
|
||||||
|
myTV.append(android.util.Log.getStackTraceString(e) + "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
215
packages/myddas/sqlite3/Android/www/index.wiki
Normal file
215
packages/myddas/sqlite3/Android/www/index.wiki
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
<h1>
|
||||||
|
SQLite Android Bindings
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p> The SQLite library is a core part of the Android environment. Java
|
||||||
|
applications and content providers access SQLite using the interface in
|
||||||
|
the
|
||||||
|
<a href="http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html">android.database.sqlite</a> namespace.
|
||||||
|
|
||||||
|
<p> One disadvantage of using Android's built-in SQLite support is that the
|
||||||
|
application is forced to use the version of SQLite that the current version of
|
||||||
|
Android happened to ship with. If your application happens to require a newer
|
||||||
|
version of SQLite, or a build with a custom extension or
|
||||||
|
<a href=http://www.sqlite.org/vfs.html>VFS</a> installed, you're out of luck.
|
||||||
|
|
||||||
|
<p>The code in this project allows an application to use the
|
||||||
|
<a href=http://developer.android.com/tools/sdk/ndk/index.html>Android NDK</a>
|
||||||
|
to build a custom version of SQLite to be shipped with the application while
|
||||||
|
still continuing to use the standard Java interface.
|
||||||
|
|
||||||
|
<h2>Normal Usage</h2>
|
||||||
|
|
||||||
|
<h3>Installation</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Android API levels 15 (Android 4.0.3) and greater are supported. If
|
||||||
|
targetting API level 16 or greater, use the default "trunk" branch of this
|
||||||
|
project. Or, for API level 15, use the "api-level-15" branch. It is not possible
|
||||||
|
to target an API level lower than 15.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Copy the following files from this project into the equivalent locations in
|
||||||
|
the application project.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
jni/Android.mk
|
||||||
|
jni/Application.mk
|
||||||
|
jni/sqlite/* (copy contents of directory recursively)
|
||||||
|
src/org/sqlite/database/* (copy contents of directory recursively)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Following this, the directory structures should contain
|
||||||
|
[/tree?ci=trunk&re=%5ejni%7csrc/org/sqlite/data&expand | these files].
|
||||||
|
|
||||||
|
<p>
|
||||||
|
For API level 15 only, also copy the following:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
src/org/sqlite/os/* (copy contents of directory recursively)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Directory "jni/sqlite/" contains copies of the sqlite3.h and sqlite3.c
|
||||||
|
source files. Between them, they contain the
|
||||||
|
<a href=http://www.sqlite.org/amalgamation.html>source code for the SQLite
|
||||||
|
library</a>. If necessary, replace these with the source for the specific
|
||||||
|
version of SQLite required. If SQLite is to be compiled with any special
|
||||||
|
pre-processor macros defined, add them to the "jni/sqlite/Android.mk" file
|
||||||
|
(not jni/Android.mk).
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Once the files have been added to the project, run the command "ndk-build"
|
||||||
|
in the root directory of the project. This compiles the native code in
|
||||||
|
the jni/ directory (including the custom SQLite version) to shared libraries
|
||||||
|
that will be deployed to the device along with the application. Assuming
|
||||||
|
it is successful, unless you modify the sources or makefiles within the
|
||||||
|
jni/ directory structure, you should not need to run "ndk-build" again.
|
||||||
|
|
||||||
|
<h3>Application Programming</h3>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Before using any SQLite related methods or objects, the shared library
|
||||||
|
compiled using the ndk must be loaded into the application using the
|
||||||
|
following code:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
System.loadLibrary("sqliteX");
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
One way to ensure that the shared library is loaded early enough is
|
||||||
|
to add it to a "static" block within the declaration of the application's
|
||||||
|
main Activity class.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The classes that make up the built-in Android SQLite interface reside in
|
||||||
|
the "android.database.sqlite" namespace. This interface provides all of
|
||||||
|
the same classes, except within the "org.sqlite.database.sqlite" namespace.
|
||||||
|
This means that to modify an application to use the custom version of
|
||||||
|
SQLite, all that is usually required is to replace all occurrences
|
||||||
|
"android.database.sqlite" within the source code with
|
||||||
|
"org.sqlite.database.sqlite". For example, the following:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>should be replaced with:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As well as replacing all uses of the classes in the
|
||||||
|
android.database.sqlite.* namespace, the application must also be sure
|
||||||
|
to use the following two:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
org.sqlite.database.SQLException
|
||||||
|
org.sqlite.database.DatabaseErrorHandler
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>instead of:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
android.database.SQLException
|
||||||
|
android.database.DatabaseErrorHandler
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>Aside from namespace changes, there are other differences from the
|
||||||
|
stock Android interface that applications need to be aware of:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> The SQLiteStatement.<a href="http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html#simpleQueryForBlobFileDescriptor()">simpleQueryForBlobFileDescriptor()</a>
|
||||||
|
API is not available.
|
||||||
|
|
||||||
|
<li> The collation sequence "UNICODE" is not available.
|
||||||
|
|
||||||
|
<li> The collation sequence "LOCALIZED", which normally changes with the
|
||||||
|
system's current locale, is always equivalent to SQLite's built
|
||||||
|
in collation BINARY.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Using The SQLite Encryption Extension</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
To use the <a href=http://www.sqlite.org/see/doc/trunk/www/readme.wiki>
|
||||||
|
SQLite Encryption Extension</a> (SEE) on Android, replace the sqlite3.c
|
||||||
|
file at "jni/sqlite/sqlite3.c" with a SEE-enabled version (i.e. the
|
||||||
|
concatenation of sqlite3.c and see.c - refer to the link above for
|
||||||
|
details). Next, open the file jni/sqlite/Android.mk and locate the
|
||||||
|
following two lines:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
# If using SEE, uncomment the following:
|
||||||
|
# LOCAL_CFLAGS += -DSQLITE_HAS_CODEC
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Uncomment the second of them, then run "ndk-build" as described above to
|
||||||
|
generate the shared libraries.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
After opening or creating an encrypted database, the application must
|
||||||
|
immediately execute a PRAGMA to configure the encryption key. This must
|
||||||
|
be done before any other database methods are called. For example:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("my.db", null);
|
||||||
|
db.execSQL("PRAGMA key = 'secretkey'");
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Or, if you are using the
|
||||||
|
<a href=http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html>SQLiteOpenHelper</a>
|
||||||
|
helper class, the PRAGMA must be the first thing executed within the
|
||||||
|
onConfigure() callback. For example:
|
||||||
|
|
||||||
|
<verbatim>
|
||||||
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
||||||
|
import org.sqlite.database.sqlite.SQLiteHelper;
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
class MyHelper extends SQLiteOpenHelper {
|
||||||
|
...
|
||||||
|
void onConfigure(SQLiteDatabase db){
|
||||||
|
db.execSQL("PRAGMA key = 'secretkey'");
|
||||||
|
}
|
||||||
|
...
|
||||||
|
}
|
||||||
|
</verbatim>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Refer to the <a href=http://www.sqlite.org/see/doc/trunk/www/readme.wiki>
|
||||||
|
SEE documentation</a> for further details regarding encryption keys.
|
||||||
|
|
||||||
|
<p>Aside from supporting encrypted databases, SEE-enabled builds behave
|
||||||
|
differently in two more respects:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> <p>The SQLiteDatabase.<a href="http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#enableWriteAheadLogging()">enableWriteAheadLogging()</a> method does not enable
|
||||||
|
connection pooling. It is not possible for connection pooling to be
|
||||||
|
used with a SEE-enabled build (even if the database is unencrypted).
|
||||||
|
|
||||||
|
<li> <p>In Android, if database corruption is encountered, or if an attempt is
|
||||||
|
made to open a file that is not an SQLite database, the default
|
||||||
|
behaviour is to delete the file and create an empty database file in
|
||||||
|
its place. In a SEE-enabled build, the default behaviour is to throw
|
||||||
|
an exception.<br><br>
|
||||||
|
The reason for this is that supplying an incorrect encryption key
|
||||||
|
is indistinguishable from opening a file that is not a database file.
|
||||||
|
And it seems too dangerous to simply delete the file in this case.
|
||||||
|
<br><br>
|
||||||
|
The default behaviour can be overriden using the
|
||||||
|
<a href="http://developer.android.com/reference/android/database/DatabaseErrorHandler.html">DatabaseErrorHandler</a> interface.
|
||||||
|
|
||||||
|
</ol>
|
189270
packages/myddas/sqlite3/sqlite3.c
Normal file
189270
packages/myddas/sqlite3/sqlite3.c
Normal file
File diff suppressed because it is too large
Load Diff
546
packages/myddas/sqlite3/sqlite3ext.h
Normal file
546
packages/myddas/sqlite3/sqlite3ext.h
Normal file
@ -0,0 +1,546 @@
|
|||||||
|
/*
|
||||||
|
** 2006 June 7
|
||||||
|
**
|
||||||
|
** The author disclaims copyright to this source code. In place of
|
||||||
|
** a legal notice, here is a blessing:
|
||||||
|
**
|
||||||
|
** May you do good and not evil.
|
||||||
|
** May you find forgiveness for yourself and forgive others.
|
||||||
|
** May you share freely, never taking more than you give.
|
||||||
|
**
|
||||||
|
*************************************************************************
|
||||||
|
** This header file defines the SQLite interface for use by
|
||||||
|
** shared libraries that want to be imported as extensions into
|
||||||
|
** an SQLite instance. Shared libraries that intend to be loaded
|
||||||
|
** as extensions by SQLite should #include this file instead of
|
||||||
|
** sqlite3.h.
|
||||||
|
*/
|
||||||
|
#ifndef _SQLITE3EXT_H_
|
||||||
|
#define _SQLITE3EXT_H_
|
||||||
|
#include "sqlite3.h"
|
||||||
|
|
||||||
|
typedef struct sqlite3_api_routines sqlite3_api_routines;
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following structure holds pointers to all of the SQLite API
|
||||||
|
** routines.
|
||||||
|
**
|
||||||
|
** WARNING: In order to maintain backwards compatibility, add new
|
||||||
|
** interfaces to the end of this structure only. If you insert new
|
||||||
|
** interfaces in the middle of this structure, then older different
|
||||||
|
** versions of SQLite will not be able to load each other's shared
|
||||||
|
** libraries!
|
||||||
|
*/
|
||||||
|
struct sqlite3_api_routines {
|
||||||
|
void * (*aggregate_context)(sqlite3_context*,int nBytes);
|
||||||
|
int (*aggregate_count)(sqlite3_context*);
|
||||||
|
int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
|
||||||
|
int (*bind_double)(sqlite3_stmt*,int,double);
|
||||||
|
int (*bind_int)(sqlite3_stmt*,int,int);
|
||||||
|
int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
|
||||||
|
int (*bind_null)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_parameter_count)(sqlite3_stmt*);
|
||||||
|
int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
|
||||||
|
const char * (*bind_parameter_name)(sqlite3_stmt*,int);
|
||||||
|
int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
|
||||||
|
int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
|
||||||
|
int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
|
||||||
|
int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
|
||||||
|
int (*busy_timeout)(sqlite3*,int ms);
|
||||||
|
int (*changes)(sqlite3*);
|
||||||
|
int (*close)(sqlite3*);
|
||||||
|
int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const char*));
|
||||||
|
int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
||||||
|
int eTextRep,const void*));
|
||||||
|
const void * (*column_blob)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_bytes16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_count)(sqlite3_stmt*pStmt);
|
||||||
|
const char * (*column_database_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_database_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_decltype)(sqlite3_stmt*,int i);
|
||||||
|
const void * (*column_decltype16)(sqlite3_stmt*,int);
|
||||||
|
double (*column_double)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_int)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
|
||||||
|
const char * (*column_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_origin_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_origin_name16)(sqlite3_stmt*,int);
|
||||||
|
const char * (*column_table_name)(sqlite3_stmt*,int);
|
||||||
|
const void * (*column_table_name16)(sqlite3_stmt*,int);
|
||||||
|
const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
|
||||||
|
const void * (*column_text16)(sqlite3_stmt*,int iCol);
|
||||||
|
int (*column_type)(sqlite3_stmt*,int iCol);
|
||||||
|
sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
|
||||||
|
void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
|
||||||
|
int (*complete)(const char*sql);
|
||||||
|
int (*complete16)(const void*sql);
|
||||||
|
int (*create_collation)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_collation16)(sqlite3*,const void*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*));
|
||||||
|
int (*create_function)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_function16)(sqlite3*,const void*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*));
|
||||||
|
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
|
||||||
|
int (*data_count)(sqlite3_stmt*pStmt);
|
||||||
|
sqlite3 * (*db_handle)(sqlite3_stmt*);
|
||||||
|
int (*declare_vtab)(sqlite3*,const char*);
|
||||||
|
int (*enable_shared_cache)(int);
|
||||||
|
int (*errcode)(sqlite3*db);
|
||||||
|
const char * (*errmsg)(sqlite3*);
|
||||||
|
const void * (*errmsg16)(sqlite3*);
|
||||||
|
int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
|
||||||
|
int (*expired)(sqlite3_stmt*);
|
||||||
|
int (*finalize)(sqlite3_stmt*pStmt);
|
||||||
|
void (*free)(void*);
|
||||||
|
void (*free_table)(char**result);
|
||||||
|
int (*get_autocommit)(sqlite3*);
|
||||||
|
void * (*get_auxdata)(sqlite3_context*,int);
|
||||||
|
int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
|
||||||
|
int (*global_recover)(void);
|
||||||
|
void (*interruptx)(sqlite3*);
|
||||||
|
sqlite_int64 (*last_insert_rowid)(sqlite3*);
|
||||||
|
const char * (*libversion)(void);
|
||||||
|
int (*libversion_number)(void);
|
||||||
|
void *(*malloc)(int);
|
||||||
|
char * (*mprintf)(const char*,...);
|
||||||
|
int (*open)(const char*,sqlite3**);
|
||||||
|
int (*open16)(const void*,sqlite3**);
|
||||||
|
int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
|
||||||
|
void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
|
||||||
|
void *(*realloc)(void*,int);
|
||||||
|
int (*reset)(sqlite3_stmt*pStmt);
|
||||||
|
void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_double)(sqlite3_context*,double);
|
||||||
|
void (*result_error)(sqlite3_context*,const char*,int);
|
||||||
|
void (*result_error16)(sqlite3_context*,const void*,int);
|
||||||
|
void (*result_int)(sqlite3_context*,int);
|
||||||
|
void (*result_int64)(sqlite3_context*,sqlite_int64);
|
||||||
|
void (*result_null)(sqlite3_context*);
|
||||||
|
void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
|
||||||
|
void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
|
||||||
|
void (*result_value)(sqlite3_context*,sqlite3_value*);
|
||||||
|
void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
|
||||||
|
int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
|
||||||
|
const char*,const char*),void*);
|
||||||
|
void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
|
||||||
|
char * (*snprintf)(int,char*,const char*,...);
|
||||||
|
int (*step)(sqlite3_stmt*);
|
||||||
|
int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
|
||||||
|
char const**,char const**,int*,int*,int*);
|
||||||
|
void (*thread_cleanup)(void);
|
||||||
|
int (*total_changes)(sqlite3*);
|
||||||
|
void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
|
||||||
|
int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
|
||||||
|
void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
|
||||||
|
sqlite_int64),void*);
|
||||||
|
void * (*user_data)(sqlite3_context*);
|
||||||
|
const void * (*value_blob)(sqlite3_value*);
|
||||||
|
int (*value_bytes)(sqlite3_value*);
|
||||||
|
int (*value_bytes16)(sqlite3_value*);
|
||||||
|
double (*value_double)(sqlite3_value*);
|
||||||
|
int (*value_int)(sqlite3_value*);
|
||||||
|
sqlite_int64 (*value_int64)(sqlite3_value*);
|
||||||
|
int (*value_numeric_type)(sqlite3_value*);
|
||||||
|
const unsigned char * (*value_text)(sqlite3_value*);
|
||||||
|
const void * (*value_text16)(sqlite3_value*);
|
||||||
|
const void * (*value_text16be)(sqlite3_value*);
|
||||||
|
const void * (*value_text16le)(sqlite3_value*);
|
||||||
|
int (*value_type)(sqlite3_value*);
|
||||||
|
char *(*vmprintf)(const char*,va_list);
|
||||||
|
/* Added ??? */
|
||||||
|
int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
|
||||||
|
/* Added by 3.3.13 */
|
||||||
|
int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
||||||
|
int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
||||||
|
int (*clear_bindings)(sqlite3_stmt*);
|
||||||
|
/* Added by 3.4.1 */
|
||||||
|
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
|
||||||
|
void (*xDestroy)(void *));
|
||||||
|
/* Added by 3.5.0 */
|
||||||
|
int (*bind_zeroblob)(sqlite3_stmt*,int,int);
|
||||||
|
int (*blob_bytes)(sqlite3_blob*);
|
||||||
|
int (*blob_close)(sqlite3_blob*);
|
||||||
|
int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
|
||||||
|
int,sqlite3_blob**);
|
||||||
|
int (*blob_read)(sqlite3_blob*,void*,int,int);
|
||||||
|
int (*blob_write)(sqlite3_blob*,const void*,int,int);
|
||||||
|
int (*create_collation_v2)(sqlite3*,const char*,int,void*,
|
||||||
|
int(*)(void*,int,const void*,int,const void*),
|
||||||
|
void(*)(void*));
|
||||||
|
int (*file_control)(sqlite3*,const char*,int,void*);
|
||||||
|
sqlite3_int64 (*memory_highwater)(int);
|
||||||
|
sqlite3_int64 (*memory_used)(void);
|
||||||
|
sqlite3_mutex *(*mutex_alloc)(int);
|
||||||
|
void (*mutex_enter)(sqlite3_mutex*);
|
||||||
|
void (*mutex_free)(sqlite3_mutex*);
|
||||||
|
void (*mutex_leave)(sqlite3_mutex*);
|
||||||
|
int (*mutex_try)(sqlite3_mutex*);
|
||||||
|
int (*open_v2)(const char*,sqlite3**,int,const char*);
|
||||||
|
int (*release_memory)(int);
|
||||||
|
void (*result_error_nomem)(sqlite3_context*);
|
||||||
|
void (*result_error_toobig)(sqlite3_context*);
|
||||||
|
int (*sleep)(int);
|
||||||
|
void (*soft_heap_limit)(int);
|
||||||
|
sqlite3_vfs *(*vfs_find)(const char*);
|
||||||
|
int (*vfs_register)(sqlite3_vfs*,int);
|
||||||
|
int (*vfs_unregister)(sqlite3_vfs*);
|
||||||
|
int (*xthreadsafe)(void);
|
||||||
|
void (*result_zeroblob)(sqlite3_context*,int);
|
||||||
|
void (*result_error_code)(sqlite3_context*,int);
|
||||||
|
int (*test_control)(int, ...);
|
||||||
|
void (*randomness)(int,void*);
|
||||||
|
sqlite3 *(*context_db_handle)(sqlite3_context*);
|
||||||
|
int (*extended_result_codes)(sqlite3*,int);
|
||||||
|
int (*limit)(sqlite3*,int,int);
|
||||||
|
sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
|
||||||
|
const char *(*sql)(sqlite3_stmt*);
|
||||||
|
int (*status)(int,int*,int*,int);
|
||||||
|
int (*backup_finish)(sqlite3_backup*);
|
||||||
|
sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
|
||||||
|
int (*backup_pagecount)(sqlite3_backup*);
|
||||||
|
int (*backup_remaining)(sqlite3_backup*);
|
||||||
|
int (*backup_step)(sqlite3_backup*,int);
|
||||||
|
const char *(*compileoption_get)(int);
|
||||||
|
int (*compileoption_used)(const char*);
|
||||||
|
int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
|
||||||
|
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
||||||
|
void (*xFinal)(sqlite3_context*),
|
||||||
|
void(*xDestroy)(void*));
|
||||||
|
int (*db_config)(sqlite3*,int,...);
|
||||||
|
sqlite3_mutex *(*db_mutex)(sqlite3*);
|
||||||
|
int (*db_status)(sqlite3*,int,int*,int*,int);
|
||||||
|
int (*extended_errcode)(sqlite3*);
|
||||||
|
void (*log)(int,const char*,...);
|
||||||
|
sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
|
||||||
|
const char *(*sourceid)(void);
|
||||||
|
int (*stmt_status)(sqlite3_stmt*,int,int);
|
||||||
|
int (*strnicmp)(const char*,const char*,int);
|
||||||
|
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
|
||||||
|
int (*wal_autocheckpoint)(sqlite3*,int);
|
||||||
|
int (*wal_checkpoint)(sqlite3*,const char*);
|
||||||
|
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
|
||||||
|
int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
|
||||||
|
int (*vtab_config)(sqlite3*,int op,...);
|
||||||
|
int (*vtab_on_conflict)(sqlite3*);
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
int (*close_v2)(sqlite3*);
|
||||||
|
const char *(*db_filename)(sqlite3*,const char*);
|
||||||
|
int (*db_readonly)(sqlite3*,const char*);
|
||||||
|
int (*db_release_memory)(sqlite3*);
|
||||||
|
const char *(*errstr)(int);
|
||||||
|
int (*stmt_busy)(sqlite3_stmt*);
|
||||||
|
int (*stmt_readonly)(sqlite3_stmt*);
|
||||||
|
int (*stricmp)(const char*,const char*);
|
||||||
|
int (*uri_boolean)(const char*,const char*,int);
|
||||||
|
sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
|
||||||
|
const char *(*uri_parameter)(const char*,const char*);
|
||||||
|
char *(*vsnprintf)(int,char*,const char*,va_list);
|
||||||
|
int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
int (*auto_extension)(void(*)(void));
|
||||||
|
int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*),unsigned char);
|
||||||
|
int (*cancel_auto_extension)(void(*)(void));
|
||||||
|
int (*load_extension)(sqlite3*,const char*,const char*,char**);
|
||||||
|
void *(*malloc64)(sqlite3_uint64);
|
||||||
|
sqlite3_uint64 (*msize)(void*);
|
||||||
|
void *(*realloc64)(void*,sqlite3_uint64);
|
||||||
|
void (*reset_auto_extension)(void);
|
||||||
|
void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64,
|
||||||
|
void(*)(void*));
|
||||||
|
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
||||||
|
void(*)(void*), unsigned char);
|
||||||
|
int (*strglob)(const char*,const char*);
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
sqlite3_value *(*value_dup)(const sqlite3_value*);
|
||||||
|
void (*value_free)(sqlite3_value*);
|
||||||
|
int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64);
|
||||||
|
int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64);
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
unsigned int (*value_subtype)(sqlite3_value*);
|
||||||
|
void (*result_subtype)(sqlite3_context*,unsigned int);
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int);
|
||||||
|
int (*strlike)(const char*,const char*,unsigned int);
|
||||||
|
int (*db_cacheflush)(sqlite3*);
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
int (*system_errno)(sqlite3*);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following macros redefine the API routines so that they are
|
||||||
|
** redirected through the global sqlite3_api structure.
|
||||||
|
**
|
||||||
|
** This header file is also used by the loadext.c source file
|
||||||
|
** (part of the main SQLite library - not an extension) so that
|
||||||
|
** it can get access to the sqlite3_api_routines structure
|
||||||
|
** definition. But the main library does not want to redefine
|
||||||
|
** the API. So the redefinition macros are only valid if the
|
||||||
|
** SQLITE_CORE macros is undefined.
|
||||||
|
*/
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
|
||||||
|
#endif
|
||||||
|
#define sqlite3_bind_blob sqlite3_api->bind_blob
|
||||||
|
#define sqlite3_bind_double sqlite3_api->bind_double
|
||||||
|
#define sqlite3_bind_int sqlite3_api->bind_int
|
||||||
|
#define sqlite3_bind_int64 sqlite3_api->bind_int64
|
||||||
|
#define sqlite3_bind_null sqlite3_api->bind_null
|
||||||
|
#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
|
||||||
|
#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
|
||||||
|
#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
|
||||||
|
#define sqlite3_bind_text sqlite3_api->bind_text
|
||||||
|
#define sqlite3_bind_text16 sqlite3_api->bind_text16
|
||||||
|
#define sqlite3_bind_value sqlite3_api->bind_value
|
||||||
|
#define sqlite3_busy_handler sqlite3_api->busy_handler
|
||||||
|
#define sqlite3_busy_timeout sqlite3_api->busy_timeout
|
||||||
|
#define sqlite3_changes sqlite3_api->changes
|
||||||
|
#define sqlite3_close sqlite3_api->close
|
||||||
|
#define sqlite3_collation_needed sqlite3_api->collation_needed
|
||||||
|
#define sqlite3_collation_needed16 sqlite3_api->collation_needed16
|
||||||
|
#define sqlite3_column_blob sqlite3_api->column_blob
|
||||||
|
#define sqlite3_column_bytes sqlite3_api->column_bytes
|
||||||
|
#define sqlite3_column_bytes16 sqlite3_api->column_bytes16
|
||||||
|
#define sqlite3_column_count sqlite3_api->column_count
|
||||||
|
#define sqlite3_column_database_name sqlite3_api->column_database_name
|
||||||
|
#define sqlite3_column_database_name16 sqlite3_api->column_database_name16
|
||||||
|
#define sqlite3_column_decltype sqlite3_api->column_decltype
|
||||||
|
#define sqlite3_column_decltype16 sqlite3_api->column_decltype16
|
||||||
|
#define sqlite3_column_double sqlite3_api->column_double
|
||||||
|
#define sqlite3_column_int sqlite3_api->column_int
|
||||||
|
#define sqlite3_column_int64 sqlite3_api->column_int64
|
||||||
|
#define sqlite3_column_name sqlite3_api->column_name
|
||||||
|
#define sqlite3_column_name16 sqlite3_api->column_name16
|
||||||
|
#define sqlite3_column_origin_name sqlite3_api->column_origin_name
|
||||||
|
#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
|
||||||
|
#define sqlite3_column_table_name sqlite3_api->column_table_name
|
||||||
|
#define sqlite3_column_table_name16 sqlite3_api->column_table_name16
|
||||||
|
#define sqlite3_column_text sqlite3_api->column_text
|
||||||
|
#define sqlite3_column_text16 sqlite3_api->column_text16
|
||||||
|
#define sqlite3_column_type sqlite3_api->column_type
|
||||||
|
#define sqlite3_column_value sqlite3_api->column_value
|
||||||
|
#define sqlite3_commit_hook sqlite3_api->commit_hook
|
||||||
|
#define sqlite3_complete sqlite3_api->complete
|
||||||
|
#define sqlite3_complete16 sqlite3_api->complete16
|
||||||
|
#define sqlite3_create_collation sqlite3_api->create_collation
|
||||||
|
#define sqlite3_create_collation16 sqlite3_api->create_collation16
|
||||||
|
#define sqlite3_create_function sqlite3_api->create_function
|
||||||
|
#define sqlite3_create_function16 sqlite3_api->create_function16
|
||||||
|
#define sqlite3_create_module sqlite3_api->create_module
|
||||||
|
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2
|
||||||
|
#define sqlite3_data_count sqlite3_api->data_count
|
||||||
|
#define sqlite3_db_handle sqlite3_api->db_handle
|
||||||
|
#define sqlite3_declare_vtab sqlite3_api->declare_vtab
|
||||||
|
#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
|
||||||
|
#define sqlite3_errcode sqlite3_api->errcode
|
||||||
|
#define sqlite3_errmsg sqlite3_api->errmsg
|
||||||
|
#define sqlite3_errmsg16 sqlite3_api->errmsg16
|
||||||
|
#define sqlite3_exec sqlite3_api->exec
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_expired sqlite3_api->expired
|
||||||
|
#endif
|
||||||
|
#define sqlite3_finalize sqlite3_api->finalize
|
||||||
|
#define sqlite3_free sqlite3_api->free
|
||||||
|
#define sqlite3_free_table sqlite3_api->free_table
|
||||||
|
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
|
||||||
|
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
|
||||||
|
#define sqlite3_get_table sqlite3_api->get_table
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_global_recover sqlite3_api->global_recover
|
||||||
|
#endif
|
||||||
|
#define sqlite3_interrupt sqlite3_api->interruptx
|
||||||
|
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
|
||||||
|
#define sqlite3_libversion sqlite3_api->libversion
|
||||||
|
#define sqlite3_libversion_number sqlite3_api->libversion_number
|
||||||
|
#define sqlite3_malloc sqlite3_api->malloc
|
||||||
|
#define sqlite3_mprintf sqlite3_api->mprintf
|
||||||
|
#define sqlite3_open sqlite3_api->open
|
||||||
|
#define sqlite3_open16 sqlite3_api->open16
|
||||||
|
#define sqlite3_prepare sqlite3_api->prepare
|
||||||
|
#define sqlite3_prepare16 sqlite3_api->prepare16
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_profile sqlite3_api->profile
|
||||||
|
#define sqlite3_progress_handler sqlite3_api->progress_handler
|
||||||
|
#define sqlite3_realloc sqlite3_api->realloc
|
||||||
|
#define sqlite3_reset sqlite3_api->reset
|
||||||
|
#define sqlite3_result_blob sqlite3_api->result_blob
|
||||||
|
#define sqlite3_result_double sqlite3_api->result_double
|
||||||
|
#define sqlite3_result_error sqlite3_api->result_error
|
||||||
|
#define sqlite3_result_error16 sqlite3_api->result_error16
|
||||||
|
#define sqlite3_result_int sqlite3_api->result_int
|
||||||
|
#define sqlite3_result_int64 sqlite3_api->result_int64
|
||||||
|
#define sqlite3_result_null sqlite3_api->result_null
|
||||||
|
#define sqlite3_result_text sqlite3_api->result_text
|
||||||
|
#define sqlite3_result_text16 sqlite3_api->result_text16
|
||||||
|
#define sqlite3_result_text16be sqlite3_api->result_text16be
|
||||||
|
#define sqlite3_result_text16le sqlite3_api->result_text16le
|
||||||
|
#define sqlite3_result_value sqlite3_api->result_value
|
||||||
|
#define sqlite3_rollback_hook sqlite3_api->rollback_hook
|
||||||
|
#define sqlite3_set_authorizer sqlite3_api->set_authorizer
|
||||||
|
#define sqlite3_set_auxdata sqlite3_api->set_auxdata
|
||||||
|
#define sqlite3_snprintf sqlite3_api->snprintf
|
||||||
|
#define sqlite3_step sqlite3_api->step
|
||||||
|
#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
|
||||||
|
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
|
||||||
|
#define sqlite3_total_changes sqlite3_api->total_changes
|
||||||
|
#define sqlite3_trace sqlite3_api->trace
|
||||||
|
#ifndef SQLITE_OMIT_DEPRECATED
|
||||||
|
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
|
||||||
|
#endif
|
||||||
|
#define sqlite3_update_hook sqlite3_api->update_hook
|
||||||
|
#define sqlite3_user_data sqlite3_api->user_data
|
||||||
|
#define sqlite3_value_blob sqlite3_api->value_blob
|
||||||
|
#define sqlite3_value_bytes sqlite3_api->value_bytes
|
||||||
|
#define sqlite3_value_bytes16 sqlite3_api->value_bytes16
|
||||||
|
#define sqlite3_value_double sqlite3_api->value_double
|
||||||
|
#define sqlite3_value_int sqlite3_api->value_int
|
||||||
|
#define sqlite3_value_int64 sqlite3_api->value_int64
|
||||||
|
#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
|
||||||
|
#define sqlite3_value_text sqlite3_api->value_text
|
||||||
|
#define sqlite3_value_text16 sqlite3_api->value_text16
|
||||||
|
#define sqlite3_value_text16be sqlite3_api->value_text16be
|
||||||
|
#define sqlite3_value_text16le sqlite3_api->value_text16le
|
||||||
|
#define sqlite3_value_type sqlite3_api->value_type
|
||||||
|
#define sqlite3_vmprintf sqlite3_api->vmprintf
|
||||||
|
#define sqlite3_vsnprintf sqlite3_api->vsnprintf
|
||||||
|
#define sqlite3_overload_function sqlite3_api->overload_function
|
||||||
|
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
||||||
|
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
||||||
|
#define sqlite3_clear_bindings sqlite3_api->clear_bindings
|
||||||
|
#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
|
||||||
|
#define sqlite3_blob_bytes sqlite3_api->blob_bytes
|
||||||
|
#define sqlite3_blob_close sqlite3_api->blob_close
|
||||||
|
#define sqlite3_blob_open sqlite3_api->blob_open
|
||||||
|
#define sqlite3_blob_read sqlite3_api->blob_read
|
||||||
|
#define sqlite3_blob_write sqlite3_api->blob_write
|
||||||
|
#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
|
||||||
|
#define sqlite3_file_control sqlite3_api->file_control
|
||||||
|
#define sqlite3_memory_highwater sqlite3_api->memory_highwater
|
||||||
|
#define sqlite3_memory_used sqlite3_api->memory_used
|
||||||
|
#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
|
||||||
|
#define sqlite3_mutex_enter sqlite3_api->mutex_enter
|
||||||
|
#define sqlite3_mutex_free sqlite3_api->mutex_free
|
||||||
|
#define sqlite3_mutex_leave sqlite3_api->mutex_leave
|
||||||
|
#define sqlite3_mutex_try sqlite3_api->mutex_try
|
||||||
|
#define sqlite3_open_v2 sqlite3_api->open_v2
|
||||||
|
#define sqlite3_release_memory sqlite3_api->release_memory
|
||||||
|
#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
|
||||||
|
#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
|
||||||
|
#define sqlite3_sleep sqlite3_api->sleep
|
||||||
|
#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
|
||||||
|
#define sqlite3_vfs_find sqlite3_api->vfs_find
|
||||||
|
#define sqlite3_vfs_register sqlite3_api->vfs_register
|
||||||
|
#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
|
||||||
|
#define sqlite3_threadsafe sqlite3_api->xthreadsafe
|
||||||
|
#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
|
||||||
|
#define sqlite3_result_error_code sqlite3_api->result_error_code
|
||||||
|
#define sqlite3_test_control sqlite3_api->test_control
|
||||||
|
#define sqlite3_randomness sqlite3_api->randomness
|
||||||
|
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
|
||||||
|
#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
|
||||||
|
#define sqlite3_limit sqlite3_api->limit
|
||||||
|
#define sqlite3_next_stmt sqlite3_api->next_stmt
|
||||||
|
#define sqlite3_sql sqlite3_api->sql
|
||||||
|
#define sqlite3_status sqlite3_api->status
|
||||||
|
#define sqlite3_backup_finish sqlite3_api->backup_finish
|
||||||
|
#define sqlite3_backup_init sqlite3_api->backup_init
|
||||||
|
#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
|
||||||
|
#define sqlite3_backup_remaining sqlite3_api->backup_remaining
|
||||||
|
#define sqlite3_backup_step sqlite3_api->backup_step
|
||||||
|
#define sqlite3_compileoption_get sqlite3_api->compileoption_get
|
||||||
|
#define sqlite3_compileoption_used sqlite3_api->compileoption_used
|
||||||
|
#define sqlite3_create_function_v2 sqlite3_api->create_function_v2
|
||||||
|
#define sqlite3_db_config sqlite3_api->db_config
|
||||||
|
#define sqlite3_db_mutex sqlite3_api->db_mutex
|
||||||
|
#define sqlite3_db_status sqlite3_api->db_status
|
||||||
|
#define sqlite3_extended_errcode sqlite3_api->extended_errcode
|
||||||
|
#define sqlite3_log sqlite3_api->log
|
||||||
|
#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
|
||||||
|
#define sqlite3_sourceid sqlite3_api->sourceid
|
||||||
|
#define sqlite3_stmt_status sqlite3_api->stmt_status
|
||||||
|
#define sqlite3_strnicmp sqlite3_api->strnicmp
|
||||||
|
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
|
||||||
|
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
|
||||||
|
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
|
||||||
|
#define sqlite3_wal_hook sqlite3_api->wal_hook
|
||||||
|
#define sqlite3_blob_reopen sqlite3_api->blob_reopen
|
||||||
|
#define sqlite3_vtab_config sqlite3_api->vtab_config
|
||||||
|
#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
|
||||||
|
/* Version 3.7.16 and later */
|
||||||
|
#define sqlite3_close_v2 sqlite3_api->close_v2
|
||||||
|
#define sqlite3_db_filename sqlite3_api->db_filename
|
||||||
|
#define sqlite3_db_readonly sqlite3_api->db_readonly
|
||||||
|
#define sqlite3_db_release_memory sqlite3_api->db_release_memory
|
||||||
|
#define sqlite3_errstr sqlite3_api->errstr
|
||||||
|
#define sqlite3_stmt_busy sqlite3_api->stmt_busy
|
||||||
|
#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly
|
||||||
|
#define sqlite3_stricmp sqlite3_api->stricmp
|
||||||
|
#define sqlite3_uri_boolean sqlite3_api->uri_boolean
|
||||||
|
#define sqlite3_uri_int64 sqlite3_api->uri_int64
|
||||||
|
#define sqlite3_uri_parameter sqlite3_api->uri_parameter
|
||||||
|
#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf
|
||||||
|
#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2
|
||||||
|
/* Version 3.8.7 and later */
|
||||||
|
#define sqlite3_auto_extension sqlite3_api->auto_extension
|
||||||
|
#define sqlite3_bind_blob64 sqlite3_api->bind_blob64
|
||||||
|
#define sqlite3_bind_text64 sqlite3_api->bind_text64
|
||||||
|
#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension
|
||||||
|
#define sqlite3_load_extension sqlite3_api->load_extension
|
||||||
|
#define sqlite3_malloc64 sqlite3_api->malloc64
|
||||||
|
#define sqlite3_msize sqlite3_api->msize
|
||||||
|
#define sqlite3_realloc64 sqlite3_api->realloc64
|
||||||
|
#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension
|
||||||
|
#define sqlite3_result_blob64 sqlite3_api->result_blob64
|
||||||
|
#define sqlite3_result_text64 sqlite3_api->result_text64
|
||||||
|
#define sqlite3_strglob sqlite3_api->strglob
|
||||||
|
/* Version 3.8.11 and later */
|
||||||
|
#define sqlite3_value_dup sqlite3_api->value_dup
|
||||||
|
#define sqlite3_value_free sqlite3_api->value_free
|
||||||
|
#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64
|
||||||
|
#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64
|
||||||
|
/* Version 3.9.0 and later */
|
||||||
|
#define sqlite3_value_subtype sqlite3_api->value_subtype
|
||||||
|
#define sqlite3_result_subtype sqlite3_api->result_subtype
|
||||||
|
/* Version 3.10.0 and later */
|
||||||
|
#define sqlite3_status64 sqlite3_api->status64
|
||||||
|
#define sqlite3_strlike sqlite3_api->strlike
|
||||||
|
#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush
|
||||||
|
/* Version 3.12.0 and later */
|
||||||
|
#define sqlite3_system_errno sqlite3_api->system_errno
|
||||||
|
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
||||||
|
|
||||||
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
||||||
|
/* This case when the file really is being compiled as a loadable
|
||||||
|
** extension */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0;
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v;
|
||||||
|
# define SQLITE_EXTENSION_INIT3 \
|
||||||
|
extern const sqlite3_api_routines *sqlite3_api;
|
||||||
|
#else
|
||||||
|
/* This case when the file is being statically linked into the
|
||||||
|
** application */
|
||||||
|
# define SQLITE_EXTENSION_INIT1 /*no-op*/
|
||||||
|
# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */
|
||||||
|
# define SQLITE_EXTENSION_INIT3 /*no-op*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _SQLITE3EXT_H_ */
|
Reference in New Issue
Block a user