Exemple #1
0
 public Where(IQueryNode parent, Expression expression)
 {
     this.Parent     = parent;
     this.Expression = new ElementCode(expression, this.Owner.AllColumns, n => this.AddChild(n));
 }
Exemple #2
0
 public Element(ElementCode elementcode, Material material)
 {
     this.elementcode = elementcode;
     this.material = material;
     ElementParameter ElePara = ElementList.Serendipity.Find(l => l.ELEMENTCODE == elementcode);
 }
Exemple #3
0
        public static void Initialize()
        {
            // ロールとデータベースを作成する
            using (var con = E.CreateConnection("User ID=sa;Password='******';Host=localhost;Port=5432;Database=postgres;")) {
                con.Open();

                try {
                    E.CreateRole(con, RoleName, "Passw0rd!");
                } catch (DbCodeEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateObject)
                    {
                        throw;
                    }
                }
                try {
                    E.CreateDatabase(con, DbName, RoleName);
                } catch (DbCodeEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateDatabase)
                    {
                        throw;
                    }
                }
            }

            // データベース内のテーブル等を最新の仕様に合わせて変更する
            using (var con = CreateConnection()) {
                con.Open();
                var cmd = con.CreateCommand();
                cmd.CommandTimeout = 0;

                // データベースの状態を取得
                var current = E.ReadDatabaseDef(con);
                // クラスからデータベース定義を生成する
                var target = E.GenerateDatabaseDef(typeof(Db), DbName);
                // 差分を生成
                var delta = E.GetDatabaseDelta(current, target);

                // 差分を適用する
                var context = new ElementCode();
                E.ApplyDatabaseDelta(context, delta);
                context.Build().Execute(cmd);

                // ストアド登録コマンドを生成するデリゲート
                Func <string, Column, Column, string> createAddTextStoredProcedure = (spname, idcolumn, column) => {
                    var tableName = (column.Table as ITableDef).Name;
                    return($@"
DROP FUNCTION IF EXISTS {spname}(TEXT);
CREATE OR REPLACE FUNCTION {spname}(value_to_add TEXT)
RETURNS INT AS $$
	DECLARE
		id INT := 0;
	BEGIN
		SELECT {idcolumn.Name} INTO id FROM {tableName} WHERE {column.Name}=value_to_add;
		IF id <> 0 THEN
			RETURN id;
		ELSE
			INSERT INTO {tableName}({column.Name}) VALUES (value_to_add);
			RETURN lastval();
		END IF;
	END;
$$ LANGUAGE plpgsql;
");
                };

                // CVE登録ストアドを登録
                cmd.CommandText = createAddTextStoredProcedure(SpAddCve, Db.Cve.GetColumn(() => Db.Cve._.CveID), Db.Cve.GetColumn(() => Db.Cve._.Cve));
                cmd.ExecuteNonQuery();

                // ベンダー登録ストアドを登録
                cmd.CommandText = createAddTextStoredProcedure(SpAddVendor, Db.Vendor.GetColumn(() => Db.Vendor._.VendorID), Db.Vendor.GetColumn(() => Db.Vendor._.Vendor));
                cmd.ExecuteNonQuery();

                // CPE2.2登録ストアドを登録
                cmd.CommandText = createAddTextStoredProcedure(SpAddCpe22, Db.Cpe22.GetColumn(() => Db.Cpe22._.Cpe22ID), Db.Cpe22.GetColumn(() => Db.Cpe22._.Uri));
                cmd.ExecuteNonQuery();

                // CPE2.3登録ストアドを登録
                cmd.CommandText = createAddTextStoredProcedure(SpAddCpe23, Db.Cpe23.GetColumn(() => Db.Cpe23._.Cpe23ID), Db.Cpe23.GetColumn(() => Db.Cpe23._.Uri));
                cmd.ExecuteNonQuery();
            }
        }
Exemple #4
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Add(SqlKeyword.Where);
     context.Add(this.Expression);
 }
Exemple #5
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Add(this.Code);
 }
Exemple #6
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Add(SqlKeyword.GroupBy);
     context.AddColumns(this.Columns);
 }
Exemple #7
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Concat(this.Name);
 }
Exemple #8
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Add(SqlKeyword.Limit);
     context.Add(this.Value);
 }
Exemple #9
0
 /// <summary>
 /// コンストラクタ、親ノードと式を指定して初期化する
 /// </summary>
 /// <param name="parent">親ノード</param>
 /// <param name="expression">式</param>
 public Where(IQueryNode parent, ElementCode expression)
 {
     this.Parent     = parent;
     this.Expression = expression;
 }
Exemple #10
0
        public SelectFrom(IFrom from, Expression body)
        {
            this.Parent = from.Parent;
            this.From(from);
            this.Parent.AddChild(this);

            this.ColumnMap = new ColumnMap();
            this.Columns   = TypewiseCache <TSelectedColumns> .Creator();

            if (body == null)
            {
                // 全列選択に対応
                var sourceColumns = from.Table.ColumnMap;
                var environment   = this.Owner.Environment;
                for (int i = 0; i < sourceColumns.Count; i++)
                {
                    var column = sourceColumns[i];
                    var pi     = column.Property;
                    var ec     = new ElementCode();
                    ec.Add(column);
                    BindColumn(pi.Name, "c" + i, environment.CreateDbTypeFromType(pi.PropertyType), 0, ec);
                }
            }
            else if (body.NodeType == ExpressionType.New)
            {
                // new 演算子でのクラス生成式に対応

                // クラスのプロパティ数とコンストラクタ引数の数が異なるならエラーとする
                var newexpr    = body as NewExpression;
                var args       = newexpr.Arguments;
                var properties = typeof(TSelectedColumns).GetProperties();
                if (args.Count != properties.Length)
                {
                    throw new ApplicationException();
                }

                // プロパティと列定義を結びつけその生成元としてコンストラクタ引数を指定する
                var owner       = this.Owner;
                var environment = owner.Environment;
                var allColumns  = owner.AllColumns;
                for (int i = 0; i < properties.Length; i++)
                {
                    var pi = properties[i];
                    if (pi.PropertyType != args[i].Type)
                    {
                        throw new ApplicationException();
                    }
                    BindColumn(pi.Name, "c" + i, environment.CreateDbTypeFromType(pi.PropertyType), 0, new ElementCode(args[i], allColumns));
                }
            }
            else if (body.NodeType == ExpressionType.MemberInit)
            {
                // メンバ初期化式に対応

                // クラスのプロパティ数とコンストラクタ引数の数が異なるならエラーとする
                var initexpr = body as MemberInitExpression;
                var bindings = initexpr.Bindings;

                // プロパティと列定義を結びつけその生成元としてコンストラクタ引数を指定する
                var owner       = this.Owner;
                var environment = owner.Environment;
                var allColumns  = owner.AllColumns;
                for (int i = 0; i < bindings.Count; i++)
                {
                    var binding = bindings[i];
                    if (binding.BindingType != MemberBindingType.Assignment)
                    {
                        throw new ApplicationException();
                    }
                    var assign = binding as MemberAssignment;

                    var member = binding.Member;
                    if (member.MemberType != System.Reflection.MemberTypes.Property)
                    {
                        throw new ApplicationException();
                    }
                    var property = (PropertyInfo)member;
                    BindColumn(property.Name, "c" + i, environment.CreateDbTypeFromType(property.PropertyType), 0, new ElementCode(assign.Expression, allColumns));
                }
            }
            else
            {
                throw new ApplicationException();
            }
        }
Exemple #11
0
 /// <summary>
 /// コンストラクタ、親ノードと式を指定して初期化する
 /// </summary>
 /// <param name="parent">親ノード</param>
 /// <param name="expression">式</param>
 public Where(IQueryNode parent, Expression <Func <bool> > expression)
 {
     this.Parent     = parent;
     this.Expression = new ElementCode(expression, this.Owner.AllColumns);
 }
Exemple #12
0
        public static void Initialize()
        {
            // ロールとデータベースを作成する
            using (var con = E.CreateConnection("User ID=sa;Password='******';Host=localhost;Port=5432;Database=postgres;")) {
                con.Open();

                try {
                    E.CreateRole(con, RoleName, "Passw0rd!");
                } catch (DbCodeEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateObject)
                    {
                        throw;
                    }
                }
                try {
                    E.CreateDatabase(con, DbName, RoleName);
                } catch (DbCodeEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateDatabase)
                    {
                        throw;
                    }
                }
            }

            // データベース内のテーブル等を最新の仕様に合わせて変更する
            using (var con = CreateConnection()) {
                con.Open();
                var cmd = con.CreateCommand();
                cmd.CommandTimeout = 0;

                // データベースの状態を取得
                var current = E.ReadDatabaseDef(con);
                // クラスからデータベース定義を生成する
                var target = E.GenerateDatabaseDef(typeof(Db), DbName);
                // 差分を生成
                var delta = E.GetDatabaseDelta(current, target);

                // 差分を適用する
                var context = new ElementCode();
                E.ApplyDatabaseDelta(context, delta);
                context.Build().Execute(cmd);

                // URL登録ストアドを登録
                cmd.CommandText = $@"
DROP FUNCTION IF EXISTS {SpAddUrl}(TEXT);
CREATE OR REPLACE FUNCTION {SpAddUrl}(url_to_add TEXT)
RETURNS INT AS $$
	DECLARE
		id INT := 0;
	BEGIN
		SELECT {Db.Url.ColumnName(nameof(Db.Url._.UrlID))} INTO id FROM {Db.Url.Name} WHERE {Db.Url.ColumnName(nameof(Db.Url._.Url))}=url_to_add;
		IF id <> 0 THEN
			RETURN id;
		ELSE
			INSERT INTO {Db.Url.Name}({Db.Url.ColumnName(nameof(Db.Url._.Url))}) VALUES (url_to_add);
			RETURN lastval();
		END IF;
	END;
$$ LANGUAGE plpgsql;
";
                cmd.ExecuteNonQuery();

                // キーワード登録ストアドを登録
                cmd.CommandText = $@"
DROP FUNCTION IF EXISTS {SpAddKeyword}(TEXT);
CREATE OR REPLACE FUNCTION {SpAddKeyword}(keyword_to_add TEXT)
RETURNS INT AS $$
	DECLARE
		id INT := 0;
	BEGIN
		SELECT {Db.Keyword.ColumnName(nameof(Db.Keyword._.KeywordID))} INTO id FROM {Db.Keyword.Name} WHERE {Db.Keyword.ColumnName(nameof(Db.Keyword._.Keyword))}=keyword_to_add;
		IF id <> 0 THEN
			RETURN id;
		ELSE
			INSERT INTO {Db.Keyword.Name}({Db.Keyword.ColumnName(nameof(Db.Keyword._.Keyword))}) VALUES (keyword_to_add);
			RETURN lastval();
		END IF;
	END;
$$ LANGUAGE plpgsql;
";
                cmd.ExecuteNonQuery();

                // リンク登録ストアドを登録
                cmd.CommandText = $@"
DROP FUNCTION IF EXISTS {SpAddLink}(INT, INT, TEXT);
CREATE OR REPLACE FUNCTION {SpAddLink}(src_url_id_to_add INT, dst_url_id_to_add INT, link_text_to_add TEXT)
RETURNS INT AS $$
	DECLARE
		id INT := 0;
	BEGIN
		SELECT {Db.Link.ColumnName(nameof(Db.Link._.LinkID))} INTO id FROM {Db.Link.Name} WHERE {Db.Link.ColumnName(nameof(Db.Link._.SrcUrlID))}=src_url_id_to_add AND {Db.Link.ColumnName(nameof(Db.Link._.DstUrlID))}=dst_url_id_to_add;
		IF id <> 0 THEN
			RETURN id;
		ELSE
			INSERT INTO {Db.Link.Name}({Db.Link.ColumnName(nameof(Db.Link._.SrcUrlID))}, {Db.Link.ColumnName(nameof(Db.Link._.DstUrlID))}, {Db.Link.ColumnName(nameof(Db.Link._.LinkText))}) VALUES (src_url_id_to_add, dst_url_id_to_add, link_text_to_add);
			RETURN lastval();
		END IF;
	END;
$$ LANGUAGE plpgsql;
";
                cmd.ExecuteNonQuery();
            }
        }
Exemple #13
0
 public Column BindColumn(string propertyName, string name, IDbType dbType, ColumnFlags flags = 0, ElementCode source = null)
 {
     return(null);
 }
Exemple #14
0
        public Element2D(ElementCode elementcode, Material material, params Node[] nodes)
        {
            this.elementcode = elementcode;
            this.material = material;
            ElementParameter ElePara = ElementList.Serendipity.Find(l => l.ELEMENTCODE == elementcode);

            if ((ElePara.DIM == 2) & (ElePara.NODENUM == nodes.Length))
            {
                for (int i = 0; i < ElePara.NODENUM; ++i)
                {
                    Nodes.Add(nodes[i]);
                }
                for (int i = 0; i < ElePara.NODENUM; ++i)
                {
                    Edges.Add(new Edge(nodes[i].ID, nodes[(i + 1) % ElePara.NODENUM].ID));
                }
            }
            else
            {
                throw new FormatException();
            }
        }
Exemple #15
0
        /// <summary>
        /// プロパティに列定義をバインドして取得する、バインド済みなら取得のみ行われる
        /// </summary>
        /// <param name="propertyName">プロパティ名</param>
        /// <param name="name">DB上での列名</param>
        /// <param name="dbType">DB上での型</param>
        /// <param name="flags">列に対するオプションフラグ</param>
        /// <param name="source">列を生成する基となった式</param>
        /// <returns>列定義</returns>
        public Column BindColumn(string propertyName, string name, IDbType dbType, ColumnFlags flags = 0, ElementCode source = null)
        {
            var column = this.ColumnMap.TryGetByPropertyName(propertyName);

            if (column == null)
            {
                this.ColumnMap.Add(column = new Column(this.Owner.Environment, this.Columns, typeof(TColumns).GetProperty(propertyName), this, name, dbType, flags, source));
            }
            return(column);
        }
Exemple #16
0
 public ElementParameter(ElementCode elementcode, int dim, int nodenum, int edgenum, int surfacenum, int d, int k)
 {
     ELEMENTCODE = elementcode;
     DIM = dim;
     NODENUM = nodenum;
     EDGENUM = edgenum;
     SURFACENUM = surfacenum;
     DMAT = new int[2] { d, d };
     BMAT = new int[2] { d, k };
     KMAT = new int[2] { k, k };
 }
Exemple #17
0
 /// <summary>
 /// SQL文を生成する
 /// </summary>
 /// <param name="context">生成先のコンテキスト</param>
 public void ToElementCode(ElementCode context)
 {
     context.Add(SqlKeyword.DropTable, SqlKeyword.IfExists);
     context.Concat(this.Table.Name);
 }
Exemple #18
0
 /// <summary>
 /// コンストラクタ、親ノードとコードを指定して初期化する
 /// </summary>
 /// <param name="parent">親ノード</param>
 /// <param name="code">コード</param>
 public CodeNode(IQueryNode parent, ElementCode code)
 {
     this.Parent = parent;
     this.Code   = code;
 }
Exemple #19
0
        public override void ApplyDatabaseDelta(ElementCode context, IDatabaseDelta databaseDelta)
        {
            // 列の型など付与するデリゲート
            Action <IColumnDef> columnOption = (column) => {
                context.Concat(column.DbType.ToDbTypeString((column.Flags & ColumnFlags.Serial) != 0 ? DbTypeStringFlags.Serial : 0));
                if ((column.Flags & ColumnFlags.Nullable) != 0)
                {
                    context.Add(SqlKeyword.Null);
                }
                else
                {
                    context.Add(SqlKeyword.NotNull);
                }
                if ((column.Flags & ColumnFlags.DefaultCurrentTimestamp) != 0)
                {
                    context.Add(SqlKeyword.Default, SqlKeyword.CurrentTimestamp);
                }
            };

            // 捨てるべきテーブルを捨てる
            foreach (var table in databaseDelta.TablesToDrop)
            {
                context.Add(SqlKeyword.DropTable, SqlKeyword.IfExists);
                context.Concat(table.Name);
                context.Go();
            }

            // 新たに増えるテーブルを作成する
            foreach (var table in databaseDelta.TablesToAdd)
            {
                var tableName = table.Name;

                // テーブル本体
                context.Add(SqlKeyword.CreateTable, SqlKeyword.IfNotExists);
                context.Concat(tableName);
                context.AddColumnDefs(table.ColumnDefs, null, columnOption);
                context.Go();

                // プライマリキー
                Add(context, tableName, table.GetPrimaryKey());

                // インデックス
                foreach (var index in table.GetIndices())
                {
                    Add(context, tableName, index);
                }

                // ユニークキー
                foreach (var unique in table.GetUniques())
                {
                    Add(context, tableName, unique);
                }
            }

            // 変化するテーブルに対応する
            foreach (var table in databaseDelta.TablesToModify)
            {
                var tableName = table.Name;

                // 先にプライマリキー等の制約を捨てる
                Drop(context, tableName, table.PrimaryKeyToDrop);
                foreach (var index in table.IndicesToDrop)
                {
                    Drop(context, tableName, index);
                }
                foreach (var unique in table.UniquesToDrop)
                {
                    Drop(context, tableName, unique);
                }

                // 列を捨てる
                foreach (var column in table.ColumnsToDrop)
                {
                    Drop(context, tableName, column);
                }

                // 列を追加する
                foreach (var column in table.ColumnsToAdd)
                {
                    Add(context, tableName, column, columnOption);
                }

                // プライマリキー追加
                Add(context, tableName, table.PrimaryKeyToAdd);

                // インデックス追加
                foreach (var index in table.IndicesToAdd)
                {
                    Add(context, tableName, index);
                }

                // ユニークキー追加
                foreach (var unique in table.UniquesToAdd)
                {
                    Add(context, tableName, unique);
                }
            }
        }
Exemple #20
0
        static void Main(string[] args)
        {
            var E = TestDb.E;

            using (var con = E.CreateConnection("User ID=postgres;Password=wertyu89?;Host=localhost;Port=5432;Database=postgres;")) {
                con.Open();

                try {
                    E.CreateRole(con, RoleName, "Passw0rd!");
                } catch (CodeDbEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateObject)
                    {
                        throw;
                    }
                }
                try {
                    E.CreateDatabase(con, DbName, RoleName);
                } catch (CodeDbEnvironmentException ex) {
                    if (ex.ErrorType != DbEnvironmentErrorType.DuplicateDatabase)
                    {
                        throw;
                    }
                }
            }

            using (var con = E.CreateConnection($"User ID={RoleName};Password='******';Host=localhost;Port=5432;Database={DbName};")) {
                con.Open();
                var cmd = con.CreateCommand();
                cmd.CommandTimeout = 0;

                {
                    var s = TestDb.E.NewSql();
                    s.DropTable(TestDb.User);
                    s.Build().Execute(cmd);
                }

                // データベースの状態を取得
                var current = E.ReadDatabaseDef(con);
                // クラスからデータベース定義を生成する
                var target = E.GenerateDatabaseDef(typeof(TestDb), "test_db");
                // 差分を生成
                var delta = E.GetDatabaseDelta(current, target);

                // 差分を適用する
                var context = new ElementCode();
                E.ApplyDatabaseDelta(context, delta);
                context.Build().Execute(cmd);

                {
                    var sql = TestDb.E.NewSql();
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "a" });
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "b" });
                    sql.InsertIntoWithValue(TestDb.User, t => new[] { t.UserName == "c" });
                    sql.BuildAction().Execute(cmd);
                }
                {
                    var sql    = TestDb.E.NewSql();
                    var select = sql.From(TestDb.User).Where(t => t.UserName == "a").Select(t => new { t.UserName, t.UserID, t.CreateDateTime });
                    var f      = sql.BuildSelectFunc(select);
                    using (var reader = f.Execute(cmd)) {
                        foreach (var record in reader.Records)
                        {
                            Console.WriteLine($"{record.UserID} {record.UserName} {record.CreateDateTime}");
                        }
                    }
                }

                {
                    var code = new ElementCode();
                    var arg1 = new Argument(0);
                    var arg2 = new Argument(0);
                    code.Concat("SELECT ARRAY[1, 2, 3], '{8EA22A18-EB0A-49E5-B61D-F026CA7773FF}'::uuid, now(),");
                    code.Add(arg1);
                    code.Go();
                    code.Concat("SELECT ARRAY[1, 2, 3], '{8EA22A18-EB0A-49E5-B61D-F026CA7773FF}'::uuid, now(),");
                    code.Add(arg2);
                    code.Go();
                    var s = TestDb.E.NewSql();
                    s.Code(code);
                    var commandable = s.BuildFunc <int, int, Tuple <int[], Guid, DateTime, int> >(arg1, arg2);
                    using (var reader = commandable.Execute(cmd, 16, 32)) {
                        do
                        {
                            foreach (var record in reader.Records)
                            {
                                Console.WriteLine(record);
                            }
                        } while (reader.DataReader.NextResult());
                    }
                }
            }
        }
Exemple #21
0
 public ElementCodeExpressionVisitor(ElementCode code, ColumnMap columnMap = null)
 {
     _Code      = code;
     _ColumnMap = columnMap;
 }
Exemple #22
0
 public void Where(ElementCode expression)
 {
     this.WhereNode = new Where(this, expression);
 }
Exemple #23
0
 /// <summary>
 /// WHERE句の式を登録する
 /// </summary>
 /// <param name="expression">式</param>
 /// <returns>自分</returns>
 public From <TColumns> Where(ElementCode expression)
 {
     this.WhereNode = new Where(this, expression);
     return(this);
 }