Example #1
0
        /// <summary>
        /// 自动回复消息
        /// </summary>
        /// <param name="xmlMsg"></param>
        private string GetTextMsg(XmlElement Xml)
        {
            //自动回复消息
            StringBuilder Content = new StringBuilder();

            Content.Append("您好,我是小怪机器人!");
            //获取事件Model

            XmlElementText   TextModel = GetXmlElementText.GetExmlModel(Xml);
            ObjectTypeHelper obj       = new ObjectTypeHelper();
            int           NowTime      = obj.ConvertDateTimeInt(DateTime.Now);
            StringBuilder TextXml      = new StringBuilder();

            TextXml.Append("<xml>");
            TextXml.Append("<ToUserName><![CDATA[" + TextModel.FromUserName + "]]></ToUserName>");
            TextXml.Append("<FromUserName><![CDATA[" + TextModel.ToUserName + "]]></FromUserName>");
            TextXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
            TextXml.Append("<MsgType><![CDATA[text]]></MsgType>");
            TextXml.Append("<Content><![CDATA[" + Content.ToString() + "]]></Content>");
            TextXml.Append("<MsgId>" + TextModel.MsgId + "</MsgId>");
            TextXml.Append("</xml>");

            LogTextHelper.Log(TextXml.ToString());
            return(TextXml.ToString());
        }
Example #2
0
        public static void Grand <TSecuredDataObject, TOperation>([NotNull] TSecuredDataObject dataObject, [NotNull] TOperation operation, int?userID, int?groupID, DateTimeInterval interval)
            where TSecuredDataObject : class, ISecuredDataObject <TOperation>
            where TOperation : class, IFxDataObject
        {
            if (dataObject == null)
            {
                throw new ArgumentNullException("dataObject");
            }

            if (operation == null)
            {
                throw new ArgumentNullException("operation");
            }

            if ((userID == null && groupID == null) || (userID != null && groupID != null))
            {
                throw new ArgumentException(Translations.PermissionsManager_Grand_One_and_only_one_of_parameters__userID__groupID__must_be_specified);
            }
            var doType = ObjectTypeHelper.GetObjectType(dataObject.GetType());
            var p      = new TblPermissions
            {
                OwnerUserRef    = userID,
                OwnerGroupRef   = groupID,
                CanBeDelagated  = true,
                WorkingInterval = interval
            };

            p.SetObjectID(doType, dataObject.ID);
            p.SetOperationID(doType, operation.ID);
            ServerModel.DB.Insert(p);
        }
Example #3
0
 public ImmutableHashSet <Identifier> GetKnownRoots(ObjectTypeHelper helper)
 {
     return((from root in Roots
             let type = helper.GetObjectType(root.TypeName)
                        where type != null
                        select type.Identifier(root.Name)
             ).ToImmutableHashSet());
 }
Example #4
0
 public ImmutableHashSet <Tuple <Identifier, Identifier> > GetKnownSubs(ObjectTypeHelper helper)
 {
     return((from sub in Subs
             let parentType = helper.GetObjectType(sub.Parent.TypeName)
                              let childType = helper.GetObjectType(sub.Child.TypeName)
                                              where parentType != null && childType != null
                                              select Tuple.Create(parentType.Identifier(sub.Parent.Name), childType.Identifier(sub.Child.Name))
             ).ToImmutableHashSet());
 }
Example #5
0
        /// <summary>
        /// Generates insert of an object
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="item"></param>
        public void Insert <T>(T item)
        {
            string tableName = ObjectTypeHelper.GetTableName <T>(item);

            // Properties of object that are not primary keys
            PropertyInfo[] modelProperties = ObjectTypeHelper.GetModelProperties <T>(item, false);

            // Properties of object that are also primary keys
            PropertyInfo[] primaryKeyProperties = ObjectTypeHelper.GetPrimaryKeyProperties <T>(item);

            if (modelProperties == null || modelProperties.Count() == 0)
            {
                // Moves composite keys to model properties if they are the only properties of the table/object
                if (primaryKeyProperties.Count() > 0)
                {
                    modelProperties = primaryKeyProperties;
                }
                else
                {
                    throw new Exception("Class has no properties or are missing Member attribute");
                }
            }

            // Generates insert statement
            StringBuilder query = new StringBuilder();

            query.Append("insert into " + tableName + "(" + String.Join(",", modelProperties.Select(x => x.Name)) + ") ");
            query.Append("values (" + String.Join(", ", modelProperties.Select(x => "@" + x.Name + suffix)) + ") ");
            query.Append("select @primaryKey = @@identity");

            try
            {
                // Generates and executes sql command
                SqlCommand cmd = GenerateSqlCommand <T>(item, query.ToString(), modelProperties, null, ADOCRUDEnums.Action.Insert, suffix);
                cmd.ExecuteNonQuery();

                // Loads db generated identity value into property with primary key attribute
                // if object only has 1 primary key
                // Multiple primary keys = crosswalk table which means property already contains the values
                if (primaryKeyProperties != null && primaryKeyProperties.Count() == 1)
                {
                    primaryKeyProperties[0].SetValue(item, cmd.Parameters["primaryKey"].Value as object);
                }
            }
            catch (Exception ex)
            {
                sqlTransaction.Rollback();
                throw new Exception(ex.Message);
            }
        }
Example #6
0
        /// <summary>
        /// 自动回复消息
        /// </summary>
        /// <param name="xmlMsg"></param>
        private string GetServicesMsg(XmlElement Xml)
        {
            //获取事件Model

            XmlElementText   TextModel = GetXmlElementText.GetExmlModel(Xml);
            ObjectTypeHelper obj       = new ObjectTypeHelper();
            int           NowTime      = obj.ConvertDateTimeInt(DateTime.Now);
            StringBuilder TextXml      = new StringBuilder();

            TextXml.Append("<xml>");
            TextXml.Append("<ToUserName><![CDATA[" + TextModel.FromUserName + "]]></ToUserName>");
            TextXml.Append("<FromUserName><![CDATA[" + TextModel.ToUserName + "]]></FromUserName>");
            TextXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
            TextXml.Append("<MsgType><![CDATA[transfer_customer_service]]></MsgType>");
            TextXml.Append("</xml>");
            return(TextXml.ToString());
        }
Example #7
0
        /// <summary>
        /// Generates update of an object
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="item"></param>
        public void Update <T>(T item)
        {
            string tableName = ObjectTypeHelper.GetTableName <T>(item);

            // Properties of object that are not primary keys
            PropertyInfo[] modelProperties = ObjectTypeHelper.GetModelProperties <T>(item, false);

            // Properties of object that are also primary keys
            PropertyInfo[] primaryKeyProperties = ObjectTypeHelper.GetPrimaryKeyProperties <T>(item);

            if (modelProperties == null || modelProperties.Count() == 0)
            {
                // Moves composite keys to model properties if they are the only properties of the table/object
                if (primaryKeyProperties.Count() > 0)
                {
                    modelProperties = primaryKeyProperties;
                }
                else
                {
                    throw new Exception("Class has no properties or are missing Member attribute");
                }
            }

            // Generates update statement
            StringBuilder query = new StringBuilder();

            query.Append("update " + tableName + " set ");
            query.Append(String.Join(", ", modelProperties.Select(x => x.Name + " = @" + x.Name + suffix)));
            query.Append(" where " + String.Join(" and ", primaryKeyProperties.Select(x => x.Name + " = @" + x.Name + suffix)));

            try
            {
                // Generates and executes sql command
                SqlCommand cmd = GenerateSqlCommand <T>(item, query.ToString(), modelProperties, primaryKeyProperties, ADOCRUDEnums.Action.Update, suffix);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                sqlTransaction.Rollback();
                throw new Exception(ex.Message);
            }
        }
Example #8
0
        public static void Delegate <TSecuredDataObject, TOperation>(int ownerUserID, [NotNull] TSecuredDataObject dataObject, [NotNull] TOperation operation, int?targetUserID, int?targetGroupID, DateTimeInterval interval)
            where TSecuredDataObject : class, ISecuredDataObject <TOperation>
            where TOperation : class, IFxDataObject
        {
            if (dataObject == null)
            {
                throw new ArgumentNullException("dataObject");
            }

            if ((targetUserID == null && targetGroupID == null) || (targetUserID != null && targetGroupID != null))
            {
                throw new ArgumentException("One and only one of parameters (targetUserID, targetGroupID) must be specified");
            }

            if (operation == null)
            {
                throw new ArgumentNullException("operation");
            }

            var doType = ObjectTypeHelper.GetObjectType(dataObject.GetType());

            var prm = GetPermissions(doType, ownerUserID, null, operation.ID);

            if (prm.Count < 0)
            {
                throw new SecurityException(string.Format("User {0} have no access to do {1} on {2} ID = {3}. Cannot perform delegation", ownerUserID, operation.Name, dataObject.GetType().Name, dataObject.ID));
            }

            var p = new TblPermissions
            {
                CanBeDelagated     = true,
                OwnerGroupRef      = targetGroupID,
                OwnerUserRef       = targetUserID,
                WorkingInterval    = interval,
                ParentPermitionRef = prm[0]
            };

            p.SetObjectID(doType, dataObject.ID);
            p.SetOperationID(doType, operation.ID);
            ServerModel.DB.Insert(p);
        }
Example #9
0
        public static void Delegate <TSecuredDataObject, TOperation>(int ownerUserID, [NotNull] TSecuredDataObject dataObject, [NotNull] TOperation operation, int?targetUserID, int?targetGroupID, DateTimeInterval interval)
            where TSecuredDataObject : class, ISecuredDataObject <TOperation>
            where TOperation : class, IFxDataObject
        {
            if (dataObject == null)
            {
                throw new ArgumentNullException("dataObject");
            }

            if ((targetUserID == null && targetGroupID == null) || (targetUserID != null && targetGroupID != null))
            {
                throw new ArgumentException(Translations.PermissionsManager_Delegate_One_and_only_one_of_parameters__targetUserID__targetGroupID__must_be_specified);
            }

            if (operation == null)
            {
                throw new ArgumentNullException("operation");
            }

            var doType = ObjectTypeHelper.GetObjectType(dataObject.GetType());

            var prm = GetPermissions(doType, ownerUserID, null, operation.ID);

            if (prm.Count < 0)
            {
                throw new SecurityException(string.Format(Translations.PermissionsManager_Delegate_, ownerUserID, operation.Name, dataObject.GetType().Name, dataObject.ID));
            }

            var p = new TblPermissions
            {
                CanBeDelagated     = true,
                OwnerGroupRef      = targetGroupID,
                OwnerUserRef       = targetUserID,
                WorkingInterval    = interval,
                ParentPermitionRef = prm[0]
            };

            p.SetObjectID(doType, dataObject.ID);
            p.SetOperationID(doType, operation.ID);
            ServerModel.DB.Insert(p);
        }
Example #10
0
        public async void ExecuteUpsert()
        {
            if (mCloudDBZone == null)
            {
                ShowResultPopup("Please open CloudDBZone first!");
                return;
            }

            CloudDBZoneObject bookInfoObject = (CloudDBZoneObject)ObjectTypeHelper.ConvertCSharpTypeToJavaType(bookInfoTest);
            Task <int>        upsertTask     = mCloudDBZone.ExecuteUpsertAsync(bookInfoObject);

            try
            {
                await upsertTask;
                int   cloudDBZoneResult = upsertTask.Result;
                ShowResultPopup(cloudDBZoneResult + " records upserted");
            }
            catch (Exception e)
            {
                ShowResultPopup("Insert book info failed" + e.Message);
            }
        }
Example #11
0
 public override IEnumerable <SubObjectState <BeforeStatementType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(GetBasedOnKnownIdentifiers(connection, helper, (parent, name) => CreateAsCompleted(parent, name)));
 }
Example #12
0
 public override IEnumerable <RootObjectState <CompletionType, Stateless> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(GetBasedOnKnownIdentifiers(connection, helper, name => Create()));
 }
Example #13
0
 public override IEnumerable <RootObjectState <TableType, Stateless> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from table in connection.GetAllTables()
            select Create(table.QualifiedName));
 }
Example #14
0
 public override IEnumerable <SubObjectState <FieldType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from field in connection.GetAllFields()
            let table = TableType.Identifier(field.Table.QualifiedName)
                        select field.IsSequencedPkey ? CreateSequencedPkey(table, field.Name, field.OrdinalPosition, field.DataType, field.IsNullable, field.SequenceName)
                                         : Create(table, field.Name, field.OrdinalPosition, field.DataType, field.IsNullable));
 }
Example #15
0
 public override IEnumerable <SubObjectState <FulltextIndexType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from fulltextIndex in connection.GetAllFulltextIndexes()
            select Create(TableType.Identifier(fulltextIndex.Table.QualifiedName), FulltextCatalogType.Identifier(fulltextIndex.Catalog),
                          fulltextIndex.KeyName, fulltextIndex.ColumnNames));
 }
Example #16
0
 public override IEnumerable <SubObjectState <FkeyType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from fkey in connection.GetAllForeignKeys()
            select Create(TableType.Identifier(fkey.FromTable.QualifiedName), TableType.Identifier(fkey.ToTable.QualifiedName),
                          fkey.Name, fkey.IsCascadeDelete, from j in fkey.Joins select new FieldPair(j.FromFieldName, j.ToFieldName)));
 }
Example #17
0
        /// <summary>
        /// 关注/取消关注事件
        /// </summary>
        /// <param name="Xml"></param>
        /// <returns></returns>
        private string GetEvenMsg(XmlElement Xml)
        {
            StringBuilder EvenXml = new StringBuilder();
            //获取事件Model
            XmlElementEven EvenModel = GetXmlElementEven.GetExmlModel(Xml);

            if (!string.IsNullOrEmpty(EvenModel.Event) && EvenModel.Event == "subscribe")
            {
                //订阅事件回复内容
                StringBuilder Content = new StringBuilder();
                Content.Append("您好,感谢关注厦门信同美建设工程有限公司!\n");
                ObjectTypeHelper type = new ObjectTypeHelper();
                int NowTime           = type.ConvertDateTimeInt(DateTime.Now);
                EvenXml.Append("<xml>");
                EvenXml.Append("<ToUserName><![CDATA[" + EvenModel.FromUserName + "]]></ToUserName>");
                EvenXml.Append("<FromUserName><![CDATA[" + EvenModel.ToUserName + "]]></FromUserName>");
                EvenXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
                EvenXml.Append("<MsgType><![CDATA[text]]></MsgType>");
                EvenXml.Append("<Content><![CDATA[" + Content.ToString() + "]]></Content>");
                EvenXml.Append("<FuncFlag>0</FuncFlag>");
                EvenXml.Append("</xml>");
            }
            if (EvenModel.EventKey == "My_SuCai")
            {
                //图文消息
                ObjectTypeHelper type = new ObjectTypeHelper();
                int NowTime           = type.ConvertDateTimeInt(DateTime.Now);
                EvenXml.Append("<xml>");
                EvenXml.Append("<ToUserName><![CDATA[" + EvenModel.FromUserName + "]]></ToUserName>");
                EvenXml.Append("<FromUserName><![CDATA[" + EvenModel.ToUserName + "]]></FromUserName>");
                EvenXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
                EvenXml.Append("<MsgType><![CDATA[news]]></MsgType>");
                EvenXml.Append("<ArticleCount>2</ArticleCount>");
                EvenXml.Append("<Articles>");
                EvenXml.Append("<item>");
                EvenXml.Append("<Title><![CDATA[我是标题]]></Title> ");
                EvenXml.Append("<Description><![CDATA[我是描述]]></Description>");
                EvenXml.Append("<PicUrl><![CDATA[http://www.51fdc.com/imageshome/upload/201407170627106992.jpg]]></PicUrl>");
                EvenXml.Append("<Url><![CDATA[www.baidu.com]]></Url>");
                EvenXml.Append("</item>");
                EvenXml.Append("<item>");
                EvenXml.Append("<Title><![CDATA[我是二标题]]></Title> ");
                EvenXml.Append("<Description><![CDATA[我是二描述]]></Description>");
                EvenXml.Append("<PicUrl><![CDATA[http://img3.fengniao.com/forum/attachpics/851/67/34013207_1024.jpg]]></PicUrl>");
                EvenXml.Append("<Url><![CDATA[http://mp.weixin.qq.com/s?__biz=MzI0NDQ3NDkwMQ==&mid=100000027&idx=1&sn=9dfc09b88f74a97c06420defe5b4e88d&chksm=695c74615e2bfd7709bae70c2edfc61ddcbbf392d4e62d2651ec85c1a84ed3c923946cded0c1&scene=18#wechat_redirect]]></Url>");
                EvenXml.Append("</item>");
                EvenXml.Append("</Articles>");
                EvenXml.Append("</xml>");
            }
            if (EvenModel.EventKey == "My_MediaId")
            {
                //图片消息
                ObjectTypeHelper type = new ObjectTypeHelper();
                int NowTime           = type.ConvertDateTimeInt(DateTime.Now);
                EvenXml.Append("<xml>");
                EvenXml.Append("<ToUserName><![CDATA[" + EvenModel.FromUserName + "]]></ToUserName>");
                EvenXml.Append("<FromUserName><![CDATA[" + EvenModel.ToUserName + "]]></FromUserName>");
                EvenXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
                EvenXml.Append("<MsgType><![CDATA[image]]></MsgType>");
                EvenXml.Append("<Image>");
                EvenXml.Append("<MediaId><![CDATA[dSqdqKXPv82mkBeBvf3kjePuRqHnOU1TLWsZs21XCjg]]></MediaId>");
                EvenXml.Append("</Image>");
                EvenXml.Append("</xml>");
            }
            if (EvenModel.EventKey == "My_Link")
            {
                //链接消息
                ObjectTypeHelper type = new ObjectTypeHelper();
                int NowTime           = type.ConvertDateTimeInt(DateTime.Now);
                EvenXml.Append("<xml>");
                EvenXml.Append("<ToUserName><![CDATA[" + EvenModel.FromUserName + "]]></ToUserName>");
                EvenXml.Append("<FromUserName><![CDATA[" + EvenModel.ToUserName + "]]></FromUserName>");
                EvenXml.Append("<CreateTime>" + NowTime + "</CreateTime>");
                EvenXml.Append("<MsgType><![CDATA[link]]></MsgType>");
                EvenXml.Append("<Title><![CDATA[公众平台官网链接]]></Title>");
                EvenXml.Append("<Description><![CDATA[公众平台官网链接]]></Description>");
                EvenXml.Append("<Url><![CDATA[www.baidu.com]]></Url>");
                EvenXml.Append("<MsgId>6349021361213152058</MsgId>");
                EvenXml.Append("</xml>");
            }
            return(EvenXml.ToString());
        }
Example #18
0
 public override IEnumerable<SubObjectState<PreUpgradeHookType, Stateless>> GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return GetBasedOnKnownIdentifiers(connection, helper, (query, name) => Create(query));
 }
Example #19
0
 public override IEnumerable <RootObjectState <TableRenameType, TableRenameType.State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     // Table renames don't get tracked in existing databases at all - no point!
     yield break;
 }
Example #20
0
 public override IEnumerable <RootObjectState <FulltextCatalogType, Stateless> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from name in connection.GetAllFulltextCatalogs() select Create(name));
 }
Example #21
0
 public override IEnumerable <RootObjectState <OldVersionCacheMigrationType, OldVersionCacheMigrationType.State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     // This runs before the state table exists, so we wait until the Step is run to figure out what exists.
     yield break;
 }
Example #22
0
 public override IEnumerable <SubObjectState <PendingReorderTableType, Stateless> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(GetBasedOnKnownIdentifiers(connection, helper, (parent, name) => Create(parent, name)));
 }
Example #23
0
 public override IEnumerable <SubObjectState <UniqueIndexType, UniqueIndexType.State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from index in connection.GetAllUniqueIndexes()
            join custom in connection.GetAllIndexCustomState()
            on new { table = TableType.Identifier(index.Table.QualifiedName), index = UniqueIndexType.Identifier(index.Name) }
            equals new { table = TableType.Identifier(custom.Table.QualifiedName), index = UniqueIndexType.Identifier(custom.IndexName) }
            into indexCustom
            select CreateState(TableType.Identifier(index.Table.QualifiedName), index.Name,
                               new State(index.IsPrimaryKey, from field in index.FieldNames select FieldType.Identifier(field),
                                         indexCustom.Any() ? indexCustom.Single().CustomState :
                                         index.IsPrimaryKey ? connection.SchemaDriver.DefaultPrimaryKeyCustomState
                                                           : connection.SchemaDriver.DefaultUniqueConstraintCustomState)));
 }
Example #24
0
 public override IEnumerable <RootObjectState <ViewType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from view in connection.GetAllViews() select Create(view.QualifiedName, view.Body));
 }
Example #25
0
        public override IEnumerable <RootObjectState <QueryType, ProcState> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
        {
            var existingNames = new HashSet <string>(connection.DbDriver.DbStringComparer);

            foreach (var proc in connection.GetAllStoredProcsAndFunctions())
            {
                existingNames.Add(proc.QualifiedName);
                var func = proc as IntrospectedFunction;
                if (func != null)
                {
                    yield return(CreateFunction(func.QualifiedName, func.Parameters, func.ReturnType, func.Body));
                }
                else
                {
                    yield return(CreateProc(proc.QualifiedName, proc.Parameters, proc.Body));
                }
            }

            // Queries that do not exist as stored procs or functions just get stored as known objects in the state tables.
            foreach (var known in GetBasedOnKnownIdentifiers(connection, helper, CreateUnstored))
            {
                if (!existingNames.Contains(known.Name))
                {
                    yield return(known);
                }
            }
        }
Example #26
0
 public override IEnumerable <SubObjectState <TriggerType, State> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     return(from trigger in connection.GetAllTriggers()
            select Create(TableType.Identifier(trigger.Table.QualifiedName), trigger.QualifiedName, trigger.Timing, trigger.Events, trigger.Body));
 }
Example #27
0
        private static void runSteps(SchemaConnection connection, IOutput output, SchemaChangeOptions options, string phaseName, IEnumerable <ISchemaProvider> providers,
                                     ref DatabaseState currentState, ref ImmutableHashSet <ObjectType> objectTypes, ref StateStorage storage)
        {
            using (var progress = output.ProgressBlock())
            {
                output.Message(phaseName + ": Starting...");

                // Get object types, get steps, get desired state, get current state, everything else
                var chunks = progress.GetChunks(1, 1, 5, 5, 1, 50).ToList();

                var oldTypes = objectTypes;
                using (chunks[0].Start())
                {
                    objectTypes = (from provider in providers
                                   from objectType in provider.GetObjectTypes(connection.SchemaDriver)
                                   select objectType).ToImmutableHashSet();
                    output.Verbose(phaseName + ": Object types: " + string.Join(", ", objectTypes));
                }

                // Get all the steps and organize them into order
                IImmutableList <StepBase> steps;
                using (chunks[1].Start())
                {
                    steps = sortSteps(from objectType in objectTypes
                                      from step in objectType.Steps
                                      select step);
                    output.Verbose(phaseName + ": Steps: " + string.Join(", ", steps));
                }

                // Get the desired state
                DatabaseState desiredState;
                using (chunks[2].Start())
                {
                    output.Verbose(phaseName + ": Determining desired database state...");
                    desiredState = DatabaseState.Create(from provider in providers
                                                        from state in provider.GetDesiredState(connection, chunks[2])
                                                        select state);

                    foreach (var overrideProvider in providers.OfType <ISchemaOverrideProvider>())
                    {
                        desiredState = overrideProvider.ApplyOverrides(connection, desiredState);
                    }

                    output.Message(phaseName + ": " + counted(desiredState.Count, "object") + " desired.");
                }

                ObjectTypeHelper helper;
                using (chunks[3].Start())
                {
                    // Get the current state
                    output.Verbose(phaseName + ": Determining current database state...");
                    helper       = new ObjectTypeHelper(objectTypes, storage != null, connection.DbDriver);
                    currentState = currentState.With(from objectType in objectTypes
                                                     where !oldTypes.Contains(objectType)
                                                     from state in objectType.GetExistingObjects(connection, helper)
                                                     select state);
                    output.Verbose(phaseName + ": " + counted(currentState.Count, "object") + " existing.");
                }

                // Filter to only things that are relevant here
                using (chunks[4].Start())
                {
                    output.Verbose(phaseName + ": Filtering...");
                    if (storage != null)
                    {
                        var priorKnownRoots = storage.GetKnownRoots(helper);
                        var priorKnownSubs  = storage.GetKnownSubs(helper);

                        // Anything that exists in *both* current and desired is treated as known and assumed to be in-scope for consideration
                        var knownRoots = priorKnownRoots.Union(from root in currentState.RootObjects
                                                               where desiredState.Contains(root)
                                                               select root.Identifier);
                        foreach (var extra in knownRoots.Except(priorKnownRoots))
                        {
                            storage.PutRoot(extra);
                        }
                        // FIXME: remove from storage anything that's of a type that's under consideration but is neither current nor desired

                        var knownSubs = priorKnownSubs.Union(from sub in currentState.AllChildren
                                                             where desiredState.Contains(sub)
                                                             select Tuple.Create(sub.ParentIdentifier, sub.Identifier));
                        foreach (var extra in knownSubs.Except(priorKnownSubs))
                        {
                            storage.PutSub(extra.Item1, extra.Item2);
                        }
                        // FIXME: remove from storage anything that's of a type that's under consideration but is neither current nor desired

                        var _storage     = storage;
                        var initialState = currentState;
                        currentState = currentState.WithFilters((root) => desiredState.ContainsRoot(root) ||
                                                                Objects.Tables.TableRenameType.ContainsRenameTo(desiredState, root) ||
                                                                Objects.Tables.PendingReorderTableType.IsTablePendingReorder(initialState, root) ||
                                                                (options.PreserveUnknownObjects ? !initialState.ContainsRoot(root) : _storage.ContainsRoot(root)),
                                                                null);
                    }
                    else
                    {
                        // FIXME this doesn't allow for any flexibility in whether the nrdo_ tables live in dbo
                        currentState = currentState.WithFilters(root => root.Name.StartsWith("dbo.nrdo_", StringComparison.OrdinalIgnoreCase),
                                                                null);
                    }
                    output.Message(phaseName + ": " + counted(currentState.Count, "applicable existing object") + ".");
                }

                var isFullRun = storage != null;
                if (isFullRun)
                {
                    // Sanity check for any before statements that will be skipped due to the associated step not existing
                    var stepSet        = new HashSet <string>(from step in steps select step.Identifier, Nstring.DBEquivalentComparer);
                    var current        = currentState; // Can't use ref parameter directly inside linq query
                    var unknownBefores = from stmt in BeforeStatementType.AllFrom(desiredState)
                                         where !stepSet.Contains(stmt.State.Step) && !current.Contains(stmt)
                                         select stmt;
                    foreach (var stmt in unknownBefores)
                    {
                        output.Warning(stmt.Name + " on " + stmt.ParentIdentifier + " will not be executed because there is no such step as " + stmt.State.Step);
                    }
                }

                var changes = SchemaChanges.Create(currentState, desiredState, connection, chunks[5], options, storage);

                changes.PerformSteps(steps, phaseName, isFullRun);

                currentState = changes.Current.WithoutFilters();
                storage      = changes.Storage;

                if (changes.HasFailed)
                {
                    throw new ApplicationException("Schema update failed");
                }

                output.Message(phaseName + ": Completed.");
                output.Message(phaseName + ": " + counted(changes.StatementCount, "statement") + " executed.");
                output.Message(phaseName + ": " + counted(currentState.Count, "object") + " existing.");
            }
        }
Example #28
0
 public override IEnumerable <SubObjectState <FieldOrderSensitivityType, Stateless> > GetExistingObjects(SchemaConnection connection, ObjectTypeHelper helper)
 {
     // We don't bother storing this in the database - it's a characteristic of the desired state only.
     yield break;
 }