aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/jni/sqlite_statement.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/jni/sqlite_statement.c')
-rw-r--r--src/main/jni/sqlite_statement.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/main/jni/sqlite_statement.c b/src/main/jni/sqlite_statement.c
new file mode 100644
index 000000000..2fc4ef337
--- /dev/null
+++ b/src/main/jni/sqlite_statement.c
@@ -0,0 +1,125 @@
+#include "sqlite.h"
+
+jfieldID queryArgsCountField;
+
+jint sqliteOnJNILoad(JavaVM *vm, void *reserved, JNIEnv *env) {
+ jclass class = (*env)->FindClass(env, "org/telegram/SQLite/SQLitePreparedStatement");
+ queryArgsCountField = (*env)->GetFieldID(env, class, "queryArgsCount", "I");
+ return JNI_VERSION_1_6;
+}
+
+int Java_org_telegram_SQLite_SQLitePreparedStatement_step(JNIEnv* env, jobject object, int statementHandle) {
+ sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
+
+ int errcode = sqlite3_step(handle);
+ if (errcode == SQLITE_ROW) {
+ return 0;
+ } else if(errcode == SQLITE_DONE) {
+ return 1;
+ } else if(errcode == SQLITE_BUSY) {
+ return -1;
+ }
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+}
+
+int Java_org_telegram_SQLite_SQLitePreparedStatement_prepare(JNIEnv *env, jobject object, int sqliteHandle, jstring sql) {
+ sqlite3* handle = (sqlite3 *)sqliteHandle;
+
+ char const *sqlStr = (*env)->GetStringUTFChars(env, sql, 0);
+
+ sqlite3_stmt *stmt_handle;
+
+ int errcode = sqlite3_prepare_v2(handle, sqlStr, -1, &stmt_handle, 0);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, handle, errcode);
+ } else {
+ int argsCount = sqlite3_bind_parameter_count(stmt_handle);
+ (*env)->SetIntField(env, object, queryArgsCountField, argsCount);
+ }
+
+ if (sqlStr != 0) {
+ (*env)->ReleaseStringUTFChars(env, sql, sqlStr);
+ }
+
+ return (int)stmt_handle;
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_reset(JNIEnv *env, jobject object, int statementHandle) {
+ sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
+
+ int errcode = sqlite3_reset(handle);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_finalize(JNIEnv *env, jobject object, int statementHandle) {
+ sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
+
+ int errcode = sqlite3_finalize (handle);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindByteBuffer(JNIEnv *env, jobject object, int statementHandle, int index, jobject value, int length) {
+ sqlite3_stmt *handle = (sqlite3_stmt *)statementHandle;
+ jbyte *buf = (*env)->GetDirectBufferAddress(env, value);
+
+ int errcode = sqlite3_bind_blob(handle, index, buf, length, SQLITE_STATIC);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindString(JNIEnv *env, jobject object, int statementHandle, int index, jstring value) {
+ sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
+
+ char const *valueStr = (*env)->GetStringUTFChars(env, value, 0);
+
+ int errcode = sqlite3_bind_text(handle, index, valueStr, -1, SQLITE_TRANSIENT);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+
+ if (valueStr != 0) {
+ (*env)->ReleaseStringUTFChars(env, value, valueStr);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindInt(JNIEnv *env, jobject object, int statementHandle, int index, int value) {
+ sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
+
+ int errcode = sqlite3_bind_int(handle, index, value);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindLong(JNIEnv *env, jobject object, int statementHandle, int index, long long value) {
+ sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
+
+ int errcode = sqlite3_bind_int64(handle, index, value);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindDouble(JNIEnv* env, jobject object, int statementHandle, int index, double value) {
+ sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
+
+ int errcode = sqlite3_bind_double(handle, index, value);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+
+void Java_org_telegram_SQLite_SQLitePreparedStatement_bindNull(JNIEnv* env, jobject object, int statementHandle, int index) {
+ sqlite3_stmt *handle = (sqlite3_stmt*)statementHandle;
+
+ int errcode = sqlite3_bind_null(handle, index);
+ if (SQLITE_OK != errcode) {
+ throw_sqlite3_exception(env, sqlite3_db_handle(handle), errcode);
+ }
+}
+