Browse Source

marked egbyte save not use,define the protocol for the byte save,add sync and async for save tools interface,new Interface: ObjectSave add,update and remove

master
jkpete 4 months ago
parent
commit
9946014202
  1. 46
      addons/EGFramework/Module/EGSave.cs
  2. 59
      addons/EGFramework/Module/SaveTools/EGByteSave.cs
  3. 47
      addons/EGFramework/Module/SaveTools/EGJsonSave.cs
  4. 37
      addons/EGFramework/Module/SaveTools/SaveToolsInterface.cs

46
addons/EGFramework/Module/SaveTools/EGSave.cs → addons/EGFramework/Module/EGSave.cs

@ -34,7 +34,7 @@ namespace EGFramework @@ -34,7 +34,7 @@ namespace EGFramework
{
LoadObjectFile<EGJsonSave>("SaveData/DefaultJsonSave.json");
}
#region Load Data or Object and Unload
public void LoadDataFile<TSaveData>(string path) where TSaveData:IEGSaveData,IEGSave,new(){
TSaveData saveData = new TSaveData();
saveData.InitSaveFile(path);
@ -110,7 +110,9 @@ namespace EGFramework @@ -110,7 +110,9 @@ namespace EGFramework
throw new Exception("Key is not found!");
}
}
#endregion
#region Keys Operation
public List<string> GetKeys(){
List<string> keys = new List<string>();
foreach(string key in DataBaseReadOnly.Keys){
@ -128,14 +130,9 @@ namespace EGFramework @@ -128,14 +130,9 @@ namespace EGFramework
return keys;
}
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.");
}
}
#endregion
#region Get or Search data and object
public TObject GetObject<TObject>(string path,string key) where TObject : new(){
if(ObjectFiles.ContainsKey(path)){
return ObjectFiles[path].GetObject<TObject>(key);
@ -145,14 +142,6 @@ namespace EGFramework @@ -145,14 +142,6 @@ namespace EGFramework
throw new Exception("File not loaded, you should use LoadObjectFile(key) or ReadObject(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 TData GetData<TData>(string keyOrPath,string key,int id) where TData : new(){
if(DataBaseFiles.ContainsKey(keyOrPath)){
return DataBaseFiles[keyOrPath].GetData<TData>(key,id);
@ -172,6 +161,25 @@ namespace EGFramework @@ -172,6 +161,25 @@ namespace EGFramework
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 IEnumerable<TData> FindData<TData>(string keyOrPath,string key,System.Linq.Expressions.Expression<Func<TData, bool>> expression) where TData : new(){
if(DataBaseFiles.ContainsKey(keyOrPath)){
@ -182,9 +190,7 @@ namespace EGFramework @@ -182,9 +190,7 @@ namespace EGFramework
throw new Exception("File not loaded, you should use LoadDataFile(key) or ReadData(key,data) first.");
}
}
//------------------------------------------------------------------------------//
#endregion
#region Default Json Operation
public void SetObjectToJson<TObject>(TObject obj){

59
addons/EGFramework/Module/SaveTools/EGByteSave.cs

@ -1,16 +1,30 @@ @@ -1,16 +1,30 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace EGFramework
{
[Obsolete("this idea can be replaced by EGFileStream")]
public class EGByteSave : IEGSave,IEGSaveObject
/// Pointer max length is 4294967295.
/// Data protocol:
/// [XX XX XX XX](Pointer length) [XX XX XX XX]...[XX XX XX XX](Pointers) [DataBlock 1]...[DataBlock N](Data)
/// 1. The first (four byte) is the length of the data pointers (uint type).
/// 2. The pointer List is the position to the data block.
/// 3. The data block is the data you want to save.
public interface IEGByteObject{
byte[] GetBytes();
void SetBytes(byte[] byteData);
}
[Obsolete("This class is not comlpete, please not use it!")]
public class EGByteObjectSave : IEGSave,IEGSaveObject
{
public Encoding StringEncoding { set; get; } = Encoding.ASCII;
private string DefaultPath { set; get; }
private byte[] Data { get; set; }
private uint PointerLength { get; set; }
private uint[] Pointer { get; set; }
private Dictionary<uint,byte[]> Data { get; set; }
private byte[] _Data;
public void ReadDataBlock(string path){
DefaultPath = path;
@ -21,7 +35,7 @@ namespace EGFramework @@ -21,7 +35,7 @@ namespace EGFramework
fileStream.Read(buffer, 0, (int)fileStream.Length);
fileStream.Close();
fileStream.Dispose();
Data = buffer;
_Data = buffer;
}
catch (System.Exception e)
{
@ -33,7 +47,7 @@ namespace EGFramework @@ -33,7 +47,7 @@ namespace EGFramework
try
{
FileStream fileStream = File.Create(path);
fileStream.Write(Data,0,Data.Length);
fileStream.Write(_Data,0,_Data.Length);
fileStream.Close();
fileStream.Dispose();
}
@ -49,10 +63,16 @@ namespace EGFramework @@ -49,10 +63,16 @@ namespace EGFramework
ReadDataBlock(path);
}
/// <summary>
/// Set object to the file,the pointer
/// </summary>
/// <param name="objectKey"></param>
/// <param name="obj"></param>
/// <typeparam name="TObject"></typeparam>
public void SetObject<TObject>(string objectKey , TObject obj)
{
if(typeof(TObject).GetInterfaces().Contains(typeof(IRequest))){
Data = ((IRequest)obj).ToProtocolByteData();
if(typeof(TObject).GetInterfaces().Contains(typeof(IEGByteObject))){
_Data = ((IEGByteObject)obj).GetBytes();
}else{
throw new Exception("This byte class cannot be serialized! you should implement IRequest first!");
}
@ -61,14 +81,35 @@ namespace EGFramework @@ -61,14 +81,35 @@ namespace EGFramework
public TObject GetObject<TObject>(string objectKey) where TObject : new()
{
if(typeof(TObject).GetInterfaces().Contains(typeof(IResponse))){
if(typeof(TObject).GetInterfaces().Contains(typeof(IEGByteObject))){
TObject result = new TObject();
((IResponse)result).TrySetData(StringEncoding.GetString(Data),Data);
((IEGByteObject)result).SetBytes(_Data);
return result;
}else{
throw new Exception("This byte class cannot be serialized! you should implement IRequest first!");
}
}
public void RemoveObject<TObject>(string objectKey)
{
throw new NotImplementedException();
}
public void AddObject<TObject>(string objectKey, TObject obj)
{
throw new NotImplementedException();
}
public void UpdateObject<TObject>(string objectKey, TObject obj)
{
throw new NotImplementedException();
}
public IEnumerable<string> GetKeys()
{
throw new NotImplementedException();
}
}
public interface IEGByteInit{

47
addons/EGFramework/Module/SaveTools/EGJsonSave.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Newtonsoft.Json;
@ -79,5 +80,51 @@ namespace EGFramework @@ -79,5 +80,51 @@ namespace EGFramework
return data;
}
public void RemoveObject<TObject>(string objectKey)
{
if(IsReadOnly){
throw new Exception("This file is readonly! can't set any object to file.");
}
if(SaveObject.ContainsKey(objectKey)){
SaveObject.Remove(objectKey);
}
File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented));
}
public void AddObject<TObject>(string objectKey, TObject obj)
{
if(IsReadOnly){
throw new Exception("This file is readonly! can't set any object to file.");
}
if(!SaveObject.ContainsKey(objectKey)){
SaveObject.Add(objectKey,JToken.FromObject(obj));
}else{
throw new Exception("Key already exists!");
}
File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented));
}
public void UpdateObject<TObject>(string objectKey, TObject obj)
{
if(IsReadOnly){
throw new Exception("This file is readonly! can't set any object to file.");
}
if(SaveObject.ContainsKey(objectKey)){
SaveObject[objectKey] = JToken.FromObject(obj);
}else{
throw new Exception("Key not found!");
}
File.WriteAllText(DefaultPath,JsonConvert.SerializeObject(SaveObject,Formatting.Indented));
}
public IEnumerable<string> GetKeys()
{
List<string> keys = new List<string>();
foreach(string key in SaveObject.Properties())
{
keys.Add(key);
}
return keys;
}
}
}

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

@ -6,6 +6,7 @@ using System.Threading.Tasks; @@ -6,6 +6,7 @@ using System.Threading.Tasks;
namespace EGFramework
{
#region Sync_Interface
public interface IEGSave{
void InitSaveFile(string path);
}
@ -17,6 +18,7 @@ namespace EGFramework @@ -17,6 +18,7 @@ namespace EGFramework
public interface IEGSaveObjectReadOnly{
TObject GetObject<TObject>(string objectKey) where TObject : new();
IEnumerable<string> GetKeys();
}
public interface IEGSaveDataReadOnly{
TData GetData<TData>(string dataKey,object id) where TData : new();
@ -25,11 +27,44 @@ namespace EGFramework @@ -25,11 +27,44 @@ namespace EGFramework
}
public interface IEGSaveObject : IEGSaveObjectReadOnly{
/// <summary>
/// SetObject will add a object if it not exisits, replace the object if it already exists.
/// </summary>
/// <param name="objectKey"></param>
/// <param name="obj"></param>
/// <typeparam name="TObject"></typeparam>
void SetObject<TObject>(string objectKey,TObject obj);
void RemoveObject<TObject>(string objectKey);
void AddObject<TObject>(string objectKey,TObject obj);
void UpdateObject<TObject>(string objectKey,TObject obj);
}
//
public interface IEGSaveData : IEGSaveDataReadOnly{
void SetData<TData>(string dataKey,TData data,object id);
}
#endregion
#region Async_Interface
public interface IEGSaveAsync{
Task InitSaveFileAsync(string path);
}
public interface IEGSaveReadOnlyAsync{
Task InitReadOnlyAsync(string data);
Task InitReadOnlyAsync(byte[] data);
}
public interface IEGSaveObjectReadOnlyAsync{
Task<TObject> GetObjectAsync<TObject>(string objectKey) where TObject : new();
}
public interface IEGSaveDataReadOnlyAsync{
Task<TData> GetDataAsync<TData>(string dataKey,object id) where TData : new();
Task<IEnumerable<TData>> GetAllAsync<TData>(string dataKey) where TData : new();
Task<IEnumerable<TData>> FindDataAsync<TData>(string dataKey,Expression<Func<TData, bool>> expression) where TData : new();
}
public interface IEGSaveObjectAsync : IEGSaveObjectReadOnlyAsync{
Task SetObjectAsync<TObject>(string objectKey,TObject obj);
}
public interface IEGSaveDataAsync : IEGSaveDataReadOnlyAsync{
Task SetDataAsync<TData>(string dataKey,TData data,object id);
}
#endregion
}
Loading…
Cancel
Save