/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections.Specialized;
using System.Data.Common;
using Everest.CmsServices.DataRule;
using Everest.CmsServices.Models;
using Everest.Library.Data;
using Everest.Library.ExtensionMethod;
using System.Globalization;
namespace Everest.CmsServices.Providers.SqlServer{
public static class ContentProviderHelper
{
const string TableName = "Cms_{0}_{1}";
/// <summary>
/// Gets the name of the table.
/// </summary>
/// <param name="appName">Name of the app.</param>
/// <param name="schemaName">Name of the schema.</param>
/// <returns></returns>
public static string GetTableName(string appName, string schemaName)
{
string prefix = appName;
if (appName.Equals(CmsGlobal.RootApplicationName, StringComparison.OrdinalIgnoreCase))
{
prefix = "Root";
}
return string.Format(TableName, prefix, schemaName);
}
/// <summary>
/// Contents the query condition.
/// </summary>
/// <param name="queryStatement">The query statement.</param>
/// <param name="queryString">The query string.</param>
/// <param name="application">The application.</param>
/// <param name="schemaName">Name of the schema.</param>
/// <param name="sqlParameters">The SQL parameters.</param>
/// <returns>query expression</returns>
public static StringBuilder ContentQueryCondition(string queryStatement, IDictionary<string, object> queryString,
IEnumerable<Cms_Folder> folders, Guid? parentUUID, DbCommand dbCommand)
{
StringBuilder queryExpression = new StringBuilder("1=1");
if (parentUUID != null)
{
queryExpression.Append(" AND ParentUUID=@ParentUUID");
dbCommand.CreateParameter("ParentUUID", DbType.Guid, parentUUID.Value);
}
// queryExpression.AppendFormat(" AND {0}", FoldersQueryExpresion(folders, dbCommand));
queryStatement = CombineUserCondition(queryStatement, queryString, dbCommand, queryExpression);
return queryExpression;
}
public static string FoldersQueryExpresion(IEnumerable<Cms_Folder> folders, DbCommand dbCommand)
{
StringBuilder queryExpression = new StringBuilder(" 1=1 ");
if (folders != null && folders.Count() > 0)
{
//folder condition
List<string> folderParameters = new List<string>();
int i = 0;
foreach (var folder in folders)
{
i++;
string parameterName = string.Format("@FolderUUID{0}", i);
dbCommand.CreateParameter(parameterName, DbType.Guid, folder.UUID);
folderParameters.Add(parameterName);
}
queryExpression.Append("AND (1<>1");
foreach (var item in folderParameters)
{
queryExpression.AppendFormat(" OR FolderUUID = {0}", item);
}
queryExpression.Append(")");
}
return queryExpression.ToString();
}
public static string CombineUserCondition(string queryStatement, IDictionary<string, object> queryString, DbCommand dbCommand, StringBuilder queryExpression)
{
//Column condition
if (!StringExtensions.IsNullOrEmptyTrim(queryStatement) && queryStatement.Length > 1)
{
ContentQueryStatementInterpreter statementInterpreter = new SqlContentQueryStatementInterpreter(queryStatement, queryString);
queryExpression.AppendFormat(" AND {0}", statementInterpreter.QueryExpression);
foreach (var item in statementInterpreter.Parameters)
{
dbCommand.CreateParameter(item.Key, GetDbType(item.Value), GetValue(item.Value));
}
}
return queryStatement;
}
private static object GetValue(object value)
{
if (value is DateTime)
{
return ((DateTime)value).ToGlobalizedDateTimeString();
}
if (value.GetType().IsNumericalType())
{
NumberFormatInfo en_us = new CultureInfo("en-us", false).NumberFormat;
return ((IFormattable)value).ToString("", en_us);
}
return value;
}
/// <summary>
/// Gets the type of the db. for SQLite Guid
/// </summary>
/// <param name="type">The type.</param>
/// <returns></returns>
private static DbType GetDbType(object value)
{
if (value is System.Guid)
{
return DbType.Guid;
}
return DbType.String;
}
public static IDictionary<string, object> ToDictionary(IDataReader dataReader)
{
IDictionary<string, object> dic = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
for (int i = 0; i < dataReader.FieldCount; i++)
{
var name = dataReader.GetName(i);
var value = dataReader.GetValue(i);
if (name.Equals("ContentId", StringComparison.InvariantCultureIgnoreCase))
{
value = Convert.ToInt32(value);
}
dic.Add(name, value);
}
return dic;
}
}
}
|