Beispiel #1
0
 public Object GetParameterValue(SQLInputParameterContext inputParameterContext)
 {
     _paramContexts.Add(inputParameterContext);
     if (inputParameterContext.ParameterValue is String)
     {
         return(int.Parse(inputParameterContext.ParameterValue.ToString().Substring(1)));
     }
     return(inputParameterContext.ParameterValue);
 }
Beispiel #2
0
        public void TestInputParameterConversion()
        {
            _epService.EPAdministrator.Configuration.AddVariable("myvariable", typeof(Object), "x10");

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

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

            _epService.EPRuntime.SetVariableValue("myvariable", "x60");    // greater 50 turns true
            EPAssertionUtil.AssertPropsPerRowAnyOrder(stmt.GetEnumerator(), fields, new Object[][] { new Object[] { true } });

            SQLInputParameterContext param = SupportSQLColumnTypeConversion.ParamContexts[0];

            Assert.AreEqual(1, param.ParameterNumber);
            Assert.AreEqual("x60", param.ParameterValue);
        }
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);
                }
            }
        }