Beispiel #1
0
        public void Close()
        {
            try
            {
                if (_currentBlock != null && !_exceptionThrown)
                {
                    _clickHouseConnection.Formatter.ReadResponse();
                }
            }
            catch (ClickHouseException)
            {
                _exceptionThrown = true;
                _clickHouseConnection.MakeBroken();
            }
            catch (IOException)
            {
                _exceptionThrown = true;
                _clickHouseConnection.MakeBroken();
            }
#if !NETCOREAPP11
            if ((_behavior & CommandBehavior.CloseConnection) != 0 || _exceptionThrown)
            {
                _clickHouseConnection.Close();
            }
#endif

            _clickHouseConnection = null;
        }
Beispiel #2
0
        private void Execute(bool readResponse, ClickHouseConnection connection)
        {
            if (connection.State != ConnectionState.Open)
            {
                throw new InvalidOperationException("Connection isn't open");
            }

            var insertParser = new Impl.ATG.Insert.Parser(new Impl.ATG.Insert.Scanner(new MemoryStream(Encoding.UTF8.GetBytes(CommandText))));

            insertParser.errors.errorStream = new StringWriter();
            insertParser.Parse();

            try
            {
                if (insertParser.errors.count == 0)
                {
                    var xText = new StringBuilder("INSERT INTO ");
                    xText.Append(insertParser.tableName);
                    if (insertParser.fieldList != null)
                    {
                        xText.Append("(");
                        insertParser.fieldList.Aggregate(xText, (builder, fld) => builder.Append(fld).Append(','));
                        xText.Remove(xText.Length - 1, 1);
                        xText.Append(")");
                    }
                    xText.Append(" VALUES");

                    connection.Formatter.RunQuery(xText.ToString(), QueryProcessingStage.Complete, null, null, null, false);
                    var schema = connection.Formatter.ReadSchema();
                    if (insertParser.oneParam != null)
                    {
                        if (Parameters[insertParser.oneParam].Value is IBulkInsertEnumerable bulkInsertEnumerable)
                        {
                            var index = 0;
                            foreach (var col in schema.Columns)
                            {
                                col.Type.ValuesFromConst(bulkInsertEnumerable.GetColumnData(index++, col.Name, col.Type.AsClickHouseType()));
                            }
                        }
                        else
                        {
                            var table    = ((IEnumerable)Parameters[insertParser.oneParam].Value).OfType <IEnumerable>();
                            var colCount = table.First().Cast <object>().Count();
                            if (colCount != schema.Columns.Count)
                            {
                                throw new FormatException($"Column count in parameter table ({colCount}) doesn't match column count in schema ({schema.Columns.Count}).");
                            }
                            var cl = new List <List <object> >(colCount);
                            for (var i = 0; i < colCount; i++)
                            {
                                cl.Add(new List <object>());
                            }
                            var index = 0;
                            cl = table.Aggregate(
                                cl,
                                (colList, row) => {
                                index = 0;
                                foreach (var cval in row)
                                {
                                    colList[index++].Add(cval);
                                }

                                return(colList);
                            }
                                );
                            index = 0;
                            foreach (var col in schema.Columns)
                            {
                                col.Type.ValuesFromConst(cl[index++]);
                            }
                        }
                    }
                    else
                    {
                        if (schema.Columns.Count != insertParser.valueList.Count())
                        {
                            throw new FormatException($"Value count mismatch. Server expected {schema.Columns.Count} and query contains {insertParser.valueList.Count()}.");
                        }

                        var valueList = insertParser.valueList as List <Parser.ValueType> ?? insertParser.valueList.ToList();
                        for (var i = 0; i < valueList.Count; i++)
                        {
                            var val = valueList[i];
                            if (val.TypeHint == Parser.ConstType.Parameter)
                            {
                                schema.Columns[i].Type.ValueFromParam(Parameters[val.StringValue]);
                            }
                            else
                            {
                                schema.Columns[i].Type.ValueFromConst(val);
                            }
                        }
                    }
                    connection.Formatter.SendBlocks(new[] { schema });
                }
                else
                {
                    connection.Formatter.RunQuery(SubstituteParameters(CommandText), QueryProcessingStage.Complete, null, null, null, false);
                }
                if (!readResponse)
                {
                    return;
                }
                connection.Formatter.ReadResponse();
            }
            catch (ClickHouseException)
            {
                connection.MakeBroken();
                throw;
            }
            catch (IOException ex)
            {
                connection.MakeBroken();
                throw new ClickHouseException("Unexpected IO Exception", ex);
            }
        }