You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.3 KiB
188 lines
4.3 KiB
package org.n0m.pawsqlite; |
|
|
|
import org.json.JSONArray; |
|
import org.json.JSONException; |
|
import org.json.JSONObject; |
|
|
|
import android.database.sqlite.SQLiteDatabase; |
|
import android.database.sqlite.SQLiteStatement; |
|
import android.database.SQLException; |
|
import android.database.Cursor; |
|
|
|
|
|
class QueryWrapper { |
|
static enum QueryType { |
|
SELECT, |
|
INSERT, |
|
UPDATE, |
|
DELETE, |
|
BEGIN, |
|
COMMIT, |
|
ROLLBACK, |
|
OTHER |
|
} |
|
|
|
SQLiteDatabase db; |
|
String query; |
|
QueryType queryType; |
|
JSONArray args; |
|
|
|
public QueryWrapper(SQLiteDatabase db, String query, JSONArray args) { |
|
this.db = db; |
|
this.args = args; |
|
|
|
query = query.trim(); |
|
|
|
// Strip trailing semi-colon |
|
if (query.endsWith(";")) { |
|
query = query.substring(0, query.length() - 1); |
|
} |
|
|
|
String operation = query |
|
.replaceAll("[^a-zA-Z].*", "") |
|
.toUpperCase(); |
|
|
|
try { |
|
queryType = QueryType.valueOf(operation); |
|
} catch (IllegalArgumentException e) { |
|
queryType = QueryType.OTHER; |
|
} |
|
|
|
this.query = query; |
|
} |
|
|
|
public JSONObject execute() throws JSONException, SQLException { |
|
JSONObject result = new JSONObject(); |
|
|
|
result.put("query", query); |
|
result.put("args", args); |
|
|
|
switch (queryType) { |
|
case SELECT: |
|
executeRaw(result); |
|
break; |
|
case INSERT: |
|
executeInsert(result); |
|
break; |
|
case UPDATE: |
|
case DELETE: |
|
executeUpdateDelete(result); |
|
break; |
|
default: |
|
executeOther(result); |
|
break; |
|
} |
|
|
|
return result; |
|
} |
|
|
|
private JSONObject executeInsert(JSONObject result) throws JSONException, SQLException { |
|
SQLiteStatement statement = compileStatement(); |
|
|
|
long rowId = statement.executeInsert(); |
|
|
|
result.put("insertId", rowId); |
|
|
|
// Allow chaining |
|
return result; |
|
} |
|
|
|
|
|
private JSONObject executeUpdateDelete(JSONObject result) throws JSONException, SQLException { |
|
SQLiteStatement statement = compileStatement(); |
|
|
|
int rowsAffected = statement.executeUpdateDelete(); |
|
|
|
result.put("rowsAffected", rowsAffected); |
|
|
|
// Allow chaining |
|
return result; |
|
} |
|
|
|
private JSONObject executeOther(JSONObject result) throws JSONException, SQLException { |
|
SQLiteStatement statement = compileStatement(); |
|
statement.execute(); |
|
return result; |
|
} |
|
|
|
|
|
private SQLiteStatement compileStatement() throws JSONException, SQLException { |
|
SQLiteStatement statement = db.compileStatement(query); |
|
|
|
for (int i = 0; i < args.length(); i++) { |
|
if (args.get(i) instanceof Float || args.get(i) instanceof Double) { |
|
statement.bindDouble(i + 1, args.getDouble(i)); |
|
} else if (args.get(i) instanceof Number) { |
|
statement.bindLong(i + 1, args.getLong(i)); |
|
} else if (args.isNull(i)) { |
|
statement.bindNull(i + 1); |
|
} else { |
|
statement.bindString(i + 1, args.getString(i)); |
|
} |
|
} |
|
|
|
return statement; |
|
} |
|
|
|
|
|
private JSONObject executeRaw(JSONObject result) throws JSONException { |
|
String[] stringArgs = new String[args.length()]; |
|
|
|
for (int i = 0; i < args.length(); i++) { |
|
if (args.isNull(i)) { |
|
stringArgs[i] = ""; |
|
} else { |
|
stringArgs[i] = args.getString(i); |
|
} |
|
} |
|
|
|
Cursor cur = db.rawQuery(query, stringArgs); |
|
|
|
if (cur != null) { |
|
JSONArray rows = cursorToJSONArray(cur); |
|
result.put("rows", rows); |
|
cur.close(); |
|
} |
|
|
|
// Allow chaining |
|
return result; |
|
} |
|
|
|
private JSONArray cursorToJSONArray(Cursor cur) throws JSONException { |
|
JSONArray rows = new JSONArray(); |
|
|
|
if (cur != null && cur.moveToFirst()) { |
|
int colCount = cur.getColumnCount(); |
|
|
|
do { |
|
JSONObject row = new JSONObject(); |
|
|
|
for (int i = 0; i < colCount; i++) { |
|
String key = cur.getColumnName(i); |
|
|
|
switch(cur.getType(i)) { |
|
case Cursor.FIELD_TYPE_NULL: |
|
row.put(key, JSONObject.NULL); |
|
break; |
|
case Cursor.FIELD_TYPE_INTEGER: |
|
row.put(key, cur.getLong(i)); |
|
break; |
|
case Cursor.FIELD_TYPE_FLOAT: |
|
row.put(key, cur.getDouble(i)); |
|
break; |
|
case Cursor.FIELD_TYPE_STRING: |
|
case Cursor.FIELD_TYPE_BLOB: |
|
default: |
|
row.put(key, cur.getString(i)); |
|
break; |
|
} |
|
} |
|
|
|
rows.put(row); |
|
} |
|
while (cur.moveToNext()); |
|
} |
|
|
|
return rows; |
|
} |
|
} |