Beispiel #1
0
        public void TestOutputColumnConversion()
        {
            _epService.EPAdministrator.Configuration.AddVariable("myvariable", typeof(int), 10);

            var fields   = new String[] { "myint" };
            var stmtText = "@Hook(Type=HookType.SQLCOL, Hook='" + typeof(SupportSQLColumnTypeConversion).FullName + "')" +
                           "select * from sql:MyDB ['select myint from mytesttable where myint = ${myvariable}']";
            var stmt = _epService.EPAdministrator.CreateEPL(stmtText);

            _listener    = new SupportUpdateListener();
            stmt.Events += _listener.Update;

            Assert.AreEqual(typeof(bool?), stmt.EventType.GetPropertyType("myint"));
            EPAssertionUtil.AssertPropsPerRowAnyOrder(stmt.GetEnumerator(), fields, new Object[][] { new Object[] { false } });

            // assert contexts
            var type = SupportSQLColumnTypeConversion.TypeContexts[0];

            Assert.AreEqual("Integer", type.ColumnSqlType);
            Assert.AreEqual("MyDB", type.Db);
            Assert.AreEqual("select myint from mytesttable where myint = ${myvariable}", type.Sql);
            Assert.AreEqual("myint", type.ColumnName);
            Assert.AreEqual(1, type.ColumnNumber);
            Assert.AreEqual(typeof(int?), type.ColumnClassType);

            SQLColumnValueContext val = SupportSQLColumnTypeConversion.ValueContexts[0];

            Assert.AreEqual(10, val.ColumnValue);
            Assert.AreEqual("myint", val.ColumnName);
            Assert.AreEqual(1, val.ColumnNumber);

            _epService.EPRuntime.SetVariableValue("myvariable", 60);    // greater 50 turns true
            EPAssertionUtil.AssertPropsPerRowAnyOrder(stmt.GetEnumerator(), fields, new Object[][] { new Object[] { true } });
        }
        //@Hook(type=HookType.SQLCOL, hook="this is a sample and not used")
        private void RunAssertionOutputColumnConversion(EPServiceProvider epService)
        {
            SupportSQLColumnTypeConversion.Reset();
            epService.EPAdministrator.Configuration.AddVariable("myvariableOCC", typeof(int), 10);

            var    fields   = new string[] { "myint" };
            string stmtText = "@Hook(Type=HookType.SQLCOL, Hook='" + typeof(SupportSQLColumnTypeConversion).FullName + "')" +
                              "select * from sql:MyDB ['select myint from mytesttable where myint = ${myvariableOCC}']";
            EPStatement stmt     = epService.EPAdministrator.CreateEPL(stmtText);
            var         listener = new SupportUpdateListener();

            stmt.Events += listener.Update;

            Assert.AreEqual(typeof(bool?), stmt.EventType.GetPropertyType("myint"));
            EPAssertionUtil.AssertPropsPerRowAnyOrder(stmt.GetEnumerator(), fields, new object[][] { new object[] { false } });

            // assert contexts
            SQLColumnTypeContext type = SupportSQLColumnTypeConversion.TypeContexts[0];

            Assert.AreEqual("System.Int32", type.ColumnSqlType);
            Assert.AreEqual("MyDB", type.Db);
            Assert.AreEqual("select myint from mytesttable where myint = ${myvariableOCC}", type.Sql);
            Assert.AreEqual("myint", type.ColumnName);
            Assert.AreEqual(1, type.ColumnNumber);
            Assert.AreEqual(typeof(int?), type.ColumnClassType);

            SQLColumnValueContext val = SupportSQLColumnTypeConversion.ValueContexts[0];

            Assert.AreEqual(10, val.ColumnValue);
            Assert.AreEqual("myint", val.ColumnName);
            Assert.AreEqual(1, val.ColumnNumber);

            epService.EPRuntime.SetVariableValue("myvariableOCC", 60);    // greater 50 turns true
            EPAssertionUtil.AssertPropsPerRowAnyOrder(stmt.GetEnumerator(), fields, new object[][] { new object[] { true } });

            stmt.Dispose();
        }
Beispiel #3
0
        private IList<EventBean> Execute(
            DbDriverCommand driverCommand,
            object lookupValuePerStream)
        {
            var hasLogging = _factory.IsEnableLogging && ADO_PERF_LOG.IsInfoEnabled;

            using (var myDriverCommand = driverCommand.Clone()) {
                var dbCommand = myDriverCommand.Command;

                if (ExecutionPathDebugLog.IsDebugEnabled && Log.IsInfoEnabled) {
                    Log.Info(".execute Executing prepared statement '{0}'", dbCommand.CommandText);
                }

                DbParameter dbParam;

                // set parameters
                SQLInputParameterContext inputParameterContext = null;
                if (_columnTypeConversionHook != null) {
                    inputParameterContext = new SQLInputParameterContext();
                }

                var mk = _factory.InputParameters.Length == 1 ? null : (HashableMultiKey) lookupValuePerStream;
                for (var i = 0; i < _factory.InputParameters.Length; i++) {
                    try {
                        object parameter;
                        if (mk == null) {
                            parameter = lookupValuePerStream;
                        }
                        else {
                            parameter = mk.Keys[i];
                        }

                        if (ExecutionPathDebugLog.IsDebugEnabled && Log.IsInfoEnabled) {
                            Log.Info(
                                ".Execute Setting parameter " +
                                " to " +
                                parameter +
                                " typed " +
                                ((parameter == null) ? "null" : parameter.GetType().Name));
                        }

                        if (_columnTypeConversionHook != null) {
                            inputParameterContext.ParameterNumber = i + 1;
                            inputParameterContext.ParameterValue = parameter;
                            parameter = _columnTypeConversionHook.GetParameterValue(inputParameterContext);
                        }

                        dbParam = dbCommand.Parameters[i];
                        dbParam.Value = parameter ?? DBNull.Value;
                    }
                    catch (DbException ex) {
                        throw new EPException("Error setting parameter " + i, ex);
                    }
                }

                // execute
                try {
                    // generate events for result set
                    IList<EventBean> rows = new List<EventBean>();

                    using (var dataReader = dbCommand.ExecuteReader()) {
                        try {
                            SQLColumnValueContext valueContext = null;
                            if (_columnTypeConversionHook != null) {
                                valueContext = new SQLColumnValueContext();
                            }

                            SQLOutputRowValueContext rowContext = null;
                            if (_outputRowConversionHook != null) {
                                rowContext = new SQLOutputRowValueContext();
                            }

                            var rowNum = 0;

                            if (dataReader.HasRows) {
                                // Determine how many fields we will be receiving
                                var fieldCount = dataReader.FieldCount;
                                // Allocate a buffer to hold the results of the row
                                var rawData = new object[fieldCount];
                                // Convert the names of columns into ordinal indices and prepare
                                // them so that we only have to incur this cost when we first notice
                                // the reader has rows.
                                if (_dbInfoList == null) {
                                    _dbInfoList = new List<DbInfo>();
                                    foreach (var entry in _outputTypes) {
                                        var dbInfo = new DbInfo();
                                        dbInfo.Name = entry.Key;
                                        dbInfo.Ordinal = dataReader.GetOrdinal(dbInfo.Name);
                                        dbInfo.OutputTypeDesc = entry.Value;
                                        dbInfo.Binding = entry.Value.OptionalBinding;
                                        _dbInfoList.Add(dbInfo);
                                    }
                                }

                                var fieldNames = new string[fieldCount];
                                for (var ii = 0; ii < fieldCount; ii++) {
                                    fieldNames[ii] = dataReader.GetName(ii);
                                }

                                // Anyone know if the ordinal will always be the same every time
                                // the query is executed; if so, we could certainly cache this
                                // dbInfoList so that we only have to do that once for the lifetime
                                // of the statement.
                                while (dataReader.Read()) {
                                    var colNum = 1;

                                    DataMap row = new Dictionary<string, object>();
                                    // Get all of the values for the row in one shot
                                    dataReader.GetValues(rawData);
                                    // Convert the items into raw row objects
                                    foreach (var dbInfo in _dbInfoList) {
                                        var value = rawData[dbInfo.Ordinal];
                                        if (value == DBNull.Value) {
                                            value = null;
                                        }
                                        else if (dbInfo.Binding != null) {
                                            value = dbInfo.Binding.GetValue(value, dbInfo.Name);
                                        }
                                        else if (value.GetType() != dbInfo.OutputTypeDesc.DataType) {
                                            value = Convert.ChangeType(value, dbInfo.OutputTypeDesc.DataType);
                                        }

                                        if (_columnTypeConversionHook != null) {
                                            valueContext.ColumnName = fieldNames[colNum - 1];
                                            valueContext.ColumnNumber = colNum;
                                            valueContext.ColumnValue = value;

                                            value = _columnTypeConversionHook.GetColumnValue(valueContext);
                                        }

                                        row[dbInfo.Name] = value;

                                        colNum++;
                                    }

                                    EventBean eventBeanRow = null;
                                    if (_outputRowConversionHook == null) {
                                        eventBeanRow = _agentInstanceContext.EventBeanTypedEventFactory
                                            .AdapterForTypedMap(
                                                row,
                                                _factory.EventType);
                                    }
                                    else {
                                        rowContext.Values = row;
                                        rowContext.RowNum = rowNum;
                                        var rowData = _outputRowConversionHook.GetOutputRow(rowContext);
                                        if (rowData != null) {
                                            eventBeanRow = _agentInstanceContext.EventBeanTypedEventFactory
                                                .AdapterForTypedObject(
                                                    rowData,
                                                    (BeanEventType) _factory.EventType);
                                        }
                                    }

                                    if (eventBeanRow != null) {
                                        rows.Add(eventBeanRow);
                                        rowNum++;
                                    }
                                }
                            }
                        }
                        catch (DbException ex) {
                            throw new EPException(
                                "Error reading results for statement '" + _factory.PreparedStatementText + "'",
                                ex);
                        }
                    }

                    return rows;
                }
                catch (DbException ex) {
                    throw new EPException("Error executing statement '" + _factory.PreparedStatementText + "'", ex);
                }
            }
        }
Beispiel #4
0
 public Object GetColumnValue(SQLColumnValueContext valueContext)
 {
     valueContexts.Add(valueContext);
     return(((int?)valueContext.ColumnValue) >= 50);
 }
 public object GetColumnValue(SQLColumnValueContext valueContext)
 {
     ValueContexts.Add(valueContext);
     return (int?) valueContext.ColumnValue >= 50;
 }