예제 #1
0
        public long Count <TCondition>(ISpecification <TCondition> specification)
        {
            Revenj.Utility.ChunkedMemoryStream cms = null;
            System.IO.TextWriter sw = null;
            var selectType          = "SELECT count(*)";

            if (specification == null)
            {
                cms = Common.Utility.UseThreadLocalStream();
                sw  = cms.GetWriter();
                sw.Write(@"SELECT count(*) FROM ""FormABC"".""Input_entity"" r");
            }

            else
            {
                return(Query(specification).LongCount());
            }

            sw.Flush();
            cms.Position = 0;
            var  com   = PostgresCommandFactory.NewCommand(cms);          //TODO: sql template
            long total = 0;

            DatabaseQuery.Execute(com, dr => { total = dr.GetInt64(0); });
            return(total);
        }
예제 #2
0
파일: BulkRead.cs 프로젝트: zhxjdwh/revenj
            public void Execute()
            {
                Writer.Flush();
                Stream.Position = 0;
                Stream.SetLength(Stream.Length - 2);
                IDbCommand com;

                if (UsePrepared)
                {
                    var             name = ActionName.ToString();
                    PreparedCommand preparedCommand;
                    if (!PreparedStatements.TryGetValue(name, out preparedCommand))
                    {
                        var preparedName = "LR-" + PreparedCount++;
                        var rdr          = Stream.GetReader();
                        preparedCommand          = new PreparedCommand(preparedName, rdr.ReadToEnd(), string.Join(",", Types));
                        PreparedStatements[name] = preparedCommand;
                    }
                    Stream.Reset();
                    Writer.Write("EXECUTE \"");
                    Writer.Write(preparedCommand.Name);
                    Writer.Write('"');
                    if (preparedCommand.Types.Length > 0)
                    {
                        Writer.Write(" (");
                        if (WriteValues.Count > 0)
                        {
                            WriteValues[0](Writer);
                        }
                        for (int i = 1; i < WriteValues.Count; i++)
                        {
                            Writer.Write(',');
                            WriteValues[i](Writer);
                        }
                        Writer.Write(")");
                    }
                    Writer.Flush();
                    Stream.Position = 0;
                    com             = PostgresCommandFactory.PreparedCommand(Stream, preparedCommand.Name, preparedCommand.Query, preparedCommand.Types);
                }
                else
                {
                    com = PostgresCommandFactory.NewCommand(Stream);
                }
                Results = new object[ResultActions.Count];
                Query.Execute(
                    com,
                    dr =>
                {
                    for (int i = 0; i < ResultActions.Count; i++)
                    {
                        Results[i] = ResultActions[i](dr, i);
                    }
                });
            }
        public TResult Execute <TResult>(IDatabaseQuery <SqlConnection, TResult> query)
        {
            using (var connection = new SqlConnection(_connectionString))
            {
                connection.Open();
                var result = query.Execute(connection);
                connection.Close();

                return(result);
            }
        }
예제 #4
0
        /// <summary>
        /// Execute query on the database without the regards for result.
        /// Connection and transaction information will be appended to the provided command.
        /// </summary>
        /// <param name="query">ADO.NET driver</param>
        /// <param name="sql">sql to execute</param>
        /// <param name="parameters">sql parameters</param>
        /// <returns>comand.Execute() result</returns>
        public static int Execute(
            this IDatabaseQuery query,
            string sql,
            params object[] parameters)
        {
            Contract.Requires(query != null);
            Contract.Requires(!string.IsNullOrWhiteSpace(sql));

            var com = query.CreateCommand(sql, parameters);

            return(query.Execute(com));
        }
예제 #5
0
        public long Count <TCondition>(ISpecification <TCondition> specification)
        {
            Revenj.Utility.ChunkedMemoryStream cms = null;
            System.IO.TextWriter sw = null;
            var selectType          = "SELECT count(*)";

            if (specification == null)
            {
                cms = Common.Utility.UseThreadLocalStream();
                sw  = cms.GetWriter();
                sw.Write(@"SELECT count(*) FROM ""Test"".""XYZ_entity"" r");
            }


            else if (specification is global::Test.XYZ.FindBy)
            {
                var spec = specification as global::Test.XYZ.FindBy;
                cms = Common.Utility.UseThreadLocalStream();
                sw  = cms.GetWriter();
                sw.Write(selectType);
                sw.Write(@" FROM ""Test"".""XYZ.FindBy""(");

                sw.Write('\'');
                _DatabaseCommon.Utility.StringToTuple(spec.from).InsertRecord(sw, cms.SmallBuffer, string.Empty, PostgresTuple.EscapeQuote);
                sw.Write('\'');
                sw.Write(") _it");
            }
            else
            {
                return(Query(specification).LongCount());
            }

            sw.Flush();
            cms.Position = 0;
            var  com   = PostgresCommandFactory.NewCommand(cms);          //TODO: sql template
            long total = 0;

            DatabaseQuery.Execute(com, dr => { total = dr.GetInt64(0); });
            return(total);
        }
예제 #6
0
        /// <summary>
        /// Execute query on the database and loop through the reader.
        /// Connection and transaction information will be appended to the provided command.
        /// Provided parameters will be inserted into the command.
        /// command.ExecuteDataReader() will be called.
        /// </summary>
        /// <param name="query">ADO.NET driver</param>
        /// <param name="sql">sql to execute</param>
        /// <param name="action">datareader converter</param>
        /// <param name="parameters">command parameters</param>
        public static void Execute(
            this IDatabaseQuery query,
            string sql,
            Action <IDataReader> action,
            params object[] parameters)
        {
            Contract.Requires(query != null);
            Contract.Requires(!string.IsNullOrWhiteSpace(sql));

            var com = query.CreateCommand(sql, parameters);

            query.Execute(com, action);
        }
예제 #7
0
 public static void Fill <TValue, TProperty>(
     this IDatabaseQuery query,
     TValue[] data,
     string sequenceName,
     Action <TValue, TProperty> setProperty)
 {
     if (data.Length != 0)
     {
         int cnt = 0;
         query.Execute(
             @"/*NO LOAD BALANCE*/SELECT {0} FROM generate_series(1, {1})".With(sequenceName, data.Length),
             dr => setProperty(data[cnt++], (TProperty)dr.GetValue(0)));
     }
 }
예제 #8
0
 public static void Fill <TValue, TProperty>(
     this IDatabaseQuery query,
     TValue[] data,
     string sequenceName,
     Action <TValue, TProperty> setProperty)
 {
     if (data.Length != 0)
     {
         int cnt = 0;
         query.Execute(
             @"SELECT {0} FROM dual CONNECT BY LEVEL <= {1}".With(sequenceName, data.Length),
             dr => setProperty(data[cnt++], (TProperty)Convert.ChangeType(dr.GetValue(0), typeof(TProperty))));
     }
 }
예제 #9
0
        /// <summary>
        /// Execute query on the database and return converted result.
        /// Connection and transaction information will be appended to the provided command.
        /// </summary>
        /// <typeparam name="T">result type</typeparam>
        /// <param name="query">ADO.NET driver</param>
        /// <param name="sql">sql to execute</param>
        /// <param name="instancer">object factory</param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public static T Get <T>(
            this IDatabaseQuery query,
            string sql,
            Func <IDataReader, T> instancer,
            params object[] parameters)
        {
            Contract.Requires(query != null);
            Contract.Requires(!string.IsNullOrWhiteSpace(sql));

            var com = query.CreateCommand(sql, parameters);
            T   t   = default(T);

            query.Execute(com, dr => t = instancer(dr));
            return(t);
        }
예제 #10
0
        /// <summary>
        /// Execute query on the database and loop through the reader.
        /// Return list populated from instance factory.
        /// Connection and transaction information will be appended to the provided command.
        /// command.ExecuteDataReader() will be called.
        /// </summary>
        /// <typeparam name="T">result type</typeparam>
        /// <param name="query">ADO.NET driver</param>
        /// <param name="sql">sql to execute</param>
        /// <param name="instancer">object factory</param>
        /// <param name="parameters">additional command parameters</param>
        /// <returns>populated list</returns>
        public static List <T> Fill <T>(
            this IDatabaseQuery query,
            string sql,
            Func <IDataReader, T> instancer,
            params object[] parameters)
        {
            Contract.Requires(query != null);
            Contract.Requires(!string.IsNullOrWhiteSpace(sql));

            var com  = query.CreateCommand(sql, parameters);
            var list = new List <T>();

            query.Execute(com, dr => list.Add(instancer(dr)));
            return(list);
        }
예제 #11
0
        public DataTable Analyze(
            IEnumerable <string> dimensions,
            IEnumerable <string> facts,
            IEnumerable <KeyValuePair <string, bool> > order,
            ISpecification <TSource> filter,
            int?limit,
            int?offset)
        {
            var usedDimensions = new List <string>();
            var usedFacts      = new List <string>();

            if (dimensions != null)
            {
                usedDimensions.AddRange(dimensions);
            }
            if (facts != null)
            {
                usedFacts.AddRange(facts);
            }
            var sql   = PrepareSql(usedDimensions, usedFacts, order, filter, limit, offset);
            var table = new DataTable {
                CaseSensitive = true
            };
            var converters = PrepareConverters(usedDimensions, usedFacts, table);

            using (var cms = ChunkedMemoryStream.Create())
            {
                DatabaseQuery.Execute(sql, dr =>
                {
                    var obj = dr.GetValue(0);
                    var tr  = obj as TextReader;
                    var btr = tr != null ? cms.UseBufferedReader(tr) : cms.UseBufferedReader(obj.ToString());
                    btr.Read();
                    var args = new object[converters.Length];
                    for (int i = 0; i < converters.Length; i++)
                    {
                        args[i] = converters[i](btr);
                    }
                    table.Rows.Add(args);
                    if (tr != null)
                    {
                        tr.Dispose();
                    }
                });
            }
            return(table);
        }
예제 #12
0
        private List <ResultObjectMapping> LoadData(QueryModel queryModel)
        {
            var sqlCommand =
                SqlGeneratorQueryModelVisitor.GenerateSqlQuery(
                    queryModel,
                    Locator,
                    ConverterFactory,
                    ExtensibilityProvider);

            var resultItems = new List <ResultObjectMapping>();

            DatabaseQuery.Execute(sqlCommand.CreateQuery(), dr => resultItems.Add(sqlCommand.ProcessRow(dr)));

            if (queryModel.ResultOperators.Any(it => it is LastResultOperator) && resultItems.Count > 1)
            {
                resultItems.RemoveRange(0, resultItems.Count - 1);
            }
            return(resultItems);
        }
예제 #13
0
        public async Task <TResult> QueryAsync <TResult>(IDatabaseQuery <TResult, TModel> query, RetryParams retryParams)
        {
            if (model == null)
            {
                throw new NullReferenceException("The Model has been disposed.");
            }

            var policy = MakeRetryPolicy(retryParams);

            return(await policy.ExecuteAsync(() => Task.Run(() =>
            {
                var result = query.Execute(model);
                if (disposeOnCompleted)
                {
                    model.Dispose();
                    model = default(TModel);
                }
                return result;
            })).ConfigureAwait(false));
        }
예제 #14
0
        private List <ResultObjectMapping> LoadData(QueryModel queryModel)
        {
            var sqlCommand =
                SqlGeneratorQueryModelVisitor.GenerateSqlQuery(
                    queryModel,
                    Locator,
                    ConverterFactory,
                    ExtensibilityProvider);

            var resultItems = new List <ResultObjectMapping>();

            using (var cms = ChunkedMemoryStream.Create())
            {
                var reader = cms.UseBufferedReader(string.Empty);
                DatabaseQuery.Execute(sqlCommand.CreateQuery(cms), dr => resultItems.Add(sqlCommand.ProcessRow(dr, reader)));
            }
            if (queryModel.ResultOperators.Any(it => it is LastResultOperator) && resultItems.Count > 1)
            {
                resultItems.RemoveRange(0, resultItems.Count - 1);
            }
            return(resultItems);
        }
예제 #15
0
 public List <global::FormABC.Input> ExecuteAll(IDatabaseQuery query, System.Data.IDbCommand command)
 {
     this.cms.Position = 0;
     query.Execute(command, CollectAll);
     return(list);
 }
예제 #16
0
 public global::FormABC.Input ExecuteOne(IDatabaseQuery query, System.Data.IDbCommand command)
 {
     this.cms.Position = 0;
     query.Execute(command, CollectOne);
     return(one);
 }
 public T Query <T>(IDatabaseQuery <T> query)
 {
     return(query.Execute(SessionManager));
 }
예제 #18
0
 public List <global::UseCase1.Customer> ExecuteAll(IDatabaseQuery query, System.Data.IDbCommand command)
 {
     this.cms.Position = 0;
     query.Execute(command, CollectAll);
     return(list);
 }
예제 #19
0
 public global::UseCase1.Customer ExecuteOne(IDatabaseQuery query, System.Data.IDbCommand command)
 {
     this.cms.Position = 0;
     query.Execute(command, CollectOne);
     return(one);
 }