Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ public String getUrl() {
*/
public void open() throws Exception {
int curVersion;
String openPhase = "init";

String password = "";
if (_encrypted && (_mode.equals("secret") || _mode.equals("encryption") || _mode.equals("decryption"))) {
Expand Down Expand Up @@ -273,17 +274,20 @@ public void open() throws Exception {
}
try {
if (!isNCDB() && !this._readOnly) {
openPhase = "openOrCreateDatabase";
_db = SQLiteDatabase.openOrCreateDatabase(_file, password, null, null);
} else {
openPhase = "openDatabase";
_db = SQLiteDatabase.openDatabase(String.valueOf(_file), password, null, SQLiteDatabase.OPEN_READONLY, null);
}
if (_db != null) {
if (_db.isOpen()) {
// set the Foreign Key Pragma ON
openPhase = "setForeignKeyConstraintsEnabled";
try {
_db.setForeignKeyConstraintsEnabled(true);
} catch (IllegalStateException e) {
String msg = "Failed in setForeignKeyConstraintsEnabled " + e.getMessage();
String msg = buildOpenErrorMessage(openPhase, e);
Log.v(TAG, msg);
close();
_db = null;
Expand All @@ -293,17 +297,19 @@ public void open() throws Exception {
_isOpen = true;
return;
}
openPhase = "getVersion";
try {
curVersion = _db.getVersion(); // default 0
} catch (IllegalStateException e) {
String msg = "Failed in get/setVersion " + e.getMessage();
String msg = buildOpenErrorMessage(openPhase, e);
Log.v(TAG, msg);
close();
_db = null;
throw new Exception(msg);
}
if (_version > curVersion && _vUpgObject != null && _vUpgObject.size() > 0) {
// if (_vUpgObject != null && _vUpgObject.size() > 0) {
openPhase = "onUpgrade";
try {
this._uFile.copyFile(_context, _dbName, "backup-" + _dbName);

Expand Down Expand Up @@ -341,13 +347,33 @@ public void open() throws Exception {
throw new Exception("No database returned");
}
} catch (Exception e) {
String msg = "Error in creating the database" + e.getMessage();
String msg = buildOpenErrorMessage(openPhase, e);
_isOpen = false;
_db = null;
throw new Exception(msg);
}
}

private String buildOpenErrorMessage(String phase, Exception error) {
String nativeMessage = error.getMessage() != null ? error.getMessage() : error.toString();
if (nativeMessage.startsWith("Error in creating the database phase=")) {
return nativeMessage;
}

return (
"Error in creating the database phase=" +
phase +
" database=" +
_dbName +
" file=" +
_file.getAbsolutePath() +
" errorClass=" +
error.getClass().getName() +
" message=" +
nativeMessage
);
}

/**
* Close Method
*
Expand Down
59 changes: 49 additions & 10 deletions ios/Plugin/Utils/UtilsSQLCipher.swift
Original file line number Diff line number Diff line change
Expand Up @@ -176,35 +176,74 @@ class UtilsSQLCipher {
"""
if sqlite3_exec(mDB, keyStatementString, nil, nil, nil)
!= SQLITE_OK {
let msg: String = "Wrong Secret"
let msg: String = sqliteErrorMessage(
mDB: mDB,
phase: "pragma_key",
database: filename,
fallback: "Wrong Secret")
throw UtilsSQLCipherError
.openOrCreateDatabase(message: msg)
}
}
let retB: Bool = checkDB(mDB: mDB)
if !retB {
let msg: String = "Cannot open the DB"
if let msg = checkDB(mDB: mDB, database: filename) {
throw UtilsSQLCipherError
.openOrCreateDatabase(message: msg)
}
return mDB
} else {
let message: String = "open_v2 failed"
let message: String = sqliteErrorMessage(
mDB: mDB,
phase: "sqlite3_open_v2",
database: filename,
fallback: "open_v2 failed")
throw UtilsSQLCipherError
.openOrCreateDatabase(message: message)
}
}

private class func sqliteErrorMessage(mDB: OpaquePointer?,
phase: String,
database: String,
fallback: String,
resultCode: Int32? = nil,
execMessage: String? = nil) -> String {
guard let db = mDB else {
return "\(fallback) phase=\(phase) database=\(database)"
}

let code = resultCode ?? sqlite3_errcode(db)
let extendedCode = sqlite3_extended_errcode(db)
let message = String(cString: sqlite3_errmsg(db))
let execMessagePart = execMessage.map { " execMessage=\($0)" } ?? ""

return "\(fallback) phase=\(phase) database=\(database) " +
"code=\(code) extendedCode=\(extendedCode) message=\(message)" +
execMessagePart
}

// MARK: - CheckDB

class func checkDB(mDB: OpaquePointer?) -> Bool {
var ret: Bool = false
class func checkDB(mDB: OpaquePointer?, database: String) -> String? {
var stmt: String = "SELECT count(*) FROM "
stmt.append("sqlite_master;")
if sqlite3_exec(mDB, stmt, nil, nil, nil) == SQLITE_OK {
ret = true
var errorMessage: UnsafeMutablePointer<Int8>?
let resultCode = sqlite3_exec(mDB, stmt, nil, nil, &errorMessage)
if resultCode == SQLITE_OK {
return nil
}
return ret

let execMessage = errorMessage.map { String(cString: $0) }
if let errorMessage = errorMessage {
sqlite3_free(errorMessage)
}

return sqliteErrorMessage(
mDB: mDB,
phase: "checkDB",
database: database,
fallback: "Cannot open the DB",
resultCode: resultCode,
execMessage: execMessage)
}

// MARK: - ChangePassword
Expand Down