summaryrefslogtreecommitdiff
path: root/slips/src/app/Marina/DataAccess/Builders
diff options
context:
space:
mode:
Diffstat (limited to 'slips/src/app/Marina/DataAccess/Builders')
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/DatabaseDelete.cs31
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/DatabaseInsert.cs50
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/DatabaseSelect.cs101
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/DatabaseUpdate.cs52
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IDeleteQueryBuilder.cs3
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IInsertQueryBuilder.cs5
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IJoin.cs6
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IQuery.cs7
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IQueryBuilder.cs9
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/ISelectQueryBuilder.cs11
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/IUpdateQueryBuilder.cs5
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/Query.cs22
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/SqlQuery.cs18
-rw-r--r--slips/src/app/Marina/DataAccess/Builders/WhereClause.cs27
14 files changed, 347 insertions, 0 deletions
diff --git a/slips/src/app/Marina/DataAccess/Builders/DatabaseDelete.cs b/slips/src/app/Marina/DataAccess/Builders/DatabaseDelete.cs
new file mode 100644
index 0000000..801aba0
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/DatabaseDelete.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+
+namespace Marina.DataAccess.Builders {
+ public static class DatabaseDelete {
+ public static IQuery Where< T >( DatabaseColumn column, T equalsValue ) {
+ return new DeleteQueryBuilder< T >( column, equalsValue ).Build( );
+ }
+
+ private class DeleteQueryBuilder< T > : IDeleteQueryBuilder {
+ public DeleteQueryBuilder( DatabaseColumn column, T value ) {
+ _column = column;
+ _value = value;
+ }
+
+ public override string ToString() {
+ return string.Format( "DELETE FROM [{0}] WHERE [{0}].[{1}] = @{1};", _column.TableName, _column.ColumnName );
+ }
+
+ public IEnumerable< DatabaseCommandParameter > Parameters() {
+ yield return new DatabaseCommandParameter( _column.ColumnName, _value );
+ }
+
+ public IQuery Build() {
+ return new Query( this );
+ }
+
+ private readonly DatabaseColumn _column;
+ private readonly T _value;
+ }
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/DatabaseInsert.cs b/slips/src/app/Marina/DataAccess/Builders/DatabaseInsert.cs
new file mode 100644
index 0000000..57c0c1d
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/DatabaseInsert.cs
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.Text;
+
+namespace Marina.DataAccess.Builders {
+ public static class DatabaseInsert {
+ public static IInsertQueryBuilder Into( string tableName ) {
+ return new InsertQueryBuilder( tableName );
+ }
+
+ private class InsertQueryBuilder : IInsertQueryBuilder {
+ public InsertQueryBuilder( string tableName ) {
+ _tableName = tableName;
+ _parameters = new List< DatabaseCommandParameter >( );
+ }
+
+ public IEnumerable< DatabaseCommandParameter > Parameters() {
+ return _parameters;
+ }
+
+ public IQuery Build() {
+ return new Query( this );
+ }
+
+ public IInsertQueryBuilder AddValue< T >( DatabaseColumn column, T value ) {
+ _parameters.Add( new DatabaseCommandParameter( column.ColumnName, value ) );
+ return this;
+ }
+
+ public override string ToString() {
+ StringBuilder builder = new StringBuilder( );
+ builder.AppendFormat( "INSERT INTO {0} ({1}) VALUES ({2});SELECT @@IDENTITY;", _tableName,
+ GetParameterNames( string.Empty ),
+ GetParameterNames( "@" ) );
+ return builder.ToString( );
+ }
+
+ private string GetParameterNames( string prefix ) {
+ StringBuilder builder = new StringBuilder( );
+ foreach ( DatabaseCommandParameter parameter in _parameters ) {
+ builder.AppendFormat( "{0}{1},", prefix, parameter.ColumnName );
+ }
+ builder.Remove( builder.Length - 1, 1 );
+ return builder.ToString( );
+ }
+
+ private readonly string _tableName;
+ private readonly IList< DatabaseCommandParameter > _parameters;
+ }
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/DatabaseSelect.cs b/slips/src/app/Marina/DataAccess/Builders/DatabaseSelect.cs
new file mode 100644
index 0000000..6e61fff
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/DatabaseSelect.cs
@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using System.Text;
+
+namespace Marina.DataAccess.Builders {
+ public static class DatabaseSelect {
+ public static ISelectQueryBuilder From( string tableName ) {
+ return new SelectQueryBuilder( tableName );
+ }
+
+ private class SelectQueryBuilder : ISelectQueryBuilder {
+ public SelectQueryBuilder( string tableName ) {
+ _tableName = string.Format( "[{0}]", tableName );
+ _innerJoins = new List< InnerJoin >( );
+ _selectColumns = new List< DatabaseColumn >( );
+ }
+
+ public ISelectQueryBuilder AddColumn( DatabaseColumn column ) {
+ _selectColumns.Add( column );
+ return this;
+ }
+
+ public ISelectQueryBuilder InnerJoinOn( DatabaseColumn leftColumn, DatabaseColumn rightColumn ) {
+ _innerJoins.Add( new InnerJoin( leftColumn, rightColumn ) );
+ return this;
+ }
+
+ public ISelectQueryBuilder Where( DatabaseColumn column, string value ) {
+ _whereClause = new WhereClause( column, value );
+ return this;
+ }
+
+ public ISelectQueryBuilder Where< T >( DatabaseColumn column, T value ) {
+ return Where( column, value.ToString( ) );
+ }
+
+ public override string ToString() {
+ return
+ string.Format( "SELECT {0} FROM {1} {2} {3};", GetColumnNames( ), _tableName, GetInnerJoins( ), _whereClause );
+ }
+
+ public IEnumerable< DatabaseCommandParameter > Parameters() {
+ foreach ( DatabaseColumn databaseColumn in _selectColumns ) {
+ yield return new DatabaseCommandParameter( databaseColumn.ColumnName, string.Empty );
+ }
+ }
+
+ public IQuery Build() {
+ return new Query( this );
+ }
+
+ private string GetInnerJoins() {
+ StringBuilder builder = new StringBuilder( );
+ foreach ( InnerJoin innerJoin in _innerJoins ) {
+ builder.Append( innerJoin.ToString( ) );
+ }
+ return builder.ToString( );
+ }
+
+ private string GetColumnNames() {
+ StringBuilder builder = new StringBuilder( );
+ foreach ( DatabaseColumn selectColumn in _selectColumns ) {
+ builder.AppendFormat( "{0},", selectColumn );
+ }
+ builder.Remove( builder.Length - 1, 1 );
+ return builder.ToString( );
+ }
+
+ private readonly string _tableName;
+ private readonly IList< DatabaseColumn > _selectColumns;
+ private readonly IList< InnerJoin > _innerJoins;
+ private WhereClause _whereClause;
+
+ private class InnerJoin : IJoin {
+ public InnerJoin( DatabaseColumn leftColumn, DatabaseColumn rightColumn ) {
+ _leftColumn = leftColumn;
+ _rightColumn = rightColumn;
+ }
+
+ public DatabaseColumn Left() {
+ return _leftColumn;
+ }
+
+ public DatabaseColumn Right() {
+ return _rightColumn;
+ }
+
+ public override string ToString() {
+ return
+ string.Format( "INNER JOIN [{0}] ON [{0}].[{1}] = [{2}].[{3}]",
+ _leftColumn.TableName,
+ _leftColumn.ColumnName,
+ _rightColumn.TableName,
+ _rightColumn.ColumnName );
+ }
+
+ private readonly DatabaseColumn _leftColumn;
+ private readonly DatabaseColumn _rightColumn;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/DatabaseUpdate.cs b/slips/src/app/Marina/DataAccess/Builders/DatabaseUpdate.cs
new file mode 100644
index 0000000..8b90edc
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/DatabaseUpdate.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+using System.Text;
+
+namespace Marina.DataAccess.Builders {
+ public static class DatabaseUpdate {
+ public static IUpdateQueryBuilder Where< T >( DatabaseColumn whereColumn, T whereValue ) {
+ return new UpdateQueryBuilder( whereColumn, whereValue.ToString( ) );
+ }
+
+ private class UpdateQueryBuilder : IUpdateQueryBuilder {
+ public UpdateQueryBuilder( DatabaseColumn whereColumn, string whereValue )
+ : this( new List< DatabaseCommandParameter >( ), new WhereClause( whereColumn, whereValue ) ) {}
+
+ public UpdateQueryBuilder( IList< DatabaseCommandParameter > parameters, WhereClause where ) {
+ _parameters = parameters;
+ _where = where;
+ }
+
+ public IEnumerable< DatabaseCommandParameter > Parameters() {
+ return _parameters;
+ }
+
+ public IQuery Build() {
+ return new Query( this );
+ }
+
+ public IUpdateQueryBuilder Add( DatabaseColumn column, string value ) {
+ _parameters.Add( new DatabaseCommandParameter( column.ColumnName, value ) );
+ return this;
+ }
+
+ public override string ToString() {
+ StringBuilder builder = new StringBuilder( );
+ builder.AppendFormat( "UPDATE [{0}] SET {1};", _where.Column( ).TableName, GetParameterNames( ) );
+ return builder.ToString( );
+ }
+
+ private string GetParameterNames() {
+ StringBuilder builder = new StringBuilder( );
+ foreach ( DatabaseCommandParameter parameter in _parameters ) {
+ builder.AppendFormat( "[{0}].[{1}] = @{1},", _where.Column( ).TableName, parameter.ColumnName );
+ }
+ builder.Remove( builder.Length - 1, 1 );
+ builder.Append( _where );
+ return builder.ToString( );
+ }
+
+ private readonly IList< DatabaseCommandParameter > _parameters;
+ private readonly WhereClause _where;
+ }
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IDeleteQueryBuilder.cs b/slips/src/app/Marina/DataAccess/Builders/IDeleteQueryBuilder.cs
new file mode 100644
index 0000000..2b7290a
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IDeleteQueryBuilder.cs
@@ -0,0 +1,3 @@
+namespace Marina.DataAccess.Builders {
+ public interface IDeleteQueryBuilder : IQueryBuilder {}
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IInsertQueryBuilder.cs b/slips/src/app/Marina/DataAccess/Builders/IInsertQueryBuilder.cs
new file mode 100644
index 0000000..946c914
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IInsertQueryBuilder.cs
@@ -0,0 +1,5 @@
+namespace Marina.DataAccess.Builders {
+ public interface IInsertQueryBuilder : IQueryBuilder {
+ IInsertQueryBuilder AddValue< T >( DatabaseColumn column, T value );
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IJoin.cs b/slips/src/app/Marina/DataAccess/Builders/IJoin.cs
new file mode 100644
index 0000000..c4ae46f
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IJoin.cs
@@ -0,0 +1,6 @@
+namespace Marina.DataAccess.Builders {
+ internal interface IJoin {
+ DatabaseColumn Left();
+ DatabaseColumn Right();
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IQuery.cs b/slips/src/app/Marina/DataAccess/Builders/IQuery.cs
new file mode 100644
index 0000000..a45527f
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IQuery.cs
@@ -0,0 +1,7 @@
+using System.Data;
+
+namespace Marina.DataAccess.Builders {
+ public interface IQuery {
+ void Prepare( IDbCommand command );
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IQueryBuilder.cs b/slips/src/app/Marina/DataAccess/Builders/IQueryBuilder.cs
new file mode 100644
index 0000000..175c2d5
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IQueryBuilder.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace Marina.DataAccess.Builders {
+ public interface IQueryBuilder {
+ IEnumerable< DatabaseCommandParameter > Parameters();
+
+ IQuery Build();
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/ISelectQueryBuilder.cs b/slips/src/app/Marina/DataAccess/Builders/ISelectQueryBuilder.cs
new file mode 100644
index 0000000..058a7a1
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/ISelectQueryBuilder.cs
@@ -0,0 +1,11 @@
+namespace Marina.DataAccess.Builders {
+ public interface ISelectQueryBuilder : IQueryBuilder {
+ ISelectQueryBuilder AddColumn( DatabaseColumn column );
+
+ ISelectQueryBuilder InnerJoinOn( DatabaseColumn leftColumn, DatabaseColumn rightColumn );
+
+ ISelectQueryBuilder Where( DatabaseColumn column, string value );
+
+ ISelectQueryBuilder Where< T >( DatabaseColumn column, T value );
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/IUpdateQueryBuilder.cs b/slips/src/app/Marina/DataAccess/Builders/IUpdateQueryBuilder.cs
new file mode 100644
index 0000000..c599243
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/IUpdateQueryBuilder.cs
@@ -0,0 +1,5 @@
+namespace Marina.DataAccess.Builders {
+ public interface IUpdateQueryBuilder : IQueryBuilder {
+ IUpdateQueryBuilder Add( DatabaseColumn column, string value );
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/Query.cs b/slips/src/app/Marina/DataAccess/Builders/Query.cs
new file mode 100644
index 0000000..0b95bf1
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/Query.cs
@@ -0,0 +1,22 @@
+using System.Data;
+
+namespace Marina.DataAccess.Builders {
+ public class Query : IQuery {
+ public Query( IQueryBuilder builder ) {
+ _builder = builder;
+ }
+
+ public void Prepare( IDbCommand command ) {
+ command.CommandText = _builder.ToString( );
+ command.CommandType = CommandType.Text;
+ foreach ( DatabaseCommandParameter parameter in _builder.Parameters( ) ) {
+ IDataParameter commandParameter = command.CreateParameter( );
+ commandParameter.ParameterName = "@" + parameter.ColumnName;
+ commandParameter.Value = parameter.Value;
+ command.Parameters.Add( commandParameter );
+ }
+ }
+
+ private readonly IQueryBuilder _builder;
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/SqlQuery.cs b/slips/src/app/Marina/DataAccess/Builders/SqlQuery.cs
new file mode 100644
index 0000000..c6b2b47
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/SqlQuery.cs
@@ -0,0 +1,18 @@
+using System.Data;
+
+namespace Marina.DataAccess.Builders {
+ public class SqlQuery : IQuery {
+ public SqlQuery( string sqlQuery ) {
+ _sqlQuery = sqlQuery;
+ }
+
+ public void Prepare( IDbCommand command ) {
+ if ( command != null ) {
+ command.CommandText = _sqlQuery;
+ command.CommandType = CommandType.Text;
+ }
+ }
+
+ private readonly string _sqlQuery;
+ }
+} \ No newline at end of file
diff --git a/slips/src/app/Marina/DataAccess/Builders/WhereClause.cs b/slips/src/app/Marina/DataAccess/Builders/WhereClause.cs
new file mode 100644
index 0000000..5768fde
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/Builders/WhereClause.cs
@@ -0,0 +1,27 @@
+namespace Marina.DataAccess.Builders {
+ public class WhereClause {
+ public WhereClause( DatabaseColumn column, string value ) {
+ _column = column;
+ _value = value;
+ }
+
+ public DatabaseColumn Column() {
+ return _column;
+ }
+
+ public string Value() {
+ return _value;
+ }
+
+ public string ToSql() {
+ return ToString( );
+ }
+
+ public override string ToString() {
+ return string.Format( " WHERE [{0}].[{1}] = {2};", _column.TableName, _column.ColumnName, _value );
+ }
+
+ private readonly DatabaseColumn _column;
+ private readonly string _value;
+ }
+} \ No newline at end of file