[jOOQ/jOOQ#7334] DataAccessException.sqlStateClass() always returns

OTHER for SQLite
This commit is contained in:
Lukas Eder 2020-07-02 11:29:23 +02:00
parent bbcc30ac76
commit d46a9a8a86
3 changed files with 38 additions and 1 deletions

View File

@ -96,7 +96,10 @@ public class DataAccessException extends RuntimeException {
public SQLStateClass sqlStateClass() {
SQLException e = getCause(SQLException.class);
if (e != null)
return SQLStateClass.fromCode(e.getSQLState());
if (e.getSQLState() != null)
return SQLStateClass.fromCode(e.getSQLState());
else if (e.getSQLState() == null && "org.sqlite.SQLiteException".equals(e.getClass().getName()))
return SQLStateClass.fromSQLiteVendorCode(e.getErrorCode());
return SQLStateClass.NONE;
}

View File

@ -176,4 +176,21 @@ public enum SQLStateClass {
SQLStateClass result = lookup.get(code.substring(0, 2));
return result != null ? result : SQLStateClass.OTHER;
}
static SQLStateClass fromSQLiteVendorCode(int errorCode) {
// See https://sqlite.org/c3ref/c_abort.html
// And https://sqlite.org/c3ref/c_abort_rollback.html
switch (errorCode & 0xFF) {
case 0: return C00_SUCCESSFUL_COMPLETION;
case 3: return C42_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION;
case 18: return C22_DATA_EXCEPTION;
case 19: return C23_INTEGRITY_CONSTRAINT_VIOLATION;
case 20: return C22_DATA_EXCEPTION;
case 27: return C01_WARNING;
case 28: return C01_WARNING;
}
return SQLStateClass.OTHER;
}
}

View File

@ -487,4 +487,21 @@ public enum SQLStateSubclass {
else
return SQLStateSubclass.OTHER;
}
static SQLStateSubclass fromSQLiteVendorCode(int errorCode) {
// See https://sqlite.org/c3ref/c_abort.html
// And https://sqlite.org/c3ref/c_abort_rollback.html
switch (errorCode & 0xFF) {
case 0: return C00000_NO_SUBCLASS;
case 3: return C42000_NO_SUBCLASS;
case 18: return C22001_STRING_DATA_RIGHT_TRUNCATION;
case 19: return C23000_NO_SUBCLASS;
case 20: return C22000_NO_SUBCLASS;
case 27: return C01000_NO_SUBCLASS;
case 28: return C01000_NO_SUBCLASS;
}
return SQLStateSubclass.OTHER;
}
}