Browse Source

Cleaned up Low Level Table interface

frogsoftware 1 week ago
parent
commit
980c7c0fe0
3 changed files with 155 additions and 98 deletions
  1. 1 1
      InABox.Database/DbFactory.cs
  2. 5 4
      InABox.Database/IProvider.cs
  3. 149 93
      inabox.database.sqlite/SQLiteProvider.cs

+ 1 - 1
InABox.Database/DbFactory.cs

@@ -95,7 +95,7 @@ public static class DbFactory
         {
             throw new Exception("Database migration failed. Aborting startup");
         }
-
+        
 
         //Load up your custom properties here!
         // Can't use clients (b/c we're inside the database layer already

+ 5 - 4
InABox.Database/IProvider.cs

@@ -21,12 +21,13 @@ public interface IProvider
     Logger Logger { get; set; }
 
     IEnumerable<object[]> List<T>(Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, CoreRange? range = null) where T : Entity, new();
-
-    IEnumerable<object[]> List(string sql);
-    
-    CoreTable? Query<T>(string sql) where T : BaseObject;
     
+    bool TableExists<T>();
+    CoreTable? GetTable<T>();
     void DropTable<T>();
+
+    IEnumerable<object[]> List(string sql);
+    CoreTable Query(string sql);
     
     CoreTable Query<T>(Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, 
         CoreRange? range = null, bool log = false, bool distinct = false) where T : Entity, new();

+ 149 - 93
inabox.database.sqlite/SQLiteProvider.cs

@@ -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)
     {