Преглед на файлове

Interim Ordering Changes

frogsoftware преди 8 месеца
родител
ревизия
78296930bb
променени са 4 файла, в които са добавени 92 реда и са изтрити 10 реда
  1. 1 1
      InABox.Core/CoreTable/CoreTable.cs
  2. 9 1
      InABox.Database/IProvider.cs
  3. 81 7
      inabox.database.sqlite/SQLiteProvider.cs
  4. 1 1
      inabox.wpf/Forms/Console/Console.xaml.cs

+ 1 - 1
InABox.Core/CoreTable/CoreTable.cs

@@ -501,7 +501,7 @@ namespace InABox.Core
         public int GetColumnIndex(string columnname)
         {
             for (var i = 0; i < Columns.Count; i++)
-                if (Columns[i].ColumnName.Equals(columnname))
+                if (Columns[i].ColumnName.Equals(columnname, StringComparison.CurrentCultureIgnoreCase))
                 {
                     return i;
                 }

+ 9 - 1
InABox.Database/IProvider.cs

@@ -24,14 +24,22 @@ public interface IProvider
     
     bool TableExists<T>();
     bool TableExists(Type t);
+    bool TableExists(string name);
+    
     CoreTable? GetTable<T>();
     CoreTable? GetTable(Type t);
+    CoreTable? GetTable(string name);
+    
     void DropTable<T>();
     void DropTable(Type t);
-
+    void DropTable(string name);
+    
     IEnumerable<object[]> List(string sql);
+    
     CoreTable Query(string sql);
     
+    int Update(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();
     

+ 81 - 7
inabox.database.sqlite/SQLiteProvider.cs

@@ -1336,6 +1336,13 @@ public class SQLiteProvider : IProvider
     
     #region Non-Entity Table operations
     
+    public static readonly string RANDOMGUID =
+        "lower(hex(randomblob(4)) " +
+        "|| '-' || hex(randomblob(2)) " +
+        "|| '-' || '4' || substr(hex( randomblob(2)), 2) " +
+        "|| '-' || substr('AB89', 1 + (abs(random()) % 4) , 1)  || substr(hex(randomblob(2)), 2) " +
+        "|| '-' || hex(randomblob(6)))";
+    
     internal int ExecuteSQL(SQLiteWriteAccessor writer, string statement)
     {
         var result = 0;
@@ -1421,18 +1428,41 @@ public class SQLiteProvider : IProvider
             Logger.Send(LogType.Error,"",$"Exception in Query({sql})\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
         }
         return _result;
-     }
+    }
+
+    public int Update(string sql)
+    {
+        var _result = -1;
+        try 
+        { 
+            using (var access = GetWriteAccess())
+            {
+                using (var command = access.CreateCommand())
+                {
+                    command.CommandText = sql;
+                    _result = command.ExecuteNonQuery();
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            Logger.Send(LogType.Error,"",$"Exception in Query({sql})\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
+        }
+        return _result;
+    }
 
     public bool TableExists<T>() => TableExists(typeof(T));
 
-    public bool TableExists(Type t)
+    public bool TableExists(Type t) =>  TableExists(t.EntityName().Split('.').Last());
+    
+    public bool TableExists(string name)
     {
         bool _result = false;
         using (var access = GetReadAccess())
         {
             using (var _check = access.CreateCommand())
             {
-                _check.CommandText = $"select name from sqlite_master where type='table' and name='{t.Name.Split('.').Last()}';";
+                _check.CommandText = $"select name from sqlite_master where type='table' and name='{name}';";
                 using (var _reader = _check.ExecuteReader())
                 {
                     _result = _reader.HasRows;
@@ -1450,7 +1480,7 @@ public class SQLiteProvider : IProvider
         if (!TableExists(t))
             return null;
 
-        var _tablename = t.Name.Split('.').Last();
+        var _tablename = t.EntityName().Split('.').Last();
 
         CoreTable? _result = null;
         var props = CoreUtils.PropertyInfoList(t, p => true, true);
@@ -1495,15 +1525,59 @@ public class SQLiteProvider : IProvider
 
     }
 
+    public CoreTable? GetTable(string name)
+    {
+        if (!TableExists(name))
+            return null;
+        
+        CoreTable? _result = null;
+        try
+        {
+            using (var access = GetReadAccess())
+            {
+                using (var command = access.CreateCommand())
+                {
+                    command.CommandText = $"select * from {name}";
+                    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 GetTable: {name}\nMessage: {e.Message}\nStackTrace: {e.StackTrace}");
+        }
+        return _result;
+    }
+    
     public void DropTable<T>() => DropTable(typeof(T));
 
-    public void DropTable(Type t)
+    public void DropTable(Type t) => DropTable(t.EntityName().Split('.').Last());
+    
+    public void DropTable(string name)
     {
-        if (t.IsSubclassOf(typeof(Entity)) || !TableExists(t))
+        if (!TableExists(name))
             return;
         using (var _access = GetWriteAccess())
         {
-            ExecuteSQL(_access, $"DROP TABLE {t.EntityName().Split('.').Last()}");
+            ExecuteSQL(_access, $"DROP TABLE {name}");
         }
     }
      

+ 1 - 1
inabox.wpf/Forms/Console/Console.xaml.cs

@@ -148,7 +148,7 @@ public partial class ConsoleControl : UserControl, INotifyPropertyChanged
 
     // DATE  TRANSACTION  TYPE  USERID  MESSAGE
     [GeneratedRegex("(\\d\\d:\\d\\d:\\d\\d\\.\\d\\d\\d)\\s*([0-9a-zA-Z]{8}(?:\\-[0-9a-zA-Z]{4}){3}\\-[0-9a-zA-Z]{12})?\\s*(\\S+) (.+)", RegexOptions.Singleline)]
-    private static partial Regex LogEntryParseRegex();
+    internal static partial Regex LogEntryParseRegex();
 
     public static LogEntry? ParseLogMessage(string logLine)
     {