Beispiel #1
0
        public IEnumerable <IRow> Read()
        {
            using (var cn = _factory.GetConnection()) {
                cn.Open();
                var cmd = cn.CreateCommand();

                if (string.IsNullOrEmpty(_input.Entity.Query))
                {
                    if (_input.Entity.MinVersion == null)
                    {
                        cmd.CommandText = _input.SqlSelectInput(_fields, _factory, _input.ResolveOrder);

                        if (_input.Entity.IsPageRequest())
                        {
                            var start = (_input.Entity.Page * _input.Entity.PageSize) - _input.Entity.PageSize;
                            var end   = start + _input.Entity.PageSize;
                            switch (_factory.AdoProvider)
                            {
                            case AdoProvider.SqlServer:
                                cmd.CommandText = $"WITH p AS ({cmd.CommandText}) SELECT {string.Join(",", _fields.Select(f => _factory.Enclose(f.Name)))} FROM p WHERE TflRow BETWEEN {start + 1} AND {end}";
                                break;

                            case AdoProvider.PostgreSql:
                                cmd.CommandText += $" LIMIT {_input.Entity.PageSize} OFFSET {start}";
                                break;

                            default:
                                cmd.CommandText += $" LIMIT {start},{_input.Entity.PageSize}";
                                break;
                            }
                        }

                        _input.Debug(() => cmd.CommandText);
                    }
                    else
                    {
                        cmd.CommandText = _input.SqlSelectInputWithMinVersion(_fields, _factory, _input.ResolveOrder);
                        _input.Debug(() => cmd.CommandText);

                        var parameter = cmd.CreateParameter();
                        parameter.ParameterName = "@MinVersion";
                        parameter.Direction     = ParameterDirection.Input;
                        parameter.Value         = _input.Entity.MinVersion;
                        cmd.Parameters.Add(parameter);
                    }

                    if (_input.Entity.IsPageRequest())
                    {
                        var sql = $"SELECT COUNT(*) FROM {_input.SqlInputName(_factory)} {(_factory.AdoProvider == AdoProvider.SqlServer ? "WITH (NOLOCK)" : string.Empty)} {(_input.Entity.Filter.Any() ? " WHERE " + _input.ResolveFilter(_factory) : string.Empty)}";
                        _input.Debug(() => sql);
                        _input.Entity.Hits = cn.ExecuteScalar <int>(sql);
                    }
                    _input.Entity.Query = cmd.CommandText;
                }
                else
                {
                    cmd.CommandText = _input.Entity.Query;
                }

                cmd.CommandType    = CommandType.Text;
                cmd.CommandTimeout = 0;

                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) {
                    // transform types if sqlite
                    if (_factory.AdoProvider == AdoProvider.SqLite)
                    {
                        while (reader.Read())
                        {
                            _rowCount++;
                            _input.Increment();
                            var row = _rowCreator.Create(reader, _fields);
                            _typeTransform.Transform(row);
                            yield return(row);
                        }
                    }
                    else
                    {
                        // check the first one's types
                        if (reader.Read())
                        {
                            var row = _rowCreator.Create(reader, _fields);
                            foreach (var field in _fields)
                            {
                                var expected = Constants.TypeSystem()[field.Type];
                                var actual   = row[field] == null ? expected : row[field].GetType();
                                if (expected != actual)
                                {
                                    _input.Warn($"The {field.Alias} field in {_input.Entity.Alias} expects a {expected}, but is reading a {actual}.");
                                }
                            }
                            _rowCount++;
                            _input.Increment();
                            yield return(row);
                        }

                        // just read
                        while (reader.Read())
                        {
                            _rowCount++;
                            _input.Increment();
                            yield return(_rowCreator.Create(reader, _fields));
                        }
                    }
                }

                _input.Info("{0} from {1}", _rowCount, _input.Connection.Name);
            }
        }
 public IEnumerable <IRow> Read(IEnumerable <IRow> input)
 {
     return(_reader.Read(input).Select(r => _typeTransform.Transform(r)));
 }
Beispiel #3
0
        public IEnumerable <IRow> Read()
        {
            using (var cn = _factory.GetConnection()) {
                cn.Open();
                var cmd = cn.CreateCommand();

                if (string.IsNullOrEmpty(_input.Entity.Query))
                {
                    if (_input.Entity.MinVersion == null)
                    {
                        cmd.CommandText = _input.SqlSelectInput(_fields, _factory);
                        _input.Debug(() => cmd.CommandText);
                    }
                    else
                    {
                        cmd.CommandText = _input.SqlSelectInputWithMinVersion(_fields, _factory);
                        _input.Debug(() => cmd.CommandText);

                        var parameter = cmd.CreateParameter();
                        parameter.ParameterName = "@MinVersion";
                        parameter.Direction     = ParameterDirection.Input;
                        parameter.Value         = _input.Entity.MinVersion;
                        cmd.Parameters.Add(parameter);
                    }

                    if (_input.Entity.IsPageRequest())
                    {
                        var sql = $"SELECT COUNT(*) FROM {_input.SqlInputName(_factory)} {(_factory.AdoProvider == AdoProvider.SqlServer ? "WITH (NOLOCK)" : string.Empty)} {(_input.Entity.Filter.Any() ? " WHERE " + _input.ResolveFilter(_factory) : string.Empty)}";
                        _input.Debug(() => sql);
                        try {
                            _input.Entity.Hits = cn.ExecuteScalar <int>(sql);
                        } catch (Exception ex) {
                            _input.Error(ex.Message);
                        }
                    }
                    _input.Entity.Query = cmd.CommandText;
                }
                else
                {
                    cmd.CommandText = _input.Entity.Query;
                }

                cmd.CommandType    = CommandType.Text;
                cmd.CommandTimeout = 0;

                IDataReader reader = null;
                try {
                    reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                } catch (Exception ex) {
                    _input.Error(ex.Message);
                    yield break;
                }

                using (reader) {
                    if (_fields.Length < reader.FieldCount)
                    {
                        _input.Warn($"The reader is returning {reader.FieldCount} fields, but the entity {_input.Entity.Alias} expects {_fields.Length}!");
                    }

                    // transform types if sqlite
                    if (_factory.AdoProvider == AdoProvider.SqLite)
                    {
                        while (reader.Read())
                        {
                            _rowCount++;
                            _input.Increment();
                            var row = _rowCreator.Create(reader, _fields);
                            _typeTransform.Transform(row);
                            yield return(row);
                        }
                    }
                    else
                    {
                        // check the first one's types
                        if (reader.Read())
                        {
                            var row = _rowCreator.Create(reader, _fields);
                            foreach (var field in _fields)
                            {
                                var expected = Constants.TypeSystem()[field.Type];
                                var actual   = row[field] == null ? expected : row[field].GetType();
                                if (expected != actual)
                                {
                                    _input.Warn(
                                        $"The {field.Alias} field in {_input.Entity.Alias} expects a {expected}, but is reading a {actual}.");
                                }
                            }
                            _rowCount++;
                            _input.Increment();
                            yield return(row);
                        }

                        // just read
                        while (reader.Read())
                        {
                            _rowCount++;
                            _input.Increment();
                            yield return(_rowCreator.Create(reader, _fields));
                        }
                    }
                }

                _input.Info("{0} from {1}", _rowCount, _input.Connection.Name);
            }
        }