public int Upsert(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject newObject, AstNode @where) { if (where == null) { _mtObjects.Add(newObject); return(1); } int changed = 0; for (int index = 0; index < _mtObjects.Count; index++) { var obj = _mtObjects[index]; var eval = new AstEvaluator(obj, _converter); if (eval.Evaluate(@where)) { _mtObjects[index] = newObject; changed++; } } if (changed == 0) { _mtObjects.Add(newObject); } return(changed); }
public MtResult MtSleep(ScriptThread thread, object[] args) { var result = new MtResult(); MtObject sleepResult = null; var sleepMs = args[0] as MtResult; var sleepEval = args.Length > 1 ? args[1] as MtResult : MtResult.True; var waitValue = new ManualResetEvent(false); // eval number of milliseconds to wait sleepMs.GetValue((waitPeriod) => { // eval value to return sleepEval.GetValue((retValue) => { sleepResult = retValue; // Signal: We have a value! waitValue.Set(); }); // set value, async result.SetValue((state) => { #if DEBUG && !SILVERLIGHT Debug.Print("MtSleep #1 Thread {0} {1:mm:ss.ffff} start sleep", Thread.CurrentThread.ManagedThreadId, DateTime.Now); #endif // Wait period and, if need be, wait for sleepResult var to_wait = (int)waitPeriod.Value; if (to_wait > 0) { Thread.Sleep(to_wait); } #if DEBUG && !SILVERLIGHT Debug.Print("MtSleep #2 Thread {0} {1:mm:ss.ffff} end sleep, wait value", Thread.CurrentThread.ManagedThreadId, DateTime.Now); #endif // Wait for signal... waitValue.WaitOne(); #if DEBUG && !SILVERLIGHT Debug.Print("MtSleep #3 Thread {0} {1:mm:ss.ffff} has value", Thread.CurrentThread.ManagedThreadId, DateTime.Now); #endif if (sleepResult == null) { throw new Exception("Sleep can't return null!"); } return(sleepResult); }); }); return(result); }
protected override int OnReduce(MtObject o, int currentValue) { return((int)(o.Value) + currentValue); }
internal string GetScript() { return(MtObject.GetScript(Type)); }
public AstEvaluator(MtObject context, IMtObjectConverter converter) { _context = context; _converter = converter; }
public int Insert(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject newObject, AstNode uniqueConstraint) { if (uniqueConstraint != null) { foreach (var obj in _mtObjects) { var eval = new AstEvaluator(obj, _converter); if (eval.Evaluate(uniqueConstraint)) { throw new Exception("Object already exists"); } } } _mtObjects.Add(newObject); return(1); }
protected abstract T OnReduce(MtObject o, T currentValue);
private int Upsert(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject obj, AstNode @where, bool allowUpdate, bool allowInsert) { var fields = new List <string> { "Type", "CreatedAt", "UpdatedAt", "fr8AccountId", "IsDeleted" }; var parameters = new List <string> { "@type", "@created", "@updated", "@account", "@isDeleted" }; foreach (var mtPropertyInfo in obj.MtTypeDefinition.Properties) { parameters.Add("@val" + (mtPropertyInfo.Index + 1)); fields.Add("Value" + (mtPropertyInfo.Index + 1)); } var tableDefintion = string.Join(", ", fields); using (var connection = OpenConnection(connectionProvider)) { using (var command = new SqlCommand()) { command.Connection = connection; command.Parameters.AddWithValue("@type", obj.MtTypeDefinition.Id); command.Parameters.AddWithValue("@created", DateTime.UtcNow); command.Parameters.AddWithValue("@updated", DateTime.UtcNow); command.Parameters.AddWithValue("@account", fr8AccountId); command.Parameters.AddWithValue("@isDeleted", false); foreach (var mtPropertyInfo in obj.MtTypeDefinition.Properties) { var value = obj.Values[mtPropertyInfo.Index]; object dbValue = DBNull.Value; if (value != null) { dbValue = value; } command.Parameters.AddWithValue("@val" + (mtPropertyInfo.Index + 1), dbValue); } if (@where != null) { var valuesToInsert = string.Join(", ", fields.Select(x => "Src." + x)); var astConverter = new AstToSqlConverter(obj.MtTypeDefinition, _converter, "Tgt"); astConverter.Convert(@where); var cmd = string.Format(@"merge MtData as Tgt using (select {0}) as Src ({1}) ON Tgt.Type = @type and Tgt.fr8AccountId = @account and ({2}) and Tgt.IsDeleted = 0", string.Join(",", parameters), tableDefintion, astConverter.SqlCommand); if (allowUpdate) { cmd += string.Format("\nwhen matched then update set {0}", string.Join(", ", fields.Where(x => x != "CreatedAt").Select(x => string.Format("Tgt.{0} = Src.{0}", x)))); } if (allowInsert) { cmd += string.Format("\nwhen not matched then insert ({0}) values ({1});", tableDefintion, valuesToInsert); } command.CommandText = cmd; for (int index = 0; index < astConverter.Constants.Count; index++) { command.Parameters.AddWithValue("@param" + index, astConverter.Constants[index]); } } else { if (!allowInsert) { return(0); } command.CommandText = string.Format(@"insert into MtData ({0}) values ({1})", tableDefintion, string.Join(",", parameters)); } var affectedRows = command.ExecuteNonQuery(); return(affectedRows); } } }
public IEnumerable <MtObject> Query(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode @where) { var fields = new List <string> { "Type", "fr8AccountId", "IsDeleted" }; var parameters = new List <string> { "@type", "@account", "@isDeleted" }; foreach (var mtPropertyInfo in type.Properties) { parameters.Add("@val" + (mtPropertyInfo.Index + 1)); fields.Add("Value" + (mtPropertyInfo.Index + 1)); } var tableDefintionOuter = string.Join(", ", fields.Select(x => "tmp." + x)); var tableDefintionInner = string.Join(", ", fields.Select(x => "[md]." + x)); using (var connection = OpenConnection(connectionProvider)) { using (var command = new SqlCommand()) { command.Connection = connection; command.Parameters.AddWithValue("@type", type.Id); command.Parameters.AddWithValue("@account", fr8AccountId); command.Parameters.AddWithValue("@isDeleted", false); string whereTemplate = string.Empty; if (where != null) { var astConverter = new AstToSqlConverter(type, _converter, "[md]"); astConverter.Convert(@where); whereTemplate = " and " + astConverter.SqlCommand; for (int index = 0; index < astConverter.Constants.Count; index++) { command.Parameters.AddWithValue("@param" + index, astConverter.Constants[index]); } } command.CommandText = string.Format(MtSelectQueryTemplate, tableDefintionOuter, tableDefintionInner, whereTemplate); command.CommandTimeout = 120; var result = new List <MtObject>(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { var obj = new MtObject(type); foreach (var mtPropertyInfo in type.Properties) { var val = reader["Value" + (mtPropertyInfo.Index + 1)]; if (val != DBNull.Value) { obj.Values[mtPropertyInfo.Index] = (string)val; } } result.Add(obj); } } return(result); } } }
public int Update(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject obj, AstNode @where) { return(Upsert(connectionProvider, fr8AccountId, obj, @where, true, false)); }
public int Insert(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject obj, AstNode uniqueConstraint) { var affectedRows = Upsert(connectionProvider, fr8AccountId, obj, uniqueConstraint, false, true); if (affectedRows == 0) { throw new Exception("Violation of unique constraint"); } return(affectedRows); }