@@ -42,7 +42,7 @@ namespace Framework.Database
|
|||||||
|
|
||||||
public QueryCallback WithChainingCallback(Action<QueryCallback, SQLResult> callback)
|
public QueryCallback WithChainingCallback(Action<QueryCallback, SQLResult> callback)
|
||||||
{
|
{
|
||||||
_callbacks.Add(new QueryCallbackData(callback));
|
_callbacks.Enqueue(new QueryCallbackData(callback));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,36 +53,41 @@ namespace Framework.Database
|
|||||||
|
|
||||||
public QueryCallbackStatus InvokeIfReady()
|
public QueryCallbackStatus InvokeIfReady()
|
||||||
{
|
{
|
||||||
QueryCallbackData callback = _callbacks.First();
|
QueryCallbackData callback = _callbacks.Dequeue();
|
||||||
if (_result.IsCompleted)
|
|
||||||
|
bool hasNext = true;
|
||||||
|
while (hasNext)
|
||||||
{
|
{
|
||||||
Task<SQLResult> f = _result;
|
if (_result != null && _result.Wait(0))
|
||||||
Action<QueryCallback, SQLResult> cb = callback._result;
|
|
||||||
_result = null;
|
|
||||||
callback.Clear();
|
|
||||||
|
|
||||||
cb(this, f.Result);
|
|
||||||
|
|
||||||
_callbacks.RemoveAt(0);
|
|
||||||
bool hasNext = _result != null;
|
|
||||||
if (_callbacks.Empty())
|
|
||||||
{
|
{
|
||||||
Contract.Assert(!hasNext);
|
Task<SQLResult> f = _result;
|
||||||
return QueryCallbackStatus.Completed;
|
Action<QueryCallback, SQLResult> cb = callback._result;
|
||||||
|
_result = null;
|
||||||
|
|
||||||
|
cb(this, f.Result);
|
||||||
|
|
||||||
|
hasNext = _result != null;
|
||||||
|
if (_callbacks.Count == 0)
|
||||||
|
{
|
||||||
|
Contract.Assert(!hasNext);
|
||||||
|
return QueryCallbackStatus.Completed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// abort chain
|
||||||
|
if (!hasNext)
|
||||||
|
return QueryCallbackStatus.Completed;
|
||||||
|
|
||||||
|
callback = _callbacks.Dequeue();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// abort chain
|
return QueryCallbackStatus.NotReady;
|
||||||
if (!hasNext)
|
|
||||||
return QueryCallbackStatus.Completed;
|
|
||||||
|
|
||||||
return QueryCallbackStatus.NextStep;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return QueryCallbackStatus.NotReady;
|
return QueryCallbackStatus.Completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
Task<SQLResult> _result;
|
Task<SQLResult> _result;
|
||||||
List<QueryCallbackData> _callbacks = new List<QueryCallbackData>();
|
Queue<QueryCallbackData> _callbacks = new Queue<QueryCallbackData>();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct QueryCallbackData
|
struct QueryCallbackData
|
||||||
|
|||||||
Reference in New Issue
Block a user