diff --git a/Esyur.Stores.MongoDB/Esyur.Stores.MongoDB.csproj b/Esyur.Stores.MongoDB/Esyur.Stores.MongoDB.csproj
index 5249862..58dc39b 100644
--- a/Esyur.Stores.MongoDB/Esyur.Stores.MongoDB.csproj
+++ b/Esyur.Stores.MongoDB/Esyur.Stores.MongoDB.csproj
@@ -11,7 +11,7 @@
http://www.esyur.com
https://github.com/esyur/esyur-dotnet/
True
- 1.2.9
+ 1.3.0
diff --git a/Esyur.Stores.MongoDB/MongoDBStore.cs b/Esyur.Stores.MongoDB/MongoDBStore.cs
index e9cfa92..79deb66 100644
--- a/Esyur.Stores.MongoDB/MongoDBStore.cs
+++ b/Esyur.Stores.MongoDB/MongoDBStore.cs
@@ -24,21 +24,24 @@ namespace Esyur.Stores.MongoDB
IMongoDatabase database;
IMongoCollection resourcesCollection;
- //List storeParents = new List();
- //List storeChildren = new List();
- //string collectionName;
- //string dbName;
Dictionary resources = new Dictionary();
- public long Count
+ [ResourceEvent]
+ public event ResourceEventHanlder ResourceAdded;
+
+ [ResourceEvent]
+ public event ResourceEventHanlder ResourceRemoved;
+
+ [ResourceProperty]
+ public virtual int Count
{
get
{
- return resourcesCollection.CountDocuments(x => true);
- }// resources.Count; }
+ return (int)resourcesCollection.CountDocuments(x => true);
+ }
}
public void Destroy()
@@ -73,6 +76,7 @@ namespace Esyur.Stores.MongoDB
return true;
}
+ [ResourceFunction]
public bool Remove(IResource resource)
{
var objectId = resource.Instance.Attributes["objectId"].ToString();
@@ -81,9 +85,15 @@ namespace Esyur.Stores.MongoDB
this.database.DropCollection("record_" + objectId);
resourcesCollection.DeleteOne(filter);
+ ResourceRemoved?.Invoke(resource);
+
+ Instance.Modified("Count");
+
return true;
}
+
+
AsyncReply Fetch(string id) where T : IResource
{
@@ -304,6 +314,10 @@ namespace Esyur.Stores.MongoDB
PutResource(resource).Wait();
+ ResourceAdded?.Invoke(resource);
+
+ Instance.Modified("Count");
+
return true;
}
@@ -773,6 +787,8 @@ namespace Esyur.Stores.MongoDB
public bool Modify(IResource resource, string propertyName, object value, ulong age, DateTime dateTime)
{
+ if (resource == this)
+ return true;
var objectId = resource.Instance.Attributes["objectId"].ToString();
diff --git a/Esyur.Stores.MongoDB/MongoDBStoreGeneric.cs b/Esyur.Stores.MongoDB/MongoDBStoreGeneric.cs
new file mode 100644
index 0000000..6f6bab5
--- /dev/null
+++ b/Esyur.Stores.MongoDB/MongoDBStoreGeneric.cs
@@ -0,0 +1,28 @@
+using Esyur.Core;
+using Esyur.Data;
+using Esyur.Proxy;
+using Esyur.Resource;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Esyur.Stores.MongoDB
+{
+ public class MongoDBStore : MongoDBStore where T:IResource
+ {
+ [ResourceFunction]
+ public T Create(string name, Structure values)
+ {
+ return Warehouse.New(name, this, null, null, null, null, values);
+ }
+
+ [ResourceFunction]
+ public async AsyncReply Slice(int index, int limit)
+ {
+ var list = await this.Instance.Children();
+ return list.Skip(index).Take(limit).ToArray();
+ }
+
+ }
+}
diff --git a/Esyur.Stores.MySql/Esyur.Stores.MySql.csproj b/Esyur.Stores.MySql/Esyur.Stores.MySql.csproj
index bb0d4d5..3953db9 100644
--- a/Esyur.Stores.MySql/Esyur.Stores.MySql.csproj
+++ b/Esyur.Stores.MySql/Esyur.Stores.MySql.csproj
@@ -1,4 +1,4 @@
-
+
netstandard2.0
@@ -9,7 +9,7 @@
-
+
diff --git a/Esyur/Core/AsyncBag.cs b/Esyur/Core/AsyncBag.cs
index 0c72bb6..c27ab99 100644
--- a/Esyur/Core/AsyncBag.cs
+++ b/Esyur/Core/AsyncBag.cs
@@ -90,6 +90,8 @@ namespace Esyur.Core
Add(r);
}
+
+
public AsyncBag()
{
diff --git a/Esyur/Esyur.csproj b/Esyur/Esyur.csproj
index 7e8bbe0..3cd7563 100644
--- a/Esyur/Esyur.csproj
+++ b/Esyur/Esyur.csproj
@@ -7,7 +7,7 @@
https://github.com/Esyur/Esyur-dotnet/blob/master/LICENSE
http://www.esyur.com
true
- 1.4.3
+ 1.4.5
https://github.com/esyur/esyur-dotnet
Ahmed Kh. Zamil
1.3.1.0
diff --git a/Esyur/Net/HTTP/HTTPConnection.cs b/Esyur/Net/HTTP/HTTPConnection.cs
index 116ed26..51a3861 100644
--- a/Esyur/Net/HTTP/HTTPConnection.cs
+++ b/Esyur/Net/HTTP/HTTPConnection.cs
@@ -286,7 +286,7 @@ namespace Esyur.Net.HTTP
//base.Send(fd);
- using (var fs = new FileStream(filename, FileMode.Open))
+ using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var buffer = new byte[5000];
diff --git a/Esyur/Net/NetworkConnection.cs b/Esyur/Net/NetworkConnection.cs
index fcd2b4b..248f0c6 100644
--- a/Esyur/Net/NetworkConnection.cs
+++ b/Esyur/Net/NetworkConnection.cs
@@ -177,8 +177,9 @@ namespace Esyur.Net
public void Close()
{
//if (!connected)
- // return;
+ // return;
+
try
{
if (sock != null)
diff --git a/Esyur/Proxy/ResourceProxy.cs b/Esyur/Proxy/ResourceProxy.cs
index b68c584..cd82404 100644
--- a/Esyur/Proxy/ResourceProxy.cs
+++ b/Esyur/Proxy/ResourceProxy.cs
@@ -111,20 +111,45 @@ namespace Esyur.Proxy
ILGenerator g = builder.GetILGenerator();
var getInstance = resourceType.GetTypeInfo().GetProperty("Instance").GetGetMethod();
-
+
+
+ //g.Emit(OpCodes.Ldarg_0);
+ //g.Emit(OpCodes.Ldarg_1);
+ //g.Emit(OpCodes.Call, pi.GetSetMethod());
+ //g.Emit(OpCodes.Nop);
+
+ //g.Emit(OpCodes.Ldarg_0);
+ //g.Emit(OpCodes.Call, getInstance);
+ //g.Emit(OpCodes.Ldstr, pi.Name);
+ //g.Emit(OpCodes.Call, modifyMethod);
+ //g.Emit(OpCodes.Nop);
+
+ //g.Emit(OpCodes.Ret);
+
+ Label exitMethod = g.DefineLabel();
+ Label callModified = g.DefineLabel();
g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Ldarg_1);
g.Emit(OpCodes.Call, pi.GetSetMethod());
- g.Emit(OpCodes.Nop);
+ //g.Emit(OpCodes.Nop);
- g.Emit(OpCodes.Nop);
g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Call, getInstance);
+ g.Emit(OpCodes.Dup);
+
+ g.Emit(OpCodes.Brtrue_S, callModified);
+
+ g.Emit(OpCodes.Pop);
+ g.Emit(OpCodes.Br_S, exitMethod);
+
+ g.MarkLabel(callModified);
+
g.Emit(OpCodes.Ldstr, pi.Name);
g.Emit(OpCodes.Call, modifyMethod);
g.Emit(OpCodes.Nop);
+ g.MarkLabel(exitMethod);
g.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(builder);
diff --git a/Esyur/Resource/Instance.cs b/Esyur/Resource/Instance.cs
index 44e2509..08f3717 100644
--- a/Esyur/Resource/Instance.cs
+++ b/Esyur/Resource/Instance.cs
@@ -816,10 +816,10 @@ namespace Esyur.Resource
Type t = ResourceProxy.GetBaseType(resource);
#if NETSTANDARD
- var events = t.GetTypeInfo().GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
+ var events = t.GetTypeInfo().GetEvents(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
#else
- var events = t.GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
+ var events = t.GetEvents(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
#endif
foreach (var evt in events)
diff --git a/Esyur/Resource/Template/ResourceTemplate.cs b/Esyur/Resource/Template/ResourceTemplate.cs
index 1d80714..2aedeb1 100644
--- a/Esyur/Resource/Template/ResourceTemplate.cs
+++ b/Esyur/Resource/Template/ResourceTemplate.cs
@@ -140,14 +140,14 @@ namespace Esyur.Resource.Template
#if NETSTANDARD
- PropertyInfo[] propsInfo = type.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
- EventInfo[] eventsInfo = type.GetTypeInfo().GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
- MethodInfo[] methodsInfo = type.GetTypeInfo().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
+ PropertyInfo[] propsInfo = type.GetTypeInfo().GetProperties(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
+ EventInfo[] eventsInfo = type.GetTypeInfo().GetEvents(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
+ MethodInfo[] methodsInfo = type.GetTypeInfo().GetMethods(BindingFlags.Public | BindingFlags.Instance); // | BindingFlags.DeclaredOnly);
#else
- PropertyInfo[] propsInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
- EventInfo[] eventsInfo = type.GetEvents(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
- MethodInfo[] methodsInfo = type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
+ PropertyInfo[] propsInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
+ EventInfo[] eventsInfo = type.GetEvents(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
+ MethodInfo[] methodsInfo = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);// | BindingFlags.DeclaredOnly);
#endif
//byte currentIndex = 0;
diff --git a/Esyur/Resource/Warehouse.cs b/Esyur/Resource/Warehouse.cs
index 774a4d0..f91f833 100644
--- a/Esyur/Resource/Warehouse.cs
+++ b/Esyur/Resource/Warehouse.cs
@@ -52,12 +52,14 @@ namespace Esyur.Resource
public delegate void StoreConnectedEvent(IStore store, string name);
public delegate void StoreDisconnectedEvent(IStore store);
-
+
public static event StoreConnectedEvent StoreConnected;
public static event StoreDisconnectedEvent StoreDisconnected;
public static KeyList> Protocols { get; } = getSupportedProtocols();
+ private static Regex urlRegex = new Regex(@"^(?:([\S]*)://([^/]*)/?)");
+
static KeyList> getSupportedProtocols()
{
@@ -92,7 +94,7 @@ namespace Esyur.Resource
if (resources[id].TryGetTarget(out r))
return new AsyncReply(r);
else
- return new AsyncReply(null);
+ return new AsyncReply(null);
}
else
return new AsyncReply(null);
@@ -106,7 +108,7 @@ namespace Esyur.Resource
public static async AsyncReply Open()
{
- foreach(var rk in resources)
+ foreach (var rk in resources)
{
IResource r;
if (rk.Value.TryGetTarget(out r))
@@ -296,7 +298,7 @@ namespace Esyur.Resource
*/
-
+
public static async AsyncReply Query(string path)
{
var rt = new AsyncReply();
@@ -314,8 +316,8 @@ namespace Esyur.Resource
var res = await store.Get(String.Join("/", p.Skip(1).ToArray()));
if (res != null)
return new IResource[] { res };
-
-
+
+
resource = store;
for (var i = 1; i < p.Length; i++)
{
@@ -348,35 +350,42 @@ namespace Esyur.Resource
public static AsyncReply Get(string path, object attributes = null, IResource parent = null, IPermissionsManager manager = null)
{
var rt = new AsyncReply();
-
+
// Should we create a new store ?
- if (path.Contains("://"))
+ if (urlRegex.IsMatch(path))
{
- var url = path.Split(new string[] { "://" }, 2, StringSplitOptions.None);
- var hostname = url[1].Split(new char[] { '/' }, 2)[0];
- var pathname = string.Join("/", url[1].Split(new char[] { '/' }).Skip(1));
+
+ //if (path.Contains("://"))
+ //{
+ var url = urlRegex.Split(path);
+ //var url = path.Split(new string[] { "://" }, 2, StringSplitOptions.None);
+ //var hostname = url[1].Split(new char[] { '/' }, 2)[0];
+ //var pathname = string.Join("/", url[1].Split(new char[] { '/' }).Skip(1));
- if (Protocols.ContainsKey(url[0]))
+ if (Protocols.ContainsKey(url[1]))
{
- var handler = Protocols[url[0]];
+ var handler = Protocols[url[1]];
var store = handler();
- Put(store, hostname, null, parent, null, 0, manager, attributes);
+ Put(store, url[2], null, parent, null, 0, manager, attributes);
- store.Trigger(ResourceTrigger.Open).Then(x => {
+ store.Trigger(ResourceTrigger.Open).Then(x =>
+ {
warehouseIsOpen = true;
- if (pathname.Length > 0 && pathname != "")
- store.Get(pathname).Then(r => {
+ if (url[3].Length > 0 && url[3] != "")
+ store.Get(url[3]).Then(r =>
+ {
rt.Trigger(r);
}).Error(e => rt.TriggerError(e));
else
rt.Trigger(store);
- }).Error(e => {
+ }).Error(e =>
+ {
rt.TriggerError(e);
Warehouse.Remove(store);
});
@@ -384,19 +393,19 @@ namespace Esyur.Resource
return rt;
}
}
-
-
+
+
Query(path).Then(rs =>
{
- // rt.TriggerError(new Exception());
+ // rt.TriggerError(new Exception());
if (rs != null && rs.Length > 0)
rt.Trigger(rs.First());
else
rt.Trigger(null);
});
-
+
return rt;
-
+
}
@@ -449,9 +458,9 @@ namespace Esyur.Resource
else
parent.Instance.Children.Add(resource);
*/
-
- if (resource is IStore)
+
+ if (resource is IStore)
StoreConnected?.Invoke(resource as IStore, name);
//else
store.Put(resource);
@@ -468,15 +477,59 @@ namespace Esyur.Resource
resources.Add(resource.Instance.Id, new WeakReference(resource));
if (warehouseIsOpen)
- resource.Trigger(ResourceTrigger.Initialize);
+ resource.Trigger(ResourceTrigger.Initialize);
}
- public static T New(string name, IStore store = null, IResource parent = null, IPermissionsManager manager = null, Structure attributes = null)
- where T:IResource
+ public static T New(string name, IStore store = null, IResource parent = null, IPermissionsManager manager = null, Structure attributes = null, Structure arguments = null, Structure properties = null)
+ where T : IResource
{
var type = ResourceProxy.GetProxy();
+
+
+ /*
+ if (arguments != null)
+ {
+ var constructors = type.GetConstructors(System.Reflection.BindingFlags.Public);
+
+ foreach(var constructor in constructors)
+ {
+ var pi = constructor.GetParameters();
+ if (pi.Length == constructor.le)
+ }
+
+ // cast arguments
+ ParameterInfo[] pi = fi.GetParameters();
+
+ object[] args = new object[pi.Length];
+
+ for (var i = 0; i < pi.Length; i++)
+ {
+ if (pi[i].ParameterType == typeof(DistributedConnection))
+ {
+ args[i] = this;
+ }
+ else if (namedArgs.ContainsKey(pi[i].Name))
+ {
+ args[i] = DC.CastConvert(namedArgs[pi[i].Name], pi[i].ParameterType);
+ }
+ }
+
+ constructors[0].
+ }
+ */
var res = Activator.CreateInstance(type) as IResource;
+
+ if (properties != null)
+ {
+ foreach (var p in properties)
+ {
+ var pi = typeof(T).GetProperty(p.Key, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);
+ if (pi != null)
+ pi.SetValue(res, p.Value);
+ }
+ }
+
Put(res, name, store, parent, null, 0, manager, attributes);
return (T)res;
}
@@ -533,7 +586,7 @@ namespace Esyur.Resource
if (t.ClassName == className)
return new AsyncReply(t);
- return null;
+ return null;
}
public static bool Remove(IResource resource)
@@ -542,7 +595,7 @@ namespace Esyur.Resource
if (resource.Instance == null)
return false;
- if (resources.ContainsKey(resource.Instance.Id))
+ if (resources.ContainsKey(resource.Instance.Id))
resources.Remove(resource.Instance.Id);
else
return false;
@@ -552,7 +605,8 @@ namespace Esyur.Resource
stores.Remove(resource as IStore);
// remove all objects associated with the store
- var toBeRemoved = resources.Values.Where(x => {
+ var toBeRemoved = resources.Values.Where(x =>
+ {
IResource r;
return x.TryGetTarget(out r) && r.Instance.Store == resource;
}).ToArray();
@@ -566,13 +620,13 @@ namespace Esyur.Resource
StoreDisconnected?.Invoke(resource as IStore);
}
-
+
if (resource.Instance.Store != null)
resource.Instance.Store.Remove(resource);
resource.Destroy();
return true;
- }
+ }
}
}