public override int ExecuteSql(string sql, QueryParameterCollection parameters = null) { lock (this) // although sqlite3 is thread-safe, we need to make sure that the last_insert_rowid is correct { var stopwatch = SqlLogger != null?Stopwatch.StartNew() : null; var stmt = CreateCommand(sql, parameters); try { int returnCode = SQLitePCL.raw.sqlite3_step(stmt); if (returnCode == SQLitePCL.raw.SQLITE_ROW) { return(0); // quietly eat any rows being returned } if (returnCode != SQLitePCL.raw.SQLITE_DONE) { throw new SqliteException((SqliteReturnCode)returnCode, (SqliteExtendedErrorCode)SQLitePCL.raw.sqlite3_extended_errcode(DbHandle), SQLitePCL.raw.sqlite3_errmsg(DbHandle).utf8_to_string()); } _lastRowId.Value = SQLitePCL.raw.sqlite3_last_insert_rowid(DbHandle); return(SQLitePCL.raw.sqlite3_changes(DbHandle)); } finally { SQLitePCL.raw.sqlite3_finalize(stmt); SqlLogger?.LogSql(sql, parameters?.ToDictionary(p => SqlDialect.CreateParameterExpression(p.Name), p => p.Value), stopwatch?.Elapsed ?? TimeSpan.Zero); } } }
public override IEnumerable <Dictionary <string, object> > ExecuteSqlReader(string sql, QueryParameterCollection parameters) { var stopwatch = SqlLogger != null?Stopwatch.StartNew() : null; var stmt = CreateCommand(sql, parameters); try { for (;;) { var returnCode = SQLitePCL.raw.sqlite3_step(stmt); if (returnCode == SQLitePCL.raw.SQLITE_BUSY) { Task.Delay(100).Wait(); continue; } if (returnCode == SQLitePCL.raw.SQLITE_DONE) { break; } if (returnCode != SQLitePCL.raw.SQLITE_ROW) { throw new SqliteException((SqliteReturnCode)returnCode, (SqliteExtendedErrorCode)SQLitePCL.raw.sqlite3_extended_errcode(DbHandle), SQLitePCL.raw.sqlite3_errmsg(DbHandle).utf8_to_string()); } Dictionary <string, object> record = new Dictionary <string, object>(); for (int i = 0; i < SQLitePCL.raw.sqlite3_column_count(stmt); i++) { string fieldName = SQLitePCL.raw.sqlite3_column_name(stmt, i).utf8_to_string(); var columnType = SQLitePCL.raw.sqlite3_column_type(stmt, i); switch (columnType) { case SQLitePCL.raw.SQLITE_BLOB: record[fieldName] = SQLitePCL.raw.sqlite3_column_blob(stmt, i).ToArray(); break; case SQLitePCL.raw.SQLITE_TEXT: record[fieldName] = SQLitePCL.raw.sqlite3_column_text(stmt, i).utf8_to_string(); break; case SQLitePCL.raw.SQLITE_FLOAT: record[fieldName] = SQLitePCL.raw.sqlite3_column_double(stmt, i); break; case SQLitePCL.raw.SQLITE_INTEGER: record[fieldName] = SQLitePCL.raw.sqlite3_column_int64(stmt, i); break; case SQLitePCL.raw.SQLITE_NULL: record[fieldName] = null; break; } } yield return(record); } } finally { SQLitePCL.raw.sqlite3_finalize(stmt); } SqlLogger?.LogSql(sql, parameters?.ToDictionary(p => SqlDialect.CreateParameterExpression(p.Name), p => p.Value), stopwatch?.Elapsed ?? TimeSpan.Zero); }