コード例 #1
0
ファイル: FBSchemaLoader.cs プロジェクト: rsdn/janus
		private static List<KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable)
		{
			var aStore = new List<KeySchema>();
			var aHash = new List<string>();

			string[] restrict3 = {null, null, null};

			#region Primary
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			var dtShema = con.GetSchema("PrimaryKeys", restrict3);
			aHash.Clear();
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["PK_NAME"].ToString();
				if (aHash.Contains(cName))
					continue;
				var eKey = new KeySchema();
				var columns = "";
				aHash.Add(cName);
				eKey.KeyType = ConstraintType.KeyPrimary;
				eKey.Name = cName;
				var dtv = dtShema.DefaultView;
				dtv.RowFilter = "PK_NAME = '" + cName + "'";
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
					columns += (dtv[y]["COLUMN_NAME"] + ", ");
				columns = columns.Remove(columns.Length - 2, 2);
				eKey.Columns = columns;
				aStore.Add(eKey);
			}
			#endregion

			#region Foreign
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			dtShema = con.GetSchema("ForeignKeys", restrict3);
			var dtShemaCols = con.GetSchema("ForeignKeyColumns", restrict3);
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["INDEX_NAME"].ToString();
				var eKey = new KeySchema();
				string columns = "", rcolumns = "";
				eKey.KeyType = ConstraintType.KeyForeign;
				eKey.Name = cName;
				eKey.RelTable = cRow["REFERENCED_TABLE_NAME"].ToString();
				var uRule = cRow["UPDATE_RULE"].ToString();
				var dRule = cRow["DELETE_RULE"].ToString();
				switch (uRule)
				{
					case "RESTRICT":
						eKey.UpdateRule = LinkRule.None;
						break;
					case "CASCADE":
						eKey.UpdateRule = LinkRule.Cascade;
						break;
					case "SET NULL":
						eKey.UpdateRule = LinkRule.SetNull;
						break;
					case "SET DEFAULT":
						eKey.UpdateRule = LinkRule.SetDefault;
						break;
				}

				switch (dRule)
				{
					case "RESTRICT":
						eKey.DeleteRule = LinkRule.None;
						break;
					case "CASCADE":
						eKey.DeleteRule = LinkRule.Cascade;
						break;
					case "SET NULL":
						eKey.DeleteRule = LinkRule.SetNull;
						break;
					case "SET DEFAULT":
						eKey.DeleteRule = LinkRule.SetDefault;
						break;
				}

				var dtv = dtShemaCols.DefaultView;
				dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
				{
					columns += (dtv[y]["COLUMN_NAME"] + ", ");
					rcolumns += (dtv[y]["REFERENCED_COLUMN_NAME"] + ", ");
				}
				columns = columns.Remove(columns.Length - 2, 2);
				rcolumns = rcolumns.Remove(rcolumns.Length - 2, 2);
				eKey.Columns = columns;
				eKey.RelColumns = rcolumns;
				aStore.Add(eKey);
			}
			#endregion

			#region Unique
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			dtShema = con.GetSchema("UniqueKeys", restrict3);
			aHash.Clear();
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["UK_NAME"].ToString();
				if (aHash.Contains(cName))
					continue;
				var eKey = new KeySchema();
				var columns = "";
				aHash.Add(cName);
				eKey.KeyType = ConstraintType.Unique;
				eKey.Name = cName;
				var dtv = dtShema.DefaultView;
				dtv.RowFilter = "UK_NAME = '" + cName + "'";
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
					columns += (dtv[y]["COLUMN_NAME"] + ", ");
				columns = columns.Remove(columns.Length - 2, 2);
				eKey.Columns = columns;
				aStore.Add(eKey);
			}
			#endregion

			return aStore;
		}
コード例 #2
0
 private string MakeDdlGeneratorDrop(SchemaNamedElement gen)
 {
     return(string.Format(@"DROP GENERATOR {0}",
                          MakeDdlElementName(gen.Name)));
 }
コード例 #3
0
        private static List <KeySchema> GetKeys(SqlConnection con, SchemaNamedElement eTable)
        {
            var keys  = new List <KeySchema>();
            var aHash = new Dictionary <string, bool>();

            string[] restrict3 = { null, null, null };
            string[] restrict4 = { null, null, null, null };

            #region Primary keys
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            var dtShema = SqlSchemaFactory.GetSchema(con, "PrimaryKeys", restrict3);
            aHash.Clear();
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow  = dtShema.Rows[x];
                var cName = cRow["CONSTRAINT_NAME"].ToString();
                if (aHash.ContainsKey(cName))
                {
                    continue;
                }
                aHash.Add(cName, true);

                var eKey = new KeySchema
                {
                    KeyType   = ConstraintType.KeyPrimary,
                    Name      = cName,
                    Clustered = Convert.ToBoolean(cRow["IS_CLUSTERED"], CultureInfo.InvariantCulture)
                };

                var columns = new StringBuilder();

                var dtv = dtShema.DefaultView;
                dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName);
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    columns.Append(dtv[y]["COLUMN_NAME"]);
                    columns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
                }

                eKey.Columns = columns.ToString();
                keys.Add(eKey);
            }
            #endregion

            #region Foreign keys
            restrict4[0] = null;
            restrict4[1] = null;
            restrict4[2] = eTable.Name;
            restrict4[3] = null;
            dtShema      = SqlSchemaFactory.GetSchema(con, "ForeignKeys", restrict4);
            aHash.Clear();
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow = dtShema.Rows[x];
                if (Convert.ToBoolean(cRow["IS_DISABLED"], CultureInfo.InvariantCulture))
                {
                    continue;
                }
                var cName = cRow["CONSTRAINT_NAME"].ToString();
                if (aHash.ContainsKey(cName))
                {
                    continue;
                }
                aHash.Add(cName, true);

                var eKey = new KeySchema
                {
                    KeyType    = ConstraintType.KeyForeign,
                    Name       = cName,
                    RelTable   = cRow["PK_TABLE_NAME"].ToString(),
                    UpdateRule = GetDbsmRule(cRow["UPDATE_RULE"].ToString()),
                    DeleteRule = GetDbsmRule(cRow["DELETE_RULE"].ToString())
                };

                var fcolumns = new StringBuilder();
                var rcolumns = new StringBuilder();

                var dtv = dtShema.DefaultView;
                dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName);
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    fcolumns.Append(dtv[y]["FK_COLUMN_NAME"]);
                    fcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", ");

                    rcolumns.Append(dtv[y]["PK_COLUMN_NAME"]);
                    rcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
                }

                eKey.Columns    = fcolumns.ToString();
                eKey.RelColumns = rcolumns.ToString();
                keys.Add(eKey);
            }
            #endregion

            #region Checks
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            dtShema      = SqlSchemaFactory.GetSchema(con, "CheckConstraints", restrict3);
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var row = dtShema.Rows[x];

                var eKey = new KeySchema
                {
                    KeyType = ConstraintType.Check,
                    Name    = row["CONSTRAINT_NAME"].ToString(),
                    Source  = row["SOURCE"].ToString()
                };

                keys.Add(eKey);
            }
            #endregion

            #region Unique
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            dtShema      = SqlSchemaFactory.GetSchema(con, "UniqueKeys", restrict3);
            aHash.Clear();
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow  = dtShema.Rows[x];
                var cName = cRow["CONSTRAINT_NAME"].ToString();
                if (aHash.ContainsKey(cName))
                {
                    continue;
                }
                var eKey = new KeySchema();
                aHash.Add(cName, true);
                eKey.KeyType = ConstraintType.Unique;
                eKey.Name    = cName;

                var columns = new StringBuilder();

                var dtv = dtShema.DefaultView;
                dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    columns.Append(dtv[y]["COLUMN_NAME"]);
                    columns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
                }

                eKey.Columns = columns.ToString();
                keys.Add(eKey);
            }
            #endregion

            #region Default constraints
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            dtShema      = SqlSchemaFactory.GetSchema(con, "DefaultConstraints", restrict3);
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow = dtShema.Rows[x];
                var eKey = new KeySchema
                {
                    KeyType = ConstraintType.Default,
                    Name    = cRow["CONSTRAINT_NAME"].ToString(),
                    Columns = cRow["COLUMN_NAME"].ToString(),
                    Source  = UnBracket.ParseUnBracket(cRow["SOURCE"].ToString())
                };
                keys.Add(eKey);
            }
            #endregion

            return(keys);
        }
コード例 #4
0
ファイル: FBSchemaDriver.cs プロジェクト: permyakov/janus
		private string MakeDdlGeneratorDrop(SchemaNamedElement gen)
		{
			return string.Format(@"DROP GENERATOR {0}",
				MakeDdlElementName(gen.Name));
		}
コード例 #5
0
 private string MakeDdlGeneratorCreate(SchemaNamedElement gen)
 {
     return(string.Format(@"CREATE GENERATOR {0}",
                          MakeDdlElementName(gen.Name)));
 }
コード例 #6
0
        private static List <KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable)
        {
            var aStore = new List <KeySchema>();
            var aHash  = new List <string>();

            string[] restrict3 = { null, null, null };

            #region Primary
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            var dtShema = con.GetSchema("PrimaryKeys", restrict3);
            aHash.Clear();
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow  = dtShema.Rows[x];
                var cName = cRow["PK_NAME"].ToString();
                if (aHash.Contains(cName))
                {
                    continue;
                }
                var eKey    = new KeySchema();
                var columns = "";
                aHash.Add(cName);
                eKey.KeyType = ConstraintType.KeyPrimary;
                eKey.Name    = cName;
                var dtv = dtShema.DefaultView;
                dtv.RowFilter = "PK_NAME = '" + cName + "'";
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    columns += (dtv[y]["COLUMN_NAME"] + ", ");
                }
                columns      = columns.Remove(columns.Length - 2, 2);
                eKey.Columns = columns;
                aStore.Add(eKey);
            }
            #endregion

            #region Foreign
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            dtShema      = con.GetSchema("ForeignKeys", restrict3);
            var dtShemaCols = con.GetSchema("ForeignKeyColumns", restrict3);
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var    cRow = dtShema.Rows[x];
                var    cName = cRow["INDEX_NAME"].ToString();
                var    eKey = new KeySchema();
                string columns = "", rcolumns = "";
                eKey.KeyType  = ConstraintType.KeyForeign;
                eKey.Name     = cName;
                eKey.RelTable = cRow["REFERENCED_TABLE_NAME"].ToString();
                var uRule = cRow["UPDATE_RULE"].ToString();
                var dRule = cRow["DELETE_RULE"].ToString();
                switch (uRule)
                {
                case "RESTRICT":
                    eKey.UpdateRule = LinkRule.None;
                    break;

                case "CASCADE":
                    eKey.UpdateRule = LinkRule.Cascade;
                    break;

                case "SET NULL":
                    eKey.UpdateRule = LinkRule.SetNull;
                    break;

                case "SET DEFAULT":
                    eKey.UpdateRule = LinkRule.SetDefault;
                    break;
                }

                switch (dRule)
                {
                case "RESTRICT":
                    eKey.DeleteRule = LinkRule.None;
                    break;

                case "CASCADE":
                    eKey.DeleteRule = LinkRule.Cascade;
                    break;

                case "SET NULL":
                    eKey.DeleteRule = LinkRule.SetNull;
                    break;

                case "SET DEFAULT":
                    eKey.DeleteRule = LinkRule.SetDefault;
                    break;
                }

                var dtv = dtShemaCols.DefaultView;
                dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    columns  += (dtv[y]["COLUMN_NAME"] + ", ");
                    rcolumns += (dtv[y]["REFERENCED_COLUMN_NAME"] + ", ");
                }
                columns         = columns.Remove(columns.Length - 2, 2);
                rcolumns        = rcolumns.Remove(rcolumns.Length - 2, 2);
                eKey.Columns    = columns;
                eKey.RelColumns = rcolumns;
                aStore.Add(eKey);
            }
            #endregion

            #region Unique
            restrict3[0] = null;
            restrict3[1] = null;
            restrict3[2] = eTable.Name;
            dtShema      = con.GetSchema("UniqueKeys", restrict3);
            aHash.Clear();
            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow  = dtShema.Rows[x];
                var cName = cRow["UK_NAME"].ToString();
                if (aHash.Contains(cName))
                {
                    continue;
                }
                var eKey    = new KeySchema();
                var columns = "";
                aHash.Add(cName);
                eKey.KeyType = ConstraintType.Unique;
                eKey.Name    = cName;
                var dtv = dtShema.DefaultView;
                dtv.RowFilter = "UK_NAME = '" + cName + "'";
                dtv.Sort      = "ORDINAL_POSITION ASC";
                for (var y = 0; y < dtv.Count; y++)
                {
                    columns += (dtv[y]["COLUMN_NAME"] + ", ");
                }
                columns      = columns.Remove(columns.Length - 2, 2);
                eKey.Columns = columns;
                aStore.Add(eKey);
            }
            #endregion

            return(aStore);
        }
コード例 #7
0
ファイル: FBSchemaDriver.cs プロジェクト: permyakov/janus
		private string MakeDdlGeneratorCreate(SchemaNamedElement gen)
		{
			return string.Format(@"CREATE GENERATOR {0}",
				MakeDdlElementName(gen.Name));
		}
コード例 #8
0
        private static List <KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable)
        {
            var dbsmKeys = new Dictionary <string, KeySchema>();

            string[] restrict3 = { null, null, eTable.Name };

            #region Primary
            var dtShema = con.GetSchema("Columns", restrict3);
            var dtv     = dtShema.DefaultView;
            dtv.RowFilter = "PRIMARY_KEY = 'True'";
            dtv.Sort      = "ORDINAL_POSITION ASC";

            if (dtv.Count > 0)
            {
                string columns = null;
                for (var y = 0; y < dtv.Count; y++)
                {
                    if (columns == null)
                    {
                        columns = dtv[y]["COLUMN_NAME"].ToString();
                    }
                    else
                    {
                        columns += (", " + dtv[y]["COLUMN_NAME"]);
                    }
                }

                var eKey = new KeySchema
                {
                    KeyType = ConstraintType.KeyPrimary,
                    Name    = ("PK_" + eTable.Name),
                    Columns = columns
                };
                dbsmKeys.Add(eKey.Name, eKey);
            }
            #endregion

            #region Unique (не поддерживается SQLite)
            //dtv.RowFilter = "PRIMARY_KEY = 'False' AND UNIQUE = 'True'";
            //dtv.Sort = "ORDINAL_POSITION ASC";
            //
            //for (int y = 0; y < dtv.Count; y++)
            //{
            //	string cName = dtv[y]["COLUMN_NAME"].ToString();
            //	if (!dbsmKeys.ContainsKey(cName))
            //	{
            //		DBKey eKey = new DBKey();
            //		eKey.Name = cName;
            //		eKey.KeyType = ConstraintType.Unique;
            //		eKey.ColumnList = cName;
            //		dbsmKeys.Add(cName, eKey);
            //	}
            //}
            #endregion

            #region Foreign
            dtShema = con.GetSchema("ForeignKeys", restrict3);

            for (var x = 0; x < dtShema.Rows.Count; x++)
            {
                var cRow  = dtShema.Rows[x];
                var cName = cRow["CONSTRAINT_NAME"].ToString();

                if (dbsmKeys.ContainsKey(cName))
                {
                    continue;
                }
                var    eKey     = new KeySchema();
                string columns  = null;
                string rcolumns = null;

                eKey.KeyType  = ConstraintType.KeyForeign;
                eKey.Name     = cName;
                eKey.RelTable = cRow["TABLE_NAME"].ToString();

                dtv           = dtShema.DefaultView;
                dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
                dtv.Sort      = "FKEY_FROM_ORDINAL_POSITION ASC";

                for (var y = 0; y < dtv.Count; y++)
                {
                    if (columns == null)
                    {
                        Debug.Assert(rcolumns == null);
                        columns  = dtv[y]["FKEY_FROM_COLUMN"].ToString();
                        rcolumns = dtv[y]["FKEY_TO_COLUMN"].ToString();
                    }
                    else
                    {
                        Debug.Assert(rcolumns != null);
                        columns  += (", " + dtv[y]["FKEY_FROM_COLUMN"]);
                        rcolumns += (", " + dtv[y]["FKEY_TO_COLUMN"]);
                    }
                }

                eKey.Columns    = columns;
                eKey.RelColumns = rcolumns;
                dbsmKeys.Add(cName, eKey);
            }
            #endregion

            return(new List <KeySchema>(dbsmKeys.Values));
        }
コード例 #9
0
ファイル: FBSchemaDriver.cs プロジェクト: rsdn/janus
		private string MakeDdlGeneratorDrop(SchemaNamedElement gen)
		{
			return $@"DROP GENERATOR {MakeDdlElementName(gen.Name)}";
		}
コード例 #10
0
ファイル: FBSchemaDriver.cs プロジェクト: rsdn/janus
		private string MakeDdlGeneratorCreate(SchemaNamedElement gen)
		{
			return $@"CREATE GENERATOR {MakeDdlElementName(gen.Name)}";
		}
コード例 #11
0
ファイル: MssqlSchemaLoader.cs プロジェクト: rsdn/janus
		private static List<KeySchema> GetKeys(SqlConnection con, SchemaNamedElement eTable)
		{
			var keys = new List<KeySchema>();
			var aHash = new Dictionary<string, bool>();

			string[] restrict3 = {null, null, null};
			string[] restrict4 = {null, null, null, null};

			#region Primary keys
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			var dtShema = SqlSchemaFactory.GetSchema(con, "PrimaryKeys", restrict3);
			aHash.Clear();
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["CONSTRAINT_NAME"].ToString();
				if (aHash.ContainsKey(cName))
					continue;
				aHash.Add(cName, true);

				var eKey = new KeySchema
				{
					KeyType = ConstraintType.KeyPrimary,
					Name = cName,
					Clustered = Convert.ToBoolean(cRow["IS_CLUSTERED"], CultureInfo.InvariantCulture)
				};

				var columns = new StringBuilder();

				var dtv = dtShema.DefaultView;
				dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName);
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
				{
					columns.Append(dtv[y]["COLUMN_NAME"]);
					columns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
				}

				eKey.Columns = columns.ToString();
				keys.Add(eKey);
			}
			#endregion

			#region Foreign keys
			restrict4[0] = null;
			restrict4[1] = null;
			restrict4[2] = eTable.Name;
			restrict4[3] = null;
			dtShema = SqlSchemaFactory.GetSchema(con, "ForeignKeys", restrict4);
			aHash.Clear();
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				if (Convert.ToBoolean(cRow["IS_DISABLED"], CultureInfo.InvariantCulture))
					continue;
				var cName = cRow["CONSTRAINT_NAME"].ToString();
				if (aHash.ContainsKey(cName))
					continue;
				aHash.Add(cName, true);

				var eKey = new KeySchema
				{
					KeyType = ConstraintType.KeyForeign,
					Name = cName,
					RelTable = cRow["PK_TABLE_NAME"].ToString(),
					UpdateRule = GetDbsmRule(cRow["UPDATE_RULE"].ToString()),
					DeleteRule = GetDbsmRule(cRow["DELETE_RULE"].ToString())
				};

				var fcolumns = new StringBuilder();
				var rcolumns = new StringBuilder();

				var dtv = dtShema.DefaultView;
				dtv.RowFilter = string.Format("CONSTRAINT_NAME = '{0}'", cName);
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
				{
					fcolumns.Append(dtv[y]["FK_COLUMN_NAME"]);
					fcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", ");

					rcolumns.Append(dtv[y]["PK_COLUMN_NAME"]);
					rcolumns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
				}

				eKey.Columns = fcolumns.ToString();
				eKey.RelColumns = rcolumns.ToString();
				keys.Add(eKey);
			}
			#endregion

			#region Checks
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			dtShema = SqlSchemaFactory.GetSchema(con, "CheckConstraints", restrict3);
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var row = dtShema.Rows[x];

				var eKey = new KeySchema
				{
					KeyType = ConstraintType.Check,
					Name = row["CONSTRAINT_NAME"].ToString(),
					Source = row["SOURCE"].ToString()
				};

				keys.Add(eKey);
			}
			#endregion

			#region Unique
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			dtShema = SqlSchemaFactory.GetSchema(con, "UniqueKeys", restrict3);
			aHash.Clear();
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["CONSTRAINT_NAME"].ToString();
				if (aHash.ContainsKey(cName))
					continue;
				var eKey = new KeySchema();
				aHash.Add(cName, true);
				eKey.KeyType = ConstraintType.Unique;
				eKey.Name = cName;

				var columns = new StringBuilder();

				var dtv = dtShema.DefaultView;
				dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
				dtv.Sort = "ORDINAL_POSITION ASC";
				for (var y = 0; y < dtv.Count; y++)
				{
					columns.Append(dtv[y]["COLUMN_NAME"]);
					columns.Append(y == dtv.Count - 1 ? string.Empty : ", ");
				}

				eKey.Columns = columns.ToString();
				keys.Add(eKey);
			}
			#endregion

			#region Default constraints
			restrict3[0] = null;
			restrict3[1] = null;
			restrict3[2] = eTable.Name;
			dtShema = SqlSchemaFactory.GetSchema(con, "DefaultConstraints", restrict3);
			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var eKey = new KeySchema
				{
					KeyType = ConstraintType.Default,
					Name = cRow["CONSTRAINT_NAME"].ToString(),
					Columns = cRow["COLUMN_NAME"].ToString(),
					Source = UnBracket.ParseUnBracket(cRow["SOURCE"].ToString())
				};
				keys.Add(eKey);
			}
			#endregion

			return keys;
		}
コード例 #12
0
ファイル: SqliteSchemaLoader.cs プロジェクト: rsdn/janus
		private static List<KeySchema> GetKeys(DbConnection con, SchemaNamedElement eTable)
		{
			var dbsmKeys = new Dictionary<string, KeySchema>();

			string[] restrict3 = {null, null, eTable.Name};

			#region Primary
			var dtShema = con.GetSchema("Columns", restrict3);
			var dtv = dtShema.DefaultView;
			dtv.RowFilter = "PRIMARY_KEY = 'True'";
			dtv.Sort = "ORDINAL_POSITION ASC";

			if (dtv.Count > 0)
			{
				string columns = null;
				for (var y = 0; y < dtv.Count; y++)
					if (columns == null)
						columns = dtv[y]["COLUMN_NAME"].ToString();
					else
						columns += (", " + dtv[y]["COLUMN_NAME"]);

				var eKey = new KeySchema
				{
					KeyType = ConstraintType.KeyPrimary,
					Name = ("PK_" + eTable.Name),
					Columns = columns
				};
				dbsmKeys.Add(eKey.Name, eKey);
			}
			#endregion

			#region Unique (не поддерживается SQLite)
			//dtv.RowFilter = "PRIMARY_KEY = 'False' AND UNIQUE = 'True'";
			//dtv.Sort = "ORDINAL_POSITION ASC";
			//
			//for (int y = 0; y < dtv.Count; y++)
			//{
			//	string cName = dtv[y]["COLUMN_NAME"].ToString();
			//	if (!dbsmKeys.ContainsKey(cName))
			//	{
			//		DBKey eKey = new DBKey();
			//		eKey.Name = cName;
			//		eKey.KeyType = ConstraintType.Unique;
			//		eKey.ColumnList = cName;
			//		dbsmKeys.Add(cName, eKey);
			//	}
			//}
			#endregion

			#region Foreign
			dtShema = con.GetSchema("ForeignKeys", restrict3);

			for (var x = 0; x < dtShema.Rows.Count; x++)
			{
				var cRow = dtShema.Rows[x];
				var cName = cRow["CONSTRAINT_NAME"].ToString();

				if (dbsmKeys.ContainsKey(cName))
					continue;
				var eKey = new KeySchema();
				string columns = null;
				string rcolumns = null;

				eKey.KeyType = ConstraintType.KeyForeign;
				eKey.Name = cName;
				eKey.RelTable = cRow["TABLE_NAME"].ToString();

				dtv = dtShema.DefaultView;
				dtv.RowFilter = "CONSTRAINT_NAME = '" + cName + "'";
				dtv.Sort = "FKEY_FROM_ORDINAL_POSITION ASC";

				for (var y = 0; y < dtv.Count; y++)
					if (columns == null)
					{
						Debug.Assert(rcolumns == null);
						columns = dtv[y]["FKEY_FROM_COLUMN"].ToString();
						rcolumns = dtv[y]["FKEY_TO_COLUMN"].ToString();
					}
					else
					{
						Debug.Assert(rcolumns != null);
						columns += (", " + dtv[y]["FKEY_FROM_COLUMN"]);
						rcolumns += (", " + dtv[y]["FKEY_TO_COLUMN"]);
					}

				eKey.Columns = columns;
				eKey.RelColumns = rcolumns;
				dbsmKeys.Add(cName, eKey);
			}
			#endregion

			return new List<KeySchema>(dbsmKeys.Values);
		}