|
@@ -10,6 +10,7 @@ using System.Runtime.Serialization.Formatters.Binary;
|
|
|
using System.Text;
|
|
|
using InABox.Core;
|
|
|
using Microsoft.CodeAnalysis;
|
|
|
+using NPOI.SS.UserModel;
|
|
|
|
|
|
namespace InABox.Database.SQLite;
|
|
|
|
|
@@ -1327,48 +1328,174 @@ public class SQLiteProvider : IProvider
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- public void DropTable<T>()
|
|
|
+ #region Non-Entity Table operations
|
|
|
+
|
|
|
+ internal int ExecuteSQL(SQLiteWriteAccessor writer, string statement)
|
|
|
{
|
|
|
- var _tablename = typeof(T).EntityName().Split('.').Last();
|
|
|
- using (var _access = GetWriteAccess())
|
|
|
+ var result = 0;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ using (var command = writer.CreateCommand())
|
|
|
+ {
|
|
|
+ command.CommandText = statement;
|
|
|
+ result = command.ExecuteNonQuery();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
{
|
|
|
- if (!typeof(T).IsSubclassOf(typeof(Entity)))
|
|
|
+ throw;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public IEnumerable<object[]> List(string sql)
|
|
|
+ {
|
|
|
+ var result = new List<object[]>();
|
|
|
+
|
|
|
+ using (var access = GetReadAccess())
|
|
|
+ {
|
|
|
+ using (var command = access.CreateCommand())
|
|
|
{
|
|
|
- using (var _command = _access.CreateCommand())
|
|
|
+ command.CommandText = sql;
|
|
|
+
|
|
|
+ using (var reader = command.ExecuteReader())
|
|
|
{
|
|
|
- _command.CommandText = $"select name from sqlite_master where type='table' and name='{_tablename}';";
|
|
|
- bool exists = false;
|
|
|
- using (var _reader = _command.ExecuteReader())
|
|
|
+ var _colCount = reader.GetColumnSchema().Count;
|
|
|
+
|
|
|
+ foreach (var row in reader)
|
|
|
{
|
|
|
- exists = _reader.HasRows;
|
|
|
+ var values = GetValues(reader, _colCount);
|
|
|
+ result.Add(values);
|
|
|
}
|
|
|
- if (exists)
|
|
|
- ExecuteSQL(_access, $"DROP TABLE {_tablename}");
|
|
|
+ reader.Close();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
+
|
|
|
+ public CoreTable? Query(string sql)
|
|
|
+ {
|
|
|
+
|
|
|
+ CoreTable? _result = null;
|
|
|
+ try
|
|
|
+ {
|
|
|
+ using (var access = GetReadAccess())
|
|
|
+ {
|
|
|
+
|
|
|
+ using (var command = access.CreateCommand())
|
|
|
+ {
|
|
|
+ command.CommandText = sql;
|
|
|
+ using (var reader = command.ExecuteReader())
|
|
|
+ {
|
|
|
+ _result = new CoreTable();
|
|
|
+
|
|
|
+ var schema = reader.GetColumnSchema();
|
|
|
+ foreach (var column in schema)
|
|
|
+ _result.Columns.Add(new CoreColumn(column.DataType, column.ColumnName));
|
|
|
+
|
|
|
+ var _colCount = reader.GetColumnSchema().Count;
|
|
|
+
|
|
|
+ while (reader.Read())
|
|
|
+ {
|
|
|
+ var _row = _result.NewRow();
|
|
|
+ for (int i=0; i <_colCount; i++)
|
|
|
+ ReadAndDecodeValue(_result,reader,_row,i);
|
|
|
+ _result.Rows.Add(_row);
|
|
|
+ }
|
|
|
+ reader.Close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ Logger.Send(LogType.Error,"",$"Exception in Query({sql})\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
|
|
|
+ }
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
|
|
|
- internal int ExecuteSQL(SQLiteWriteAccessor writer, string statement)
|
|
|
+ public bool TableExists<T>()
|
|
|
{
|
|
|
- var result = 0;
|
|
|
+ bool _result = false;
|
|
|
+ using (var access = GetReadAccess())
|
|
|
+ {
|
|
|
+ using (var _check = access.CreateCommand())
|
|
|
+ {
|
|
|
+ _check.CommandText = $"select name from sqlite_master where type='table' and name='{typeof(T).Name.Split('.').Last()}';";
|
|
|
+ using (var _reader = _check.ExecuteReader())
|
|
|
+ {
|
|
|
+ _result = _reader.HasRows;
|
|
|
+ _reader.Close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return _result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public CoreTable? GetTable<T>()
|
|
|
+ {
|
|
|
+ var _tablename = typeof(T).Name.Split('.').Last();
|
|
|
+ if (!TableExists<T>())
|
|
|
+ return null;
|
|
|
+
|
|
|
+ CoreTable? _result = null;
|
|
|
+ var props = CoreUtils.PropertyInfoList(typeof(T), p => true, true);
|
|
|
try
|
|
|
{
|
|
|
- using (var command = writer.CreateCommand())
|
|
|
+ using (var access = GetReadAccess())
|
|
|
{
|
|
|
- command.CommandText = statement;
|
|
|
- result = command.ExecuteNonQuery();
|
|
|
+ using (var command = access.CreateCommand())
|
|
|
+ {
|
|
|
+ command.CommandText = $"select * from {_tablename}";
|
|
|
+ using (var reader = command.ExecuteReader())
|
|
|
+ {
|
|
|
+ _result = new CoreTable();
|
|
|
+ var schema = reader.GetColumnSchema();
|
|
|
+ foreach (var column in schema)
|
|
|
+ {
|
|
|
+ if (props.TryGetValue(column.ColumnName, out var _info))
|
|
|
+ _result.Columns.Add(new CoreColumn(_info.PropertyType, column.ColumnName));
|
|
|
+ else
|
|
|
+ _result.Columns.Add(new CoreColumn(column.DataType, column.ColumnName));
|
|
|
+ }
|
|
|
+
|
|
|
+ var _colCount = reader.GetColumnSchema().Count;
|
|
|
+
|
|
|
+ while (reader.Read())
|
|
|
+ {
|
|
|
+ var _row = _result.NewRow();
|
|
|
+ for (int i=0; i <_colCount; i++)
|
|
|
+ ReadAndDecodeValue(_result,reader,_row,i);
|
|
|
+ _result.Rows.Add(_row);
|
|
|
+ }
|
|
|
+ reader.Close();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
- throw;
|
|
|
+ Logger.Send(LogType.Error,"",$"Exception in GetTable: {_tablename}\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
|
|
|
}
|
|
|
-
|
|
|
- return result;
|
|
|
+ return _result;
|
|
|
}
|
|
|
-
|
|
|
- #region CRUD Operations
|
|
|
+
|
|
|
+ public void DropTable<T>()
|
|
|
+ {
|
|
|
+ if (typeof(T).IsSubclassOf(typeof(Entity)) || !TableExists<T>())
|
|
|
+ return;
|
|
|
+ using (var _access = GetWriteAccess())
|
|
|
+ {
|
|
|
+ ExecuteSQL(_access, $"DROP TABLE {typeof(T).EntityName().Split('.').Last()}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region Field Level functions
|
|
|
|
|
|
private static bool IsNull([NotNullWhen(false)] object? o)
|
|
|
{
|
|
@@ -2778,7 +2905,7 @@ public class SQLiteProvider : IProvider
|
|
|
|
|
|
#region List
|
|
|
|
|
|
- public IEnumerable<object[]> List<T>(Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, CoreRange? range = null) where T : Entity, new()
|
|
|
+ public IEnumerable<object[]> List<T>(Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, CoreRange? range = null) where T : Entity, new()
|
|
|
{
|
|
|
//Dictionary<String, TimeSpan> stopwatch = new Dictionary<string, TimeSpan>();
|
|
|
//Stopwatch sw = new Stopwatch();
|
|
@@ -2816,81 +2943,10 @@ public class SQLiteProvider : IProvider
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
-
|
|
|
- public IEnumerable<object[]> List(string sql)
|
|
|
- {
|
|
|
- var result = new List<object[]>();
|
|
|
-
|
|
|
- using (var access = GetReadAccess())
|
|
|
- {
|
|
|
- using (var command = access.CreateCommand())
|
|
|
- {
|
|
|
- command.CommandText = sql;
|
|
|
-
|
|
|
- using (var reader = command.ExecuteReader())
|
|
|
- {
|
|
|
- var _colCount = reader.GetColumnSchema().Count;
|
|
|
-
|
|
|
- foreach (var row in reader)
|
|
|
- {
|
|
|
- var values = GetValues(reader, _colCount);
|
|
|
- result.Add(values);
|
|
|
- }
|
|
|
- reader.Close();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region Query
|
|
|
-
|
|
|
- public CoreTable? Query<T>(string sql) where T: BaseObject
|
|
|
- {
|
|
|
- CoreTable? _result = null;
|
|
|
- var props = CoreUtils.PropertyInfoList(typeof(T), p => true, true);
|
|
|
- try
|
|
|
- {
|
|
|
- using (var access = GetReadAccess())
|
|
|
- {
|
|
|
- using (var command = access.CreateCommand())
|
|
|
- {
|
|
|
- command.CommandText = sql;
|
|
|
- using (var reader = command.ExecuteReader())
|
|
|
- {
|
|
|
- _result = new CoreTable();
|
|
|
- var schema = reader.GetColumnSchema();
|
|
|
- foreach (var column in schema)
|
|
|
- {
|
|
|
- if (props.TryGetValue(column.ColumnName, out var _info))
|
|
|
- _result.Columns.Add(new CoreColumn(_info.PropertyType, column.ColumnName));
|
|
|
- else
|
|
|
- _result.Columns.Add(new CoreColumn(column.DataType, column.ColumnName));
|
|
|
- }
|
|
|
-
|
|
|
- var _colCount = reader.GetColumnSchema().Count;
|
|
|
-
|
|
|
- while (reader.Read())
|
|
|
- {
|
|
|
- var _row = _result.NewRow();
|
|
|
- for (int i=0; i <_colCount; i++)
|
|
|
- ReadAndDecodeValue(_result,reader,_row,i);
|
|
|
- _result.Rows.Add(_row);
|
|
|
- }
|
|
|
- reader.Close();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- Logger.Send(LogType.Error,"",$"Exception in Query: {sql}\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
|
|
|
- }
|
|
|
- return _result;
|
|
|
- }
|
|
|
|
|
|
private CoreTable DoQueryNonGeneric(Type T, IFilter? filter = null, IColumns? columns = null, ISortOrder? sort = null, CoreRange? range = null, bool log = false, bool distinct = false)
|
|
|
{
|