private static ResultSet GetTableResults(IDbConnection connection, TableInfo table)
        {
            // We could probably refactor QueryRunner to expose this functionality
            // to us without having to recreate it here.
            var command = connection.CreateCommand();
            command.CommandText = String.Format("SELECT * FROM {0} ORDER BY Id ASC", table.Name);
            var resultSet = new ResultSet();

            using (var reader = command.ExecuteReader())
            {
                for (int i = 0; i < reader.FieldCount; ++i)
                {
                    var column = new ResultColumnInfo
                    {
                        Name = reader.GetName(i)
                    };

                    ResultColumnType type;

                    if (ResultColumnInfo.ColumnTypeMap.TryGetValue(reader.GetFieldType(i), out type))
                    {
                        column.Type = type;
                    }

                    resultSet.Columns.Add(column);
                }

                while (reader.Read())
                {
                    var row = new List<object>();

                    for (int i = 0; i < reader.FieldCount; ++i)
                    {
                        object value = reader.GetValue(i);

                        if (value is DateTime)
                        {
                            value = ((DateTime)value).ToJavascriptTime();
                        }

                        row.Add(value);
                    }

                    resultSet.Rows.Add(row);
                }
            }

            return resultSet;
        }
예제 #2
0
        /// <summary>
        /// Get the sites schema
        /// </summary>
        /// <returns></returns>
        public List<TableInfo> GetTableInfos()
        {
            List<ColumnInfo> columns;
            var tables = new List<TableInfo>();

            using (var cnn = GetOpenConnection())
            {
                string sql =
                    @"
            select TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH from INFORMATION_SCHEMA.COLUMNS
            where TABLE_SCHEMA = 'public'
            order by TABLE_NAME, ORDINAL_POSITION
            ";
                using (var cmd = cnn.CreateCommand())
                {
                    cmd.CommandText = sql;
                    using (var reader = cmd.ExecuteReader())
                    {
                        columns = new List<ColumnInfo>();
                        while (reader.Read())
                        {
                            var info = new ColumnInfo();
                            info.TableName = reader.GetString(0);
                            info.ColumnName = reader.GetString(1);
                            info.SetDataType(reader.GetString(2), reader.IsDBNull(3) ? null : (int?) reader.GetInt32(3));
                            columns.Add(info);
                        }
                    }
                }
            }

            TableInfo tableInfo = null;

            foreach (ColumnInfo column in columns)
            {
                if (tableInfo == null || tableInfo.Name != column.TableName)
                {
                    tableInfo = new TableInfo();
                    tableInfo.Name = column.TableName;
                    tables.Add(tableInfo);
                }

                tableInfo.ColumnNames.Add(column.ColumnName);
                tableInfo.DataTypes.Add(column.DataType);
            }

            tables.Sort((l, r) =>
                            {
                                if (l.Name == "Posts") return -1;
                                if (r.Name == "Posts") return 1;
                                if (l.Name == "Users") return -1;
                                if (r.Name == "Users") return 1;
                                if (l.Name == "Comments") return -1;
                                if (r.Name == "Comments") return 1;
                                if (l.Name == "Badges") return -1;
                                if (r.Name == "Badges") return 1;
                                return l.Name.CompareTo(r.Name);
                            });

            return tables;
        }