public override void FillTableSchema(DataTable table, string selectCommand, CommandParameterCollection parameters)
        {
            ClickHouseConnection clickHouseConnection = GetConnection() as ClickHouseConnection;

            try
            {
                OpenConnection(clickHouseConnection);

                selectCommand = PrepareSelectCommand(selectCommand, table.TableName, clickHouseConnection);

                /*To reduce size of traffic and size of answer from ClickHouse server.
                 * Because FillSchema doesn't work in this ADO.NET library.
                 * LIMIT 0 gets an empy set, but we still have list of desired columns
                 * Prorably can be a better way.
                 */
                selectCommand += " LIMIT 0";
                ClickHouseCommand clickHouseCommand = clickHouseConnection.CreateCommand();

                foreach (CommandParameter p in parameters)
                {
                    selectCommand = selectCommand.Replace($"@{p.Name}", $"{{{p.Name}:{(ClickHouseTypeCode)p.DataType}}}");
                    clickHouseCommand.AddParameter(p.Name, ((ClickHouseTypeCode)p.DataType).ToString(), p.Value);
                }
                clickHouseCommand.CommandText = selectCommand;
                using (ClickHouseDataReader reader = clickHouseCommand.ExecuteReader() as ClickHouseDataReader)
                {
                    var clms = GetColumns(reader);
                    table.Columns.AddRange(clms.ToArray());
                }
            }
            finally
            {
                DisposeConnection(clickHouseConnection);
            }
        }
        private IEnumerable <DataColumn> GetColumns(ClickHouseDataReader reader)
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                var columnType = reader.GetFieldType(i);

                yield return(new DataColumn(reader.GetName(i), columnType));
            }
        }
        internal static ClickHouseType[] GetClickHouseColumnTypes(this ClickHouseDataReader reader)
        {
            var count = reader.FieldCount;
            var names = new ClickHouseType[count];

            for (int i = 0; i < count; i++)
            {
                names[i] = reader.GetClickHouseType(i);
            }

            return(names);
        }
Exemplo n.º 4
0
        public static DataTable DescribeSchema(this ClickHouseDataReader reader)
        {
            var result = new DataTable();

            foreach (var columnName in Columns)
            {
                result.Columns.Add(columnName);
            }
            for (int i = 0; i < reader.FieldCount; i++)
            {
                result.Rows.Add(reader.DescribeColumn(i));
            }

            return(result);
        }
Exemplo n.º 5
0
        private static List <T> Scan <T>(IDbCommand cmd, Func <ClickHouseDataReader, T> read)
        {
            List <T> result = new List <T>();

            using ClickHouseDataReader reader = (ClickHouseDataReader)cmd.ExecuteReader();

            do
            {
                while (reader.Read())
                {
                    result.Add(read.Invoke(reader));
                }
            } while (reader.NextResult());

            return(result);
        }
Exemplo n.º 6
0
        private static object[] DescribeColumn(this ClickHouseDataReader reader, int ordinal)
        {
            var chType = reader.GetClickHouseType(ordinal);

            var result = new object[Columns.Length];

            result[0]  = reader.GetName(ordinal);                        // ColumnName
            result[1]  = ordinal;                                        // ColumnOrdinal
            result[2]  = null;                                           // ColumnSize
            result[3]  = null;                                           // NumericPrecision
            result[4]  = null;                                           // NumericScale
            result[5]  = chType.FrameworkType;                           // DataType
            result[6]  = chType.ToString();                              // ProviderType
            result[7]  = chType.TypeCode == ClickHouseTypeCode.String;   // IsLong
            result[8]  = chType.TypeCode == ClickHouseTypeCode.Nullable; // AllowDBNull
            result[9]  = true;                                           // IsReadOnly
            result[10] = false;                                          // IsRowVersion
            result[11] = false;                                          // IsUnique
            result[12] = false;                                          // IsKey
            result[13] = false;                                          // IsAutoIncrement
            result[14] = null;                                           // BaseCatalogName
            result[15] = null;                                           // BaseSchemaName
            result[16] = null;                                           // BaseTableName
            result[17] = reader.GetName(ordinal);                        // BaseColumnName
            result[18] = null;                                           // AutoIncrementSeed
            result[19] = null;                                           // AutoIncrementStep
            result[20] = null;                                           // DefaultValue
            result[21] = null;                                           // Expression
            result[22] = MappingType.Element;                            // ColumnMapping
            result[23] = null;                                           // BaseTableNamespace
            result[24] = null;                                           // BaseColumnNamespace

            if (chType is DecimalType dt)
            {
                result[2] = dt.Size;
                result[3] = dt.Precision;
                result[4] = dt.Scale;
            }

            return(result);
        }