public WhereClauseResult Build()
        {
            try
            {
                if (_tuples.Count == 0)
                {
                    return(WhereClauseResult.Null);
                }

                var writer = new StringTextWriter();

                foreach (var tuple in _tuples)
                {
                    writer.Write(writer.Length > 0 ? $" {tuple.Key} {tuple.Value}" : tuple.Value);
                }

                var statement = writer.ToStringWithClear();
                var dynParms  = _dynParms;

                return(new WhereClauseResult(statement, dynParms));
            }
            finally
            {
                Clear();
            }
        }
        public OrderbyClauseResult Build()
        {
            try
            {
                var writer = new StringTextWriter();
                // ReSharper disable once InvertIf
                if (_tuples != null && _tuples.Any())
                {
                    foreach (var tuple in _tuples)
                    {
                        if (writer.Length > 0)
                        {
                            writer.Write(", ");
                        }
                        writer.Write($"{tuple.Key} {tuple.Value}");
                    }
                    var orderbyClause = writer.ToStringWithClear();

                    return((OrderbyClauseResult)orderbyClause);
                }
                // (null)
                return(OrderbyClauseResult.Null);
            }
            finally
            {
                Clear();
            }
        }
Esempio n. 3
0
        public CommandTextEventInfo ConstructSingleSql <TKey, TEntity>(IList <Expression <Func <TEntity, object> > > logicFields, IEnumerable <Expression <Func <TEntity, object> > > selectFields, Expression <Func <TEntity, object> > id, TKey value) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var tp = entityType.GetRuntimeProperties().Where(p => p.PropertyType.IsSimpleType());

            if (logicFields != null)
            {
                tp = tp.Where(p => !logicFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }
            if (selectFields != null)
            {
                tp = tp.Where(p => selectFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }

            var idParamName = _dialectSettings.GetParameterName(id.GetMemberName());

            dynParms.Add(idParamName, value);
            writer.Write($"SELECT TOP(1) {string.Join(", ", tp.Select(p => _dialectSettings.GetEscapeName(p)))} FROM {tableName} ");
            writer.Write($" WHERE ({_dialectSettings.GetEscapeName(id)} = {idParamName}) ");
            writer.Write(";");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 4
0
        public CommandTextEventInfo ConstructTakeSql <TKey, TEntity>(IList <Expression <Func <TEntity, object> > > logicFields, int take, IEnumerable <Expression <Func <TEntity, object> > > selectFields, WhereClauseResult whereClause, OrderbyClauseResult orderbyClause) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var tp = entityType.GetRuntimeProperties().Where(p => p.PropertyType.IsSimpleType());

            if (logicFields != null)
            {
                tp = tp.Where(p => !logicFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }
            if (selectFields != null)
            {
                tp = tp.Where(p => selectFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }

            writer.Write($"SELECT TOP({take}) {string.Join(", ", tp.Select(p => _dialectSettings.GetEscapeName(p)))} FROM {tableName} ");
            if (whereClause != null)
            {
                writer.Write($"WHERE ({whereClause}) ");
                dynParms.AdddWhereClause(whereClause);
            }
            if (!orderbyClause.IsNull)
            {
                writer.Write($"ORDER BY {orderbyClause} ");
            }
            writer.Write(";");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 5
0
        public async Task <TResult> ExecuteAsync <TResult>(Func <IStorageDbConnection, object[], IDbTransaction, CancellationToken, Task <TResult> > command, object[] args, IsolationLevel il, CancellationToken cancellationToken)
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }
            if (args == null)
            {
                throw new ArgumentNullException(nameof(args));
            }

            var writer = new StringTextWriter();

            writer.WriteAa();
            var conn = new StorageDbConnection(await CreateDbConnectionWithOpenAsync(cancellationToken), writer);

            writer.WriteBb(Identity);

            var tr = conn.BeginTransaction(il);

            writer.WriteFf();

            try
            {
                var result = await command(conn, args, tr, cancellationToken);

                tr.Commit();

                writer.WriteGg();
                writer.WriteCc();

                return(result);
            }
            catch (Exception e)
            {
                writer.WriteError(e.Message);
                tr.Rollback();
                writer.WriteHh();

                throw new InvalidOperationException("Command failed to execute!", e);
            }
            finally
            {
                conn.Close();
                conn.Dispose();
                tr.Dispose();

                writer.WriteDd(Identity);
                writer.WriteEe();

                var message = writer.ToStringWithClear();
                Logger.Write(message);
            }
        }
Esempio n. 6
0
        public CommandTextEventInfo ConstructCountSql <TKey, TEntity>(Expression <Func <TEntity, object> > member, WhereClauseResult whereClause) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            writer.Write($"SELECT COUNT({(member == null ? "1" : _dialectSettings.GetEscapeName(member))}) AS _TotalNumberOfRecords FROM {tableName} ");
            if (whereClause != null)
            {
                writer.Write($"WHERE ({whereClause}) ");
                dynParms.AdddWhereClause(whereClause);
            }
            writer.Write(";");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 7
0
        public CommandTextEventInfo ConstructUpdateSql <TKey, TEntity>(IList <Expression <Func <TEntity, object> > > logicFields, TEntity entityToUpdate, IEnumerable <Expression <Func <TEntity, object> > > updateFields, Expression <Func <TEntity, object> > id, TKey value) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            if (entityToUpdate == null)
            {
                throw new ArgumentNullException(nameof(entityToUpdate));
            }
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var tp = entityType.GetRuntimeProperties().Where(p => p.PropertyType.IsSimpleType());

            if (logicFields != null)
            {
                tp = tp.Where(p => !logicFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }
            if (updateFields != null)
            {
                tp = tp.Where(p => updateFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }

            var properties = tp.ToList();
            var kvps       = new List <KeyValuePair <string, string> >(properties.Count);

            foreach (var property in properties)
            {
                var paramName = _dialectSettings.GetParameterName(property);
                dynParms.Add(paramName, property.GetValue(entityToUpdate));
                kvps.Add(new KeyValuePair <string, string>(_dialectSettings.GetEscapeName(property), paramName));
            }

            var idParamName = _dialectSettings.GetParameterName(id.GetMemberName());

            dynParms.Add(idParamName, value);
            writer.Write($"UPDATE {tableName} SET {string.Join(", ", kvps.Select(kvp => $"{kvp.Key} = {kvp.Value}"))} WHERE ({_dialectSettings.GetEscapeName(id.GetMemberName())} = {idParamName}) ;");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 8
0
        public CommandTextEventInfo ConstructDeleteSql <TKey, TEntity>(Expression <Func <TEntity, object> > id, TKey value) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var idParamName = _dialectSettings.GetParameterName(id.GetMemberName());

            dynParms.Add(idParamName, value);
            writer.Write($"DELETE FROM {tableName} WHERE ({_dialectSettings.GetEscapeName(id)} = {idParamName}) ;");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 9
0
        public CommandTextEventInfo ConstructInsertSql <TKey, TEntity>(IList <Expression <Func <TEntity, object> > > logicFields, TEntity entityToInsert, IEnumerable <Expression <Func <TEntity, object> > > ignoredFields, bool autoIncrement) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            if (entityToInsert == null)
            {
                throw new ArgumentNullException(nameof(entityToInsert));
            }

            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var tp = entityType.GetRuntimeProperties().Where(p => p.PropertyType.IsSimpleType());

            if (logicFields != null)
            {
                tp = tp.Where(p => !logicFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }
            if (ignoredFields != null)
            {
                tp = tp.Where(p => !ignoredFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }

            var properties = tp.ToList();
            var kvps       = new List <KeyValuePair <string, string> >(properties.Count);

            foreach (var property in properties)
            {
                var paramName = _dialectSettings.GetParameterName(property);
                dynParms.Add(paramName, property.GetValue(entityToInsert));
                kvps.Add(new KeyValuePair <string, string>(_dialectSettings.GetEscapeName(property), paramName));
            }

            writer.Write($"INSERT INTO {tableName} ({string.Join(", ", kvps.Select(kvp => kvp.Key))}) VALUES ({string.Join(", ", kvps.Select(kvp => kvp.Value))}) ;");
            // ReSharper disable once InvertIf
            if (autoIncrement)
            {
                writer.Write(_dialectSettings.GetIdentitySql);
                writer.Write(" ;");
            }

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 10
0
        public CommandTextEventInfo ConstructExistsSql(Type entityType, WhereClauseResult whereClause)
        {
            var writer    = new StringTextWriter();
            var dynParms  = new DynamicParameters();
            var tableName = _dialectSettings.GetEscapeName(entityType);

            writer.Write("SELECT ISNULL(");
            writer.Write("(");
            writer.Write($"SELECT TOP(1) 1 FROM {tableName}");
            if (whereClause != null)
            {
                writer.Write($"WHERE ({whereClause}) ");
                dynParms.AdddWhereClause(whereClause);
            }
            writer.Write("),0");
            writer.Write(") AS _ExistsFlag ;");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 11
0
        public async Task ExecuteAsync(Func <IStorageDbConnection, object[], CancellationToken, Task> command, object[] args, CancellationToken cancellationToken)
        {
            if (command == null)
            {
                throw new ArgumentNullException(nameof(command));
            }
            if (args == null)
            {
                throw new ArgumentNullException(nameof(args));
            }

            var writer = new StringTextWriter();

            writer.WriteAa();
            var conn = new StorageDbConnection(await CreateDbConnectionWithOpenAsync(cancellationToken), writer);

            writer.WriteBb(Identity);

            try
            {
                await command(conn, args, cancellationToken);

                writer.WriteCc();
            }
            catch (Exception e)
            {
                writer.WriteError(e.Message);
                throw new InvalidOperationException("Command failed to execute!", e);
            }
            finally
            {
                conn.Close();
                conn.Dispose();

                writer.WriteDd(Identity);
                writer.WriteEe();

                var message = writer.ToStringWithClear();
                Logger.Write(message);
            }
        }
Esempio n. 12
0
        public CommandTextEventInfo ConstructDeleteSql(Type entityType, WhereClauseResult whereClause)
        {
            if (entityType == null)
            {
                throw new ArgumentNullException(nameof(entityType));
            }

            var writer    = new StringTextWriter();
            var dynParms  = new DynamicParameters();
            var tableName = _dialectSettings.GetEscapeName(entityType);

            writer.Write($"DELETE FROM {tableName} ");
            if (whereClause != null)
            {
                writer.Write($"WHERE ({whereClause}) ");
                dynParms.AdddWhereClause(whereClause);
            }
            writer.Write(";");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
Esempio n. 13
0
        public CommandTextEventInfo ConstructPageSql <TKey, TEntity>(IList <Expression <Func <TEntity, object> > > logicFields, int skip, int take, IEnumerable <Expression <Func <TEntity, object> > > selectFields, WhereClauseResult whereClause, OrderbyClauseResult orderbyClause) where TKey : IEquatable <TKey> where TEntity : class, IEntity <TKey>
        {
            var writer     = new StringTextWriter();
            var dynParms   = new DynamicParameters();
            var entityType = typeof(TEntity);
            var tableName  = _dialectSettings.GetEscapeName(entityType);

            var tp = entityType.GetRuntimeProperties().Where(p => p.PropertyType.IsSimpleType());

            if (logicFields != null)
            {
                tp = tp.Where(p => !logicFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }
            if (selectFields != null)
            {
                tp = tp.Where(p => selectFields.Any(exp => string.Equals(p.Name, exp.GetMemberName(), StringComparison.Ordinal)));
            }

            // _TotalNumberOfRecords
            writer.Write($"SELECT COUNT(1) AS _TotalNumberOfRecords FROM {tableName} ");
            if (whereClause != null)
            {
                writer.Write($"WHERE ({whereClause})");
            }
            writer.Write("; ");
            // PagedResult
            var propeerties = tp.ToList();

            writer.Write($"SELECT {string.Join(", ", propeerties.Select(p => $"PagedResult.{_dialectSettings.GetEscapeName(p)}"))} FROM (");
            writer.Write($"SELECT TOP({skip + take}) ROW_NUMBER() OVER(ORDER BY {orderbyClause}) AS _PagedNumber, {string.Join(", ", propeerties.Select(p => _dialectSettings.GetEscapeName(p)))} FROM {tableName}");
            if (whereClause != null)
            {
                writer.Write($" WHERE ({whereClause})");
                dynParms.AdddWhereClause(whereClause);
            }
            writer.Write($") AS PagedResult WHERE (PagedResult._PagedNumber > {skip}) ");
            writer.Write(";");

            return(new CommandTextEventInfo(writer.ToStringWithClear(), dynParms));
        }
 public StorageDbConnection(IDbConnection conn, StringTextWriter textWriter)
 {
     _conn      = conn ?? throw new ArgumentNullException(nameof(conn));
     TextWriter = textWriter ?? throw new ArgumentNullException(nameof(textWriter));
 }