Browse Source

add table output

master
jkpete 4 weeks ago
parent
commit
c53ebf7ebd
  1. 2
      Example/SaveSystem/Script/ViewSaveSystem.cs
  2. 2
      addons/EGFramework/Module/GenerateTools/Templete/Godot/Dialog/EGodotBasicDialog.cs
  3. 1
      addons/EGFramework/Module/GenerateTools/Templete/Godot/Dialog/EGodotFileDialog.cs
  4. 1
      addons/EGFramework/Module/GenerateTools/Templete/Godot/UI/EGodotSaveTable.cs
  5. 11
      addons/EGFramework/Module/GenerateTools/Templete/Godot/UI/EGodotTable.cs
  6. 40
      addons/EGFramework/Module/SaveTools/Data/EGCsvSave.cs
  7. 10
      addons/EGFramework/Module/SaveTools/Data/EGDapper.cs
  8. 8
      addons/EGFramework/Module/SaveTools/Data/EGLiteDBSave.cs
  9. 2
      addons/EGFramework/Module/SaveTools/Data/EGSqliteSave.cs
  10. 352
      addons/EGFramework/Module/SaveTools/EGSave.cs
  11. 4
      addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs

2
Example/SaveSystem/Script/ViewSaveSystem.cs

@ -26,7 +26,7 @@ namespace EGFramework.Examples.Test { @@ -26,7 +26,7 @@ namespace EGFramework.Examples.Test {
EGodotTable table = container.CreateNode<EGodotTable>("Default");
table.InitData<DataStudent>(dataStudents);
IEGSaveData SqliteTest = this.EGSave().LoadDataFile<EGSqliteSave>("SaveData/test.db");
EGSqliteSave SqliteTest = this.EGSave().Load<EGSqliteSave>("SaveData/test.db");
EGodotSaveTable PersonTable = container.CreateNode<EGodotSaveTable>("SQLite");
PersonTable.InitSaveData<EGSqliteSave>(SqliteTest);
PersonTable.InitData<DataPerson>("person");

2
addons/EGFramework/Module/GenerateTools/Templete/Godot/Dialog/EGodotBasicDialog.cs

@ -31,7 +31,7 @@ namespace EGFramework.UI @@ -31,7 +31,7 @@ namespace EGFramework.UI
{
EGodotFileDialog fileDialog = self.PopupNode<EGodotFileDialog>("FileDialog");
fileDialog.Title = title;
fileDialog.RootSubfolder = filePath;
fileDialog.CurrentFile = filePath;
fileDialog.InitSaveFileSelect(selectPath);
}

1
addons/EGFramework/Module/GenerateTools/Templete/Godot/Dialog/EGodotFileDialog.cs

@ -19,6 +19,7 @@ namespace EGFramework.UI @@ -19,6 +19,7 @@ namespace EGFramework.UI
this.DirSelected += OnDirSelect.Invoke;
this.FilesSelected += OnFilesSelect.Invoke;
this.Size = new Vector2I(480, 320);
this.Access = AccessEnum.Filesystem;
IsInit = true;
}
}

1
addons/EGFramework/Module/GenerateTools/Templete/Godot/UI/EGodotSaveTable.cs

@ -33,6 +33,7 @@ namespace EGFramework.UI @@ -33,6 +33,7 @@ namespace EGFramework.UI
CurrentDataKey = key;
EmptyData = typeof(T).EGenerateEmptyDictiontaryByType();
QueryPage.Register(() => QueryPageData<T>());
TableName = typeof(T).Name;
InitFunctionMenu();
InitTitle(typeof(T).EGenerateDictiontaryByType());
InitRowData(null);

11
addons/EGFramework/Module/GenerateTools/Templete/Godot/UI/EGodotTable.cs

@ -37,6 +37,8 @@ namespace EGFramework.UI @@ -37,6 +37,8 @@ namespace EGFramework.UI
public Vector2 MinimumFunctionButtonSize = new Vector2(120,0);
public string TableName { set; get; } = "-";
/// <summary>
/// The max data count for one page.
/// </summary>
@ -58,6 +60,7 @@ namespace EGFramework.UI @@ -58,6 +60,7 @@ namespace EGFramework.UI
this.Vertical = true;
EmptyData = typeof(T).EGenerateEmptyDictiontaryByType();
TitleData = typeof(T).EGenerateDictiontaryByType();
TableName = typeof(T).Name;
InitFunctionMenu();
InitTitle(TitleData);
InitRowData(tableData.EGenerateDictionaryByGroup());
@ -81,7 +84,11 @@ namespace EGFramework.UI @@ -81,7 +84,11 @@ namespace EGFramework.UI
public virtual void OnOutputFile(string path)
{
GD.Print("File has been Saved at " + path);
EGCsvSave eGCsvSave = new EGCsvSave();
eGCsvSave.InitSave(path);
eGCsvSave.AddGroup("",TableData);
OS.ShellOpen(path);
}
public virtual void OnInputFile(string path)
@ -112,7 +119,7 @@ namespace EGFramework.UI @@ -112,7 +119,7 @@ namespace EGFramework.UI
Button output = FunctionContainer.CreateNode<Button>("output");
output.Text = "Output";
// output.Connect("pressed", Callable.From());
output.Connect("pressed", Callable.From(()=>this.EGFileSave(TableName+".csv",OnOutputFile)));
output.FocusMode = FocusModeEnum.None;
output.CustomMinimumSize = MinimumFunctionButtonSize;

40
addons/EGFramework/Module/SaveTools/Data/EGCsvSave.cs

@ -6,6 +6,7 @@ using System.Linq; @@ -6,6 +6,7 @@ using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Reflection;
using System.Configuration;
namespace EGFramework
{
@ -48,6 +49,14 @@ namespace EGFramework @@ -48,6 +49,14 @@ namespace EGFramework
DefaultPath = path;
try
{
if (!File.Exists(path))
{
FileStream newCsvFile = File.Create(path);
CsvDataBlock = new List<string[]>();
newCsvFile.Close();
newCsvFile.Dispose();
return;
}
FileStream fileStream = new FileStream(path,FileMode.Open);
byte[] buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, (int)fileStream.Length);
@ -294,6 +303,36 @@ namespace EGFramework @@ -294,6 +303,36 @@ namespace EGFramework
this.WriteDataBlock(DefaultPath);
}
public void AddGroup(string datakey, List<Dictionary<string, object>> dataGroup)
{
if (IsReadOnly)
{
throw new Exception("This file is readonly! can't set any data to file.");
}
foreach (Dictionary<string, object> data in dataGroup)
{
if (CsvDataHeader.Count == 0)
{
int id = 0;
foreach (string key in data.Keys)
{
CsvDataHeader.Add(key, id);
id++;
}
}
string[] csvSet = new string[CsvDataHeader.Keys.Count()];
foreach (KeyValuePair<string, object> param in data)
{
if (CsvDataHeader.ContainsKey(param.Key))
{
csvSet[CsvDataHeader[param.Key]] = param.Value.ToString();
}
}
CsvDataBlock.Add(csvSet);
}
this.WriteDataBlock(DefaultPath);
}
public int RemoveData(string dataKey, object id)
{
if (IsReadOnly)
@ -407,6 +446,7 @@ namespace EGFramework @@ -407,6 +446,7 @@ namespace EGFramework
}
}
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]

10
addons/EGFramework/Module/SaveTools/Data/EGDapper.cs

@ -132,6 +132,14 @@ namespace EGFramework @@ -132,6 +132,14 @@ namespace EGFramework
int count = Connection.Execute("insert into " + dataKey + "(" + keySet + ") values(" + keySetParam + ")");
}
public void AddGroup(string datakey, List<Dictionary<string, object>> dataGroup)
{
foreach (Dictionary<string, object> data in dataGroup)
{
this.AddData(datakey, data);
}
}
public int RemoveData(string dataKey, object id)
{
int count = Connection.Execute(@"delete from " + dataKey + " where id = @ID", new { ID = id });
@ -272,5 +280,7 @@ namespace EGFramework @@ -272,5 +280,7 @@ namespace EGFramework
Connection.Execute(@"DROP TABLE IF EXISTS "+dataKey+"");
}
}
}
}

8
addons/EGFramework/Module/SaveTools/Data/EGLiteDBSave.cs

@ -93,6 +93,14 @@ namespace EGFramework @@ -93,6 +93,14 @@ namespace EGFramework
collection.Insert(keyValuePairs);
}
public void AddGroup(string datakey, List<Dictionary<string, object>> dataGroup)
{
foreach (Dictionary<string, object> data in dataGroup)
{
this.AddData(datakey, data);
}
}
public int RemoveData(string dataKey, object id)
{
ILiteCollection<BsonDocument> collection = Database.GetCollection(dataKey);

2
addons/EGFramework/Module/SaveTools/Data/EGSqliteSave.cs

@ -30,7 +30,7 @@ namespace EGFramework{ @@ -30,7 +30,7 @@ namespace EGFramework{
Connection = new SqliteConnection("Data Source="+dataBaseName+";Mode=ReadWriteCreate;"); // Open the connection:
try
{
Connection.Open();
// Connection.Open();
this.Conn = dataBaseName;
IsInit = true;
}

352
addons/EGFramework/Module/SaveTools/EGSave.cs

@ -2,21 +2,10 @@ using System; @@ -2,21 +2,10 @@ using System;
using System.IO;
using System.Collections.Generic;
using Dapper;
using System.Linq;
namespace EGFramework
{
public enum TypeEGSave{
Json = 0,
Bson = 1,
Byte = 2,
XML = 3
}
public enum TypeDBSave{
Csv = 0,
Sqlite = 1,
LiteDB = 2,
}
public class EGSave : EGModule
{
#region About Godot File's PATH
@ -25,356 +14,53 @@ namespace EGFramework @@ -25,356 +14,53 @@ namespace EGFramework
// You can use ProjectSettings.GlobalizePath("") to convert a "local" path like res://path/to/file.txt to an absolute OS path.
#endregion
private Dictionary<string,IEGSaveData> DataBaseFiles = new Dictionary<string,IEGSaveData>();
private Dictionary<string,IEGSaveObject> ObjectFiles = new Dictionary<string,IEGSaveObject>();
public HashSet<string> KeySet = new HashSet<string>();
public Dictionary<string, object> SaveMapping = new Dictionary<string, object>();
private Dictionary<string,IEGSaveDataReadOnly> DataBaseReadOnly = new Dictionary<string, IEGSaveDataReadOnly>();
private Dictionary<string,IEGSaveObjectReadOnly> ObjectReadOnly = new Dictionary<string,IEGSaveObjectReadOnly>();
public EGSave() {}
public EGJsonSave DefaultJsonSave { set; get; }
public EGSave() { }
public override void Init()
{
LoadObjectFile<EGJsonSave>("SaveData/DefaultJsonSave.json");
DefaultJsonSave = Load<EGJsonSave>("SaveData/DefaultJsonSave.json");
}
#region Load Data or Object and Unload
public TSaveData LoadDataFile<TSaveData>(string path) where TSaveData : IEGSaveData, IEGSave, new()
public TSaveData Load<TSaveData>(string path) where TSaveData : IEGSave, new()
{
KeySet.Add(path);
TSaveData saveData = new TSaveData();
saveData.InitSave(path);
if (!DataBaseFiles.ContainsKey(path))
{
DataBaseFiles.Add(path, saveData);
}
else
{
DataBaseFiles[path] = saveData;
}
SaveMapping.Add(path, saveData);
return saveData;
}
public TReadOnlyData ReadData<TReadOnlyData>(string key, string data) where TReadOnlyData : IEGSaveDataReadOnly, IEGSaveReadOnly, new()
public TReadOnlyData Read<TReadOnlyData>(string key, string data) where TReadOnlyData : IEGSaveReadOnly, new()
{
KeySet.Add(key);
TReadOnlyData readOnlyData = new TReadOnlyData();
readOnlyData.InitReadOnly(data);
if (!DataBaseReadOnly.ContainsKey(key))
{
DataBaseReadOnly.Add(key, readOnlyData);
}
else
{
DataBaseReadOnly[key] = readOnlyData;
}
SaveMapping.Add(key, readOnlyData);
return readOnlyData;
}
public TReadOnlyData ReadData<TReadOnlyData>(string key, byte[] data) where TReadOnlyData : IEGSaveDataReadOnly, IEGSaveReadOnly, new()
public TReadOnlyData Read<TReadOnlyData>(string key, byte[] data) where TReadOnlyData : IEGSaveReadOnly, new()
{
KeySet.Add(key);
TReadOnlyData readOnlyData = new TReadOnlyData();
readOnlyData.InitReadOnly(data);
if (!DataBaseReadOnly.ContainsKey(key))
{
DataBaseReadOnly.Add(key, readOnlyData);
}
else
{
DataBaseReadOnly[key] = readOnlyData;
}
SaveMapping.Add(key, readOnlyData);
return readOnlyData;
}
public TSaveObject LoadObjectFile<TSaveObject>(string path) where TSaveObject:IEGSaveObject,IEGSave,new(){
TSaveObject saveObject = new TSaveObject();
saveObject.InitSave(path);
if(!ObjectFiles.ContainsKey(path)){
ObjectFiles.Add(path, saveObject);
}else{
ObjectFiles[path] = saveObject;
}
return saveObject;
}
public TReadOnlyObject ReadObject<TReadOnlyObject>(string key, string data) where TReadOnlyObject : IEGSaveObjectReadOnly, IEGSaveReadOnly, new()
{
TReadOnlyObject readOnlyObject = new TReadOnlyObject();
readOnlyObject.InitReadOnly(data);
if (!ObjectReadOnly.ContainsKey(key))
{
ObjectReadOnly.Add(key, readOnlyObject);
}
else
{
ObjectReadOnly[key] = readOnlyObject;
}
return readOnlyObject;
}
public TReadOnlyObject ReadObject<TReadOnlyObject>(string key,byte[] data) where TReadOnlyObject:IEGSaveObjectReadOnly,IEGSaveReadOnly,new(){
TReadOnlyObject readOnlyObject = new TReadOnlyObject();
readOnlyObject.InitReadOnly(data);
if(!ObjectReadOnly.ContainsKey(key)){
ObjectReadOnly.Add(key,readOnlyObject);
}else{
ObjectReadOnly[key] = readOnlyObject;
}
return readOnlyObject;
}
public void Unload(string keyOrPath){
if(DataBaseReadOnly.ContainsKey(keyOrPath)){
DataBaseReadOnly.Remove(keyOrPath);
}else if(ObjectReadOnly.ContainsKey(keyOrPath)){
ObjectReadOnly.Remove(keyOrPath);
}else if(DataBaseFiles.ContainsKey(keyOrPath)){
DataBaseFiles.Remove(keyOrPath);
}else if(ObjectFiles.ContainsKey(keyOrPath)){
ObjectFiles.Remove(keyOrPath);
}else{
throw new Exception("Key is not found!");
}
}
#endregion
#region Keys Operation
/// <summary>
/// Get all file keys which has been loaded.
/// </summary>
/// <returns></returns>
public List<string> GetKeys(){
List<string> keys = new List<string>();
foreach(string key in DataBaseReadOnly.Keys){
keys.Add(key);
}
foreach(string key in ObjectReadOnly.Keys){
keys.Add(key);
}
foreach(string key in DataBaseFiles.Keys){
keys.Add(key);
}
foreach(string key in ObjectFiles.Keys){
keys.Add(key);
}
return keys;
}
/// <summary>
/// Get all data file keys (or relational database in remote such as mysql) which has been loaded.
/// </summary>
/// <returns></returns>
public List<string> GetDataKeys(){
List<string> keys = new List<string>();
foreach(string key in DataBaseReadOnly.Keys){
keys.Add(key);
}
foreach(string key in DataBaseFiles.Keys){
keys.Add(key);
}
return keys;
}
/// <summary>
/// Get all object file keys (or key-value database in remote such as redis) which has been loaded.
/// </summary>
/// <returns></returns>
public List<string> GetObjectKeys(){
List<string> keys = new List<string>();
foreach(string key in ObjectReadOnly.Keys){
keys.Add(key);
}
foreach(string key in ObjectFiles.Keys){
keys.Add(key);
}
return keys;
}
#endregion
#region Get or Search data and object
public bool ContainsObject(string path, string key)
{
if (ObjectFiles.ContainsKey(path))
{
return ObjectFiles[path].ContainsKey(key);
}
else if (ObjectReadOnly.ContainsKey(path))
{
return ObjectReadOnly[path].ContainsKey(key);
}
else
{
throw new Exception("File not loaded, you should use LoadObjectFile(key) or ReadObject(key) first.");
}
}
public bool ContainsData(string path, string key)
{
if (DataBaseFiles.ContainsKey(path))
{
return DataBaseFiles[path].ContainsKey(key);
}
else if (DataBaseReadOnly.ContainsKey(path))
{
return DataBaseReadOnly[path].ContainsKey(key);
}
else
{
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key) first.");
}
}
public IEnumerable<string> ListObject(string path)
{
if (ObjectFiles.ContainsKey(path))
{
return ObjectFiles[path].GetKeys();
}
else if (ObjectReadOnly.ContainsKey(path))
{
return ObjectReadOnly[path].GetKeys();
}
else
{
throw new Exception("File not loaded, you should use LoadObjectFile(key) or ReadObject(key) first.");
}
}
public IEnumerable<string> ListData(string path, string key)
{
if (DataBaseFiles.ContainsKey(path))
{
return DataBaseFiles[path].GetKeys();
}
else if (DataBaseReadOnly.ContainsKey(path))
{
return DataBaseReadOnly[path].GetKeys();
}
else
{
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key) first.");
}
}
public TObject GetObject<TObject>(string path, string key) where TObject : new()
{
if (ObjectFiles.ContainsKey(path))
{
return ObjectFiles[path].GetObject<TObject>(key);
}
else if (ObjectReadOnly.ContainsKey(path))
{
return ObjectReadOnly[path].GetObject<TObject>(key);
}
else
{
throw new Exception("File not loaded, you should use LoadObjectFile(key) or ReadObject(key) first.");
}
}
public TData GetData<TData>(string keyOrPath,string key,int id) where TData : new(){
if(DataBaseFiles.ContainsKey(keyOrPath)){
return DataBaseFiles[keyOrPath].GetData<TData>(key,id);
}else if(DataBaseReadOnly.ContainsKey(keyOrPath)){
return DataBaseReadOnly[keyOrPath].GetData<TData>(key,id);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first.");
}
}
public IEnumerable<TData> GetAllData<TData>(string keyOrPath,string key) where TData : new(){
if(DataBaseFiles.ContainsKey(keyOrPath)){
return DataBaseFiles[keyOrPath].GetAll<TData>(key);
}else if(DataBaseReadOnly.ContainsKey(keyOrPath)){
return DataBaseReadOnly[keyOrPath].GetAll<TData>(key);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first.");
}
}
public IEnumerable<TData> FindData<TData>(string keyOrPath,string key,System.Linq.Expressions.Expression<Func<TData, bool>> expression) where TData : new(){
if(DataBaseFiles.ContainsKey(keyOrPath)){
return DataBaseFiles[keyOrPath].FindData<TData>(key,expression);
}else if(DataBaseReadOnly.ContainsKey(keyOrPath)){
return DataBaseReadOnly[keyOrPath].FindData<TData>(key,expression);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first.");
}
}
#endregion
#region Set or Add or Update data and object
public void SetObject<TObject>(string path,string objectKey,TObject obj){
if(ObjectFiles.ContainsKey(path)){
ObjectFiles[path].SetObject(objectKey,obj);
}else{
throw new Exception("File not loaded, you should use LoadObjectFile(key) first.");
}
}
public void SetData<TData>(string path,string dataKey,TData data,int id){
if(DataBaseFiles.ContainsKey(path)){
DataBaseFiles[path].SetData(dataKey,data,id);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(path) first.");
}
}
public void AddObject<TObject>(string path,string objectKey,TObject obj){
if(ObjectFiles.ContainsKey(path)){
ObjectFiles[path].AddObject(objectKey,obj);
}else{
throw new Exception("File not loaded, you should use LoadObjectFile(key) first.");
}
}
public void AddData<TData>(string path,string dataKey,TData data){
if(DataBaseFiles.ContainsKey(path)){
DataBaseFiles[path].AddData(dataKey,data);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(path) first.");
}
}
public void AddData<TData>(string path,string dataKey,IEnumerable<TData> data){
if(DataBaseFiles.ContainsKey(path)){
DataBaseFiles[path].AddData(dataKey,data);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(path) first.");
}
}
public void UpdateObject<TObject>(string path,string objectKey,TObject obj){
if(ObjectFiles.ContainsKey(path)){
ObjectFiles[path].UpdateObject(objectKey,obj);
}else{
throw new Exception("File not loaded, you should use LoadObjectFile(key) first.");
}
}
public void UpdateData<TData>(string path,string dataKey,TData data,int id){
if(DataBaseFiles.ContainsKey(path)){
DataBaseFiles[path].UpdateData(dataKey,data,id);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(path) first.");
}
}
public void RemoveObject<TObject>(string path,string objectKey){
if(ObjectFiles.ContainsKey(path)){
ObjectFiles[path].RemoveObject<TObject>(objectKey);
}else{
throw new Exception("File not loaded, you should use LoadObjectFile(key) first.");
}
}
public void RemoveData(string path,string dataKey,int id){
if(DataBaseFiles.ContainsKey(path)){
DataBaseFiles[path].RemoveData(dataKey,id);
}else{
throw new Exception("File not loaded, you should use LoadDataFile(path) first.");
}
}
#endregion
#region Default Json Operation
public void SetObjectToJson<TObject>(TObject obj){
ObjectFiles["SaveData/DefaultJsonSave.json"].SetObject(typeof(TObject).ToString(),obj);
public void SetObjectToJson<TObject>(TObject obj)
{
DefaultJsonSave.SetObject(typeof(TObject).ToString(), obj);
}
public TObject GetObjectFromJson<TObject>() where TObject : new(){
return ObjectFiles["SaveData/DefaultJsonSave.json"].GetObject<TObject>(typeof(TObject).ToString());
return DefaultJsonSave.GetObject<TObject>(typeof(TObject).ToString());
}
#endregion

4
addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs

@ -10,7 +10,8 @@ namespace EGFramework @@ -10,7 +10,8 @@ namespace EGFramework
{
#region SaveInit
public interface IEGSave {
public interface IEGSave
{
void InitSave(string path);
}
public interface IEGSaveReadOnly {
@ -86,6 +87,7 @@ namespace EGFramework @@ -86,6 +87,7 @@ namespace EGFramework
void AddData<TData>(string dataKey,TData data);
void AddData<TData>(string dataKey,IEnumerable<TData> data);
void AddData(string datakey, Dictionary<string, object> data);
void AddGroup(string datakey, List<Dictionary<string, object>> dataGroup);
int RemoveData(string dataKey,object id);
void UpdateData(string dataKey, Dictionary<string, object> data, object id);
void UpdateData<TData>(string dataKey,TData data,object id);

Loading…
Cancel
Save