/************************************************************************************
*
* Umbraco Data Layer
* MIT Licensed work
* ©2008 Ruben Verborgh
*
***********************************************************************************/
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlServerCe;
using System.Linq;
using System.Xml;
using System.Diagnostics;
using umbraco.DataLayer;
using umbraco.DataLayer.SqlHelpers.SqlServer;
namespace SqlCE4Umbraco
{
///
/// Sql Helper for an SQL Server database.
///
public class SqlCEHelper : SqlHelper
{
///
/// Initializes a new instance of the class.
///
/// The connection string.
public SqlCEHelper(string connectionString) : base(connectionString)
{
m_Utility = new SqlCEUtility(this);
}
///
/// Checks if the actual database exists, if it doesn't then it will create it
///
internal void CreateEmptyDatabase()
{
var localConnection = new SqlCeConnection(ConnectionString);
if (!System.IO.File.Exists(localConnection.Database))
{
var sqlCeEngine = new SqlCeEngine(ConnectionString);
sqlCeEngine.CreateDatabase();
}
}
///
/// Most likely only will be used for unit tests but will remove all tables from the database
///
internal void ClearDatabase()
{
var localConnection = new SqlCeConnection(ConnectionString);
var dbFile = localConnection.Database;
if (System.IO.File.Exists(dbFile))
{
var tables = new List();
using (var reader = ExecuteReader("select table_name from information_schema.tables where TABLE_TYPE <> 'VIEW'"))
{
while (reader.Read())
{
tables.Add(reader.GetString("TABLE_NAME"));
}
}
while(tables.Any())
{
for (var i = 0; i < tables.Count; i++)
{
var dropTable = "DROP TABLE " + tables[i];
try
{
ExecuteNonQuery(dropTable);
tables.Remove(tables[i]);
}
catch (SqlHelperException ex)
{
//this will occur because there is no cascade option, so we just wanna try the next one
}
}
}
}
}
///
/// Creates a new parameter for use with this specific implementation of ISqlHelper.
///
/// Name of the parameter.
/// Value of the parameter.
/// A new parameter of the correct type.
/// Abstract factory pattern
public override IParameter CreateParameter(string parameterName, object value)
{
return new SqlCEParameter(parameterName, value);
}
///
/// Executes a command that returns a single value.
///
/// The command text.
/// The parameters.
/// The return value of the command.
protected override object ExecuteScalar(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteScalar: " + commandText);
#endif
return SqlCeApplicationBlock.ExecuteScalar(ConnectionString, CommandType.Text, commandText, parameters);
}
///
/// Executes a command and returns the number of rows affected.
///
/// The command text.
/// The parameters.
///
/// The number of rows affected by the command.
///
protected override int ExecuteNonQuery(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteNonQuery: " + commandText);
#endif
return SqlCeApplicationBlock.ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parameters);
}
///
/// Executes a command and returns a records reader containing the results.
///
/// The command text.
/// The parameters.
///
/// A data reader containing the results of the command.
///
protected override IRecordsReader ExecuteReader(string commandText, SqlCeParameter[] parameters)
{
#if DEBUG && DebugDataLayer
// Log Query Execution
Trace.TraceInformation(GetType().Name + " SQL ExecuteReader: " + commandText);
#endif
return new SqlCeDataReaderHelper(SqlCeApplicationBlock.ExecuteReader(ConnectionString, CommandType.Text,
commandText, parameters));
}
}
}