2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-05-06 19:42:58 +00:00

async put

This commit is contained in:
Ahmed Zamil 2021-02-20 21:55:11 +03:00
parent 7c707637de
commit 4cfad2a242
6 changed files with 58 additions and 47 deletions

View File

@ -48,7 +48,7 @@ namespace Esiur.Stores.MongoDB
IMongoDatabase database; IMongoDatabase database;
IMongoCollection<BsonDocument> resourcesCollection; IMongoCollection<BsonDocument> resourcesCollection;
Dictionary<string, WeakReference> resources = new Dictionary<string, WeakReference>(); KeyList<string, WeakReference> resources = new KeyList<string, WeakReference>();
[Public] [Public]
@ -158,7 +158,8 @@ namespace Esiur.Stores.MongoDB
else else
resources.Add(id, new WeakReference(resource)); resources.Add(id, new WeakReference(resource));
Warehouse.Put(resource, document["name"].AsString, this); //@TODO this causes store.put to be invoked, need fix
await Warehouse.Put(resource, document["name"].AsString, this);
var parents = document["parents"].AsBsonArray; var parents = document["parents"].AsBsonArray;

View File

@ -36,9 +36,9 @@ namespace Esiur.Stores.MongoDB
public class MongoDBStore<T> : MongoDBStore where T:IResource public class MongoDBStore<T> : MongoDBStore where T:IResource
{ {
[Public] [Public]
public T New(string name = null, object properties = null) public async AsyncReply<T> New(string name = null, object properties = null)
{ {
var resource = Warehouse.New<T>(name, this, null, null, null, properties); var resource = await Warehouse.New<T>(name, this, null, null, null, properties);
resource.Instance.Managers.AddRange(this.Instance.Managers.ToArray()); resource.Instance.Managers.AddRange(this.Instance.Managers.ToArray());
return resource; return resource;
} }

View File

@ -36,5 +36,6 @@ namespace Esiur.Core
SetPropertyDenied, SetPropertyDenied,
ReadOnlyProperty, ReadOnlyProperty,
GeneralFailure, GeneralFailure,
AddToStoreFailed
} }
} }

View File

@ -759,12 +759,18 @@ namespace Esiur.Net.IIP
.Done(); .Done();
ready = true; ready = true;
Warehouse.Put(this, this.LocalUsername, null, Server); Warehouse.Put(this, this.LocalUsername, null, Server).Then(x =>
{
openReply?.Trigger(true);
OnReady?.Invoke(this);
openReply?.Trigger(true); Server?.Membership.Login(session);
OnReady?.Invoke(this);
}).Error(x=>
{
openReply?.TriggerError(x);
});
Server?.Membership.Login(session);
//Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:AUTH"); //Global.Log("auth", LogType.Warning, "U:" + RemoteUsername + " IP:" + Socket.RemoteEndPoint.Address.ToString() + " S:AUTH");
@ -835,10 +841,12 @@ namespace Esiur.Net.IIP
ready = true; ready = true;
// put it in the warehouse // put it in the warehouse
Warehouse.Put(this, this.LocalUsername, null, Server); Warehouse.Put(this, this.LocalUsername, null, Server).Then(x =>
{
openReply?.Trigger(true);
OnReady?.Invoke(this);
openReply?.Trigger(true); }).Error(x=> openReply?.TriggerError(x));
OnReady?.Invoke(this);
} }
} }
@ -945,7 +953,7 @@ namespace Esiur.Net.IIP
} }
} }
return new AsyncReply<bool>(); return new AsyncReply<bool>(true);
} }

View File

@ -770,11 +770,16 @@ namespace Esiur.Net.IIP
// create the resource // create the resource
var resource = Activator.CreateInstance(type, args) as IResource; var resource = Activator.CreateInstance(type, args) as IResource;
Warehouse.Put(resource, name, store as IStore, parent); Warehouse.Put(resource, name, store as IStore, parent).Then(ok =>
{
SendReply(IIPPacket.IIPPacketAction.CreateResource, callback)
.AddUInt32(resource.Instance.Id)
.Done();
SendReply(IIPPacket.IIPPacketAction.CreateResource, callback) }).Error(x =>
.AddUInt32(resource.Instance.Id) {
.Done(); SendError(ErrorType.Exception, callback, (ushort)ExceptionCode.AddToStoreFailed);
});
}); });
}); });
@ -1959,14 +1964,27 @@ namespace Esiur.Net.IIP
{ {
// ClassId, ResourceAge, ResourceLink, Content // ClassId, ResourceAge, ResourceLink, Content
if (resource == null) if (resource == null)
Warehouse.Put(dr, id.ToString(), this, null, tmp);
Codec.ParsePropertyValueArray((byte[])rt[3], this).Then((ar) =>
{ {
dr._Attach(ar); Warehouse.Put(dr, id.ToString(), this, null, tmp).Then((ok) =>
resourceRequests.Remove(id); {
reply.Trigger(dr); Codec.ParsePropertyValueArray((byte[])rt[3], this).Then((ar) =>
}); {
dr._Attach(ar);
resourceRequests.Remove(id);
reply.Trigger(dr);
});
}).Error(ex=>reply.TriggerError(ex));
}
else
{
Codec.ParsePropertyValueArray((byte[])rt[3], this).Then((ar) =>
{
dr._Attach(ar);
resourceRequests.Remove(id);
reply.Trigger(dr);
}).Error(ex=>reply.TriggerError(ex));
}
}).Error((ex) => }).Error((ex) =>
{ {
reply.TriggerError(ex); reply.TriggerError(ex);

View File

@ -535,24 +535,10 @@ namespace Esiur.Resource
parent = null; parent = null;
/*
if (parent == null)
{
if (!(resource is IStore))
store.Instance.Children.Add(resource);
}
else
parent.Instance.Children.Add(resource);
*/
if (resource is IStore) if (resource is IStore)
{
stores.TryAdd(resource as IStore, new List<WeakReference<IResource>>()); stores.TryAdd(resource as IStore, new List<WeakReference<IResource>>());
StoreConnected?.Invoke(resource as IStore, name);
}
//else
if (!await store.Put(resource)) if (!await store.Put(resource))
@ -563,16 +549,12 @@ namespace Esiur.Resource
{ {
await parent.Instance.Store.AddChild(parent, resource); await parent.Instance.Store.AddChild(parent, resource);
await store.AddParent(resource, parent); await store.AddParent(resource, parent);
//store.AddChild(parent, resource);
} }
var t = resource.GetType(); var t = resource.GetType();
Global.Counters["T-" + t.Namespace + "." + t.Name]++; Global.Counters["T-" + t.Namespace + "." + t.Name]++;
//var wr = new WeakReference<IResource>(resource);
//lock (resourcesLock)
resources.TryAdd(resource.Instance.Id, resourceReference); resources.TryAdd(resource.Instance.Id, resourceReference);
if (warehouseIsOpen) if (warehouseIsOpen)
@ -580,11 +562,12 @@ namespace Esiur.Resource
await resource.Trigger(ResourceTrigger.Initialize); await resource.Trigger(ResourceTrigger.Initialize);
if (resource is IStore) if (resource is IStore)
await resource.Trigger(ResourceTrigger.Open); await resource.Trigger(ResourceTrigger.Open);
return true;
} }
else
return true; if (resource is IStore)
StoreConnected?.Invoke(resource as IStore, name);
return true;
} }