Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 protected override int OnReduce(MtObject o, int currentValue)
 {
     return((int)(o.Value) + currentValue);
 }
Exemplo n.º 4
0
 internal string GetScript()
 {
     return(MtObject.GetScript(Type));
 }
Exemplo n.º 5
0
 public AstEvaluator(MtObject context, IMtObjectConverter converter)
 {
     _context   = context;
     _converter = converter;
 }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
 protected abstract T OnReduce(MtObject o, T currentValue);
Exemplo n.º 8
0
        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);
                }
            }
        }
Exemplo n.º 9
0
        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);
                }
            }
        }
Exemplo n.º 10
0
 public int Update(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtObject obj, AstNode @where)
 {
     return(Upsert(connectionProvider, fr8AccountId, obj, @where, true, false));
 }
Exemplo n.º 11
0
        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);
        }