public static void Compare(SqlTableDefinition definition, ExpectedTable expectedTable)
        {
            Assert.Equal(expectedTable.Name, definition.TableName);
            Assert.Equal(expectedTable.Columns.Count, definition.Columns.Count);

            if (expectedTable.Columns.All(s => !s.IsRowId))
            {
                Assert.Null(definition.RowIdColumn);
            }

            for (int i = 0; i < expectedTable.Columns.Count; i++)
            {
                SqlTableColumn actual   = definition.Columns.ElementAt(i);
                ExpectedColumn expected = expectedTable.Columns[i];

                Assert.Equal(expected.ClrType, actual.DetectedType);
                Assert.Equal(expected.Name, actual.Name);
                Assert.Equal(expected.SqlType, actual.TypeName);
                Assert.Equal(expected.IsPrimaryKey, actual.IsPartOfPrimaryKey);

                if (expected.IsRowId)
                {
                    Assert.Same(actual, definition.RowIdColumn);
                }
            }
        }
Beispiel #2
0
        private static int RunDescribe(DescribeCommand opts)
        {
            if (!TryReadFile(opts.DatabaseFile, out Stream stream, out Sqlite3Database db,
                             out List <Sqlite3SchemaRow> tables))
            {
                return(1);
            }

            Console.WriteLine($"Database: pagesize {db.Header.PageSize:N0}B, encoding {db.Header.TextEncoding}");
            Console.WriteLine($"          size {db.Header.DatabaseSizeInPages:N0} pages/{db.Header.DatabaseSizeInPages * db.Header.PageSize:N0}B - actual size: {stream.Length:N0}B");
            Console.WriteLine();

            foreach (Sqlite3SchemaRow row in tables)
            {
                if (row.Type != "table")
                {
                    continue;
                }

                Console.WriteLine($"{row.Type} {row.Name}");
                Console.WriteLine($"  Schema: {InlineSql(row.Sql)}");
                Console.WriteLine($"  Root Page: {row.RootPage}");

                try
                {
                    SqlTableDefinition definition = row.GetTableDefinition();

                    Console.WriteLine($"  Columns ({definition.Columns.Count})");
                    foreach (SqlTableColumn column in definition.Columns)
                    {
                        Console.WriteLine($"    {column.Name} ({column.TypeName}) => {column.DetectedType.Name}");
                    }
                }
                catch (Exception)
                {
                    Console.WriteLine("  Error: Unable to parse SQL");
                }

                List <Sqlite3SchemaRow> indexes = tables.Where(s => s.Type == "index" && s.TableName == row.TableName).ToList();

                Console.WriteLine($"  Indexes ({indexes.Count})");
                foreach (Sqlite3SchemaRow index in indexes)
                {
                    Console.WriteLine($"    {index.Name}");
                    Console.WriteLine($"      Schema: {InlineSql(index.Sql)}");
                }

                if (!opts.DoSizeStatistics)
                {
                    Console.WriteLine("Unable to do statistics");
                }

                Console.WriteLine();
            }

            return(0);
        }
Beispiel #3
0
        private void AddConstraints(SqlTableDefinition createTableDefinition)
        {
            foreach (var constraint in createTableDefinition.Constraints)
            {
                switch (constraint.Type)
                {
                case SqlConstraintType.PrimaryKey: AddPrimaryConstraint(constraint); break;

                case SqlConstraintType.ForeignKey: AddForeignKeyConstraint((SqlForeignKeyConstraint)constraint); break;
                }
            }
        }
        public static void AppendActual(StreamWriter sw, string sql, SqlTableDefinition definition)
        {
            sw.WriteLine(sql);
            sw.WriteLine("\t" + definition.TableName);



            foreach (var sqlTableColumn in definition.Columns)
            {
                sw.Write("\t");
                sw.Write(sqlTableColumn.Name);
                sw.Write("\t");
                switch (sqlTableColumn.DetectedType.Name)
                {
                case "Int64":
                    sw.Write("INTEGER");
                    break;

                case "Byte[]":
                    sw.Write("BYTES");
                    break;

                case "String":
                    sw.Write("STRING");
                    break;

                case "Double":
                    sw.Write("DOUBLE");
                    break;

                default:
                    throw new Exception();
                }

                sw.Write("\t");
                sw.Write(sqlTableColumn.TypeName);
                sw.Write("\t");
                if (sqlTableColumn.IsPartOfPrimaryKey)
                {
                    sw.Write("PRIMARY");
                }

                if (definition.RowIdColumn.Name == sqlTableColumn.Name)
                {
                    sw.Write(" ROWID");
                }

                sw.WriteLine();
            }

            sw.WriteLine();
        }
Beispiel #5
0
 private void AddColumns(SqlTableDefinition tableDefinition, MemoryDatabase database)
 {
     foreach (var columnDefinition in tableDefinition.ColumnDefinitions)
     {
         Column column;
         if (columnDefinition is SqlComputedColumnDefinition computedColumn)
         {
             var expression = computedColumn.Expression as SqlBuiltinScalarFunctionCallExpression;
             var dataType   = GuessDataType(expression, null, database);
             column = new Column(_Table, columnDefinition.Name.Value, _Table.Columns.Count, expression, dataType);
         }
         else
         {
             column = new Column(_Table, columnDefinition.Name.Value, columnDefinition.DataType, database.UserDataTypes, _Table.Columns.Count);
         }
         AddColumnConstrains(columnDefinition, column);
         _Table.Columns.Add(column);
     }
 }
Beispiel #6
0
        public void ReadCreateStatementsFromDbTests(string dbFile, SqlTestData data)
        {
            Assembly assembly = typeof(SqlCreateStatements).Assembly;

            using (MemoryStream ms = new MemoryStream())
            {
                using (Stream fs = assembly.GetManifestResourceStream(dbFile))
                    using (GZipStream gz = new GZipStream(fs, CompressionMode.Decompress))
                    {
                        gz.CopyTo(ms);
                        ms.Seek(0, SeekOrigin.Begin);
                    }

                // Ensure that the DB matches the expectations
                using (Sqlite3Database db = new Sqlite3Database(ms))
                {
                    List <Sqlite3SchemaRow> dbTables = db.GetTables().Where(s => !s.TableName.StartsWith("sqlite_", StringComparison.Ordinal)).Where(s => s.Type == "table").ToList();

                    Assert.Equal(data.Statements.Count, dbTables.Count);

                    List <string> dbTableNames        = dbTables.Select(s => s.TableName).ToList();
                    List <string> expectedTabledNames = data.Statements.Select(s => s.Name).ToList();

                    Assert.All(dbTableNames, x => Assert.Contains(x, expectedTabledNames));
                    Assert.All(expectedTabledNames, x => Assert.Contains(x, dbTableNames));

                    Assert.All(dbTables, tbl =>
                    {
                        SqlTestData.ExpectedTable expected = data.Statements.First(s => s.Name == tbl.TableName);
                        SqlTableDefinition definition      = tbl.GetTableDefinition();

                        SqlTestData.Compare(definition, expected);
                    });
                }
            }
        }
Beispiel #7
0
 public override void Visit(SqlTableDefinition codeObject)
 {
 }
 public SqlColumnDefinition(SqlTableDefinition owner, string name, SqlColumnType type)
 {
     Owner = owner;
     Name  = name;
     Type  = type;
 }
Beispiel #9
0
 public DbTableQuery(DbSchema schema, SqlTableDefinition def) : base(schema, null, def.ReflectedType, def.Columns)
 {
     _query = new SqlQuerySelect(this);
 }