using System; using System.Data; using System.Linq; using System.Linq.Expressions; using SubSonic.DataProviders; using SubSonic.Extensions; using SubSonic.Linq.Structure; using SubSonic.Query; using SubSonic.Schema; using System.Data.Common; using System.Collections.Generic; namespace SubSonic { public partial class tempdbDB : IQuerySurface { public IDataProvider DataProvider; public DbQueryProvider provider; public static IDataProvider DefaultDataProvider { get; set; } public bool TestMode { get { return DataProvider.ConnectionString.Equals("test", StringComparison.InvariantCultureIgnoreCase); } } public tempdbDB() { if (DefaultDataProvider == null) { DataProvider = ProviderFactory.GetProvider("Smackdown.Properties.Settings.tempdbConnectionString"); } else { DataProvider = DefaultDataProvider; } Init(); } public tempdbDB(string connectionStringName) { DataProvider = ProviderFactory.GetProvider(connectionStringName); Init(); } public tempdbDB(string connectionString, string providerName) { DataProvider = ProviderFactory.GetProvider(connectionString,providerName); Init(); } public ITable FindByPrimaryKey(string pkName) { return DataProvider.Schema.Tables.SingleOrDefault(x => x.PrimaryKey.Name.Equals(pkName, StringComparison.InvariantCultureIgnoreCase)); } public Query GetQuery() { return new Query(provider); } public ITable FindTable(string tableName) { return DataProvider.FindTable(tableName); } public IDataProvider Provider { get { return DataProvider; } set {DataProvider=value;} } public DbQueryProvider QueryProvider { get { return provider; } } BatchQuery _batch = null; public void Queue(IQueryable qry) { if (_batch == null) _batch = new BatchQuery(Provider, QueryProvider); _batch.Queue(qry); } public void Queue(ISqlQuery qry) { if (_batch == null) _batch = new BatchQuery(Provider, QueryProvider); _batch.Queue(qry); } public void ExecuteTransaction(IList commands) { if(!TestMode) { using(var connection = commands[0].Connection) { if (connection.State == ConnectionState.Closed) connection.Open(); using (var trans = connection.BeginTransaction()) { foreach (var cmd in commands) { cmd.Transaction = trans; cmd.Connection = connection; cmd.ExecuteNonQuery(); } trans.Commit(); } connection.Close(); } } } public IDataReader ExecuteBatch() { if (_batch == null) throw new InvalidOperationException("There's nothing in the queue"); if(!TestMode) return _batch.ExecuteReader(); return null; } public Query Posts { get; set; } #region ' Aggregates and SubSonic Queries ' public Select SelectColumns(params string[] columns) { return new Select(DataProvider, columns); } public Select Select { get { return new Select(this.Provider); } } public Insert Insert { get { return new Insert(this.Provider); } } public Update Update() where T:new() { return new Update(this.Provider); } public SqlQuery Delete(Expression> column) where T:new() { LambdaExpression lamda = column; SqlQuery result = new Delete(this.Provider); result = result.From(); result.Constraints=lamda.ParseConstraints().ToList(); return result; } public SqlQuery Max(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = DataProvider.FindTable(objectName).Name; return new Select(DataProvider, new Aggregate(colName, AggregateFunction.Max)).From(tableName); } public SqlQuery Min(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Min)).From(tableName); } public SqlQuery Sum(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Sum)).From(tableName); } public SqlQuery Avg(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Avg)).From(tableName); } public SqlQuery Count(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Count)).From(tableName); } public SqlQuery Variance(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.Var)).From(tableName); } public SqlQuery StandardDeviation(Expression> column) { LambdaExpression lamda = column; string colName = lamda.ParseObjectValue(); string objectName = typeof(T).Name; string tableName = this.Provider.FindTable(objectName).Name; return new Select(this.Provider, new Aggregate(colName, AggregateFunction.StDev)).From(tableName); } #endregion void Init() { provider = new DbQueryProvider(this.Provider); #region ' Query Defs ' Posts = new Query(provider); #endregion #region ' Schemas ' if(DataProvider.Schema.Tables.Count == 0) { DataProvider.Schema.Tables.Add(new PostsTable(DataProvider)); } #endregion } #region ' Helpers ' internal static DateTime DateTimeNowTruncatedDownToSecond() { var now = DateTime.Now; return now.AddTicks(-now.Ticks % TimeSpan.TicksPerSecond); } #endregion } }