mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Change behaviour in sql save, don't rewrite all database
This commit is contained in:
@@ -153,14 +153,16 @@ namespace mRemoteNG.Config.Connections
|
||||
|
||||
private void UpdateConnectionsTable(RootNodeInfo rootTreeNode, IDatabaseConnector databaseConnector)
|
||||
{
|
||||
var dataProvider = new SqlDataProvider(databaseConnector);
|
||||
var currentDataTable = dataProvider.Load();
|
||||
|
||||
var cryptoProvider = new LegacyRijndaelCryptographyProvider();
|
||||
var serializer = new DataTableSerializer(_saveFilter, cryptoProvider,
|
||||
rootTreeNode.PasswordString.ConvertToSecureString());
|
||||
serializer.SetSourceDataTable(currentDataTable);
|
||||
var dataTable = serializer.Serialize(rootTreeNode);
|
||||
var dataProvider = new SqlDataProvider(databaseConnector);
|
||||
|
||||
var dbQuery = databaseConnector.DbCommand("DELETE FROM tblCons");
|
||||
dbQuery.ExecuteNonQuery();
|
||||
//var dbQuery = databaseConnector.DbCommand("DELETE FROM tblCons");
|
||||
//dbQuery.ExecuteNonQuery();
|
||||
|
||||
dataProvider.Save(dataTable);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ using mRemoteNG.Tools;
|
||||
using mRemoteNG.Tree;
|
||||
using mRemoteNG.Tree.Root;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Security;
|
||||
@@ -13,9 +14,15 @@ namespace mRemoteNG.Config.Serializers.MsSql
|
||||
{
|
||||
public class DataTableSerializer : ISerializer<ConnectionInfo, DataTable>
|
||||
{
|
||||
public readonly int DELETE = 0;
|
||||
public readonly int ADD = 1;
|
||||
public readonly int UPDATE = 2;
|
||||
private readonly ICryptographyProvider _cryptographyProvider;
|
||||
private readonly SecureString _encryptionKey;
|
||||
private DataTable _dataTable;
|
||||
private DataTable _sourceDataTable;
|
||||
private Dictionary<string, int> modifiedPrimaryKeyDict = new Dictionary<string, int>();
|
||||
private Dictionary<string, int> sourcePrimaryKeyDict = new Dictionary<string, int>();
|
||||
private const string TableName = "tblCons";
|
||||
private readonly SaveFilter _saveFilter;
|
||||
private int _currentNodeIndex;
|
||||
@@ -31,6 +38,11 @@ namespace mRemoteNG.Config.Serializers.MsSql
|
||||
_encryptionKey = encryptionKey.ThrowIfNull(nameof(encryptionKey));
|
||||
}
|
||||
|
||||
public void SetSourceDataTable(DataTable sourceDataTable)
|
||||
{
|
||||
_sourceDataTable = sourceDataTable;
|
||||
}
|
||||
|
||||
|
||||
public DataTable Serialize(ConnectionTreeModel connectionTreeModel)
|
||||
{
|
||||
@@ -51,15 +63,33 @@ namespace mRemoteNG.Config.Serializers.MsSql
|
||||
{
|
||||
_dataTable = BuildTable();
|
||||
_currentNodeIndex = 0;
|
||||
// Register add or update row
|
||||
SerializeNodesRecursive(serializationTarget);
|
||||
var entryToDelete = sourcePrimaryKeyDict.Keys.Where(x => !modifiedPrimaryKeyDict.ContainsKey(x)).ToList();
|
||||
foreach( var entry in entryToDelete)
|
||||
{
|
||||
_dataTable.Rows.Find(entry).Delete();
|
||||
}
|
||||
return _dataTable;
|
||||
}
|
||||
|
||||
private DataTable BuildTable()
|
||||
{
|
||||
var dataTable = new DataTable(TableName);
|
||||
CreateSchema(dataTable);
|
||||
SetPrimaryKey(dataTable);
|
||||
DataTable dataTable;
|
||||
if (_sourceDataTable != null)
|
||||
{
|
||||
dataTable = _sourceDataTable;
|
||||
}else
|
||||
{
|
||||
dataTable = new DataTable(TableName);
|
||||
|
||||
}
|
||||
if (dataTable.Columns.Count == 0) CreateSchema(dataTable);
|
||||
if (dataTable.PrimaryKey.Length == 0 ) SetPrimaryKey(dataTable);
|
||||
foreach(DataRow row in dataTable.Rows)
|
||||
{
|
||||
sourcePrimaryKeyDict.Add((string)row["ConstantID"], DELETE);
|
||||
}
|
||||
return dataTable;
|
||||
}
|
||||
|
||||
@@ -219,11 +249,22 @@ namespace mRemoteNG.Config.Serializers.MsSql
|
||||
private void SerializeConnectionInfo(ConnectionInfo connectionInfo)
|
||||
{
|
||||
_currentNodeIndex++;
|
||||
var dataRow = _dataTable.NewRow();
|
||||
dataRow["ID"] = DBNull.Value;
|
||||
var isNewRow = false;
|
||||
DataRow dataRow = _dataTable.Rows.Find(connectionInfo.ConstantID);
|
||||
if (dataRow == null)
|
||||
{
|
||||
dataRow = _dataTable.NewRow();
|
||||
//dataRow["ID"] = DBNull.Value;
|
||||
dataRow["ConstantID"] = connectionInfo.ConstantID;
|
||||
isNewRow = true;
|
||||
modifiedPrimaryKeyDict.Add(connectionInfo.ConstantID, ADD);
|
||||
}
|
||||
else
|
||||
{
|
||||
modifiedPrimaryKeyDict.Add(connectionInfo.ConstantID, UPDATE);
|
||||
}
|
||||
dataRow["Name"] = connectionInfo.Name;
|
||||
dataRow["Type"] = connectionInfo.GetTreeNodeType().ToString();
|
||||
dataRow["ConstantID"] = connectionInfo.ConstantID;
|
||||
dataRow["ParentID"] = connectionInfo.Parent?.ConstantID ?? "";
|
||||
dataRow["PositionID"] = _currentNodeIndex;
|
||||
dataRow["LastChange"] = MiscTools.DBTimeStampNow();
|
||||
@@ -419,8 +460,7 @@ namespace mRemoteNG.Config.Serializers.MsSql
|
||||
dataRow["InheritRDGatewayDomain"] = false;
|
||||
dataRow["InheritRdpVersion"] = false;
|
||||
}
|
||||
|
||||
_dataTable.Rows.Add(dataRow);
|
||||
if (isNewRow)_dataTable.Rows.Add(dataRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user