using System;
using System.Collections.Generic;
using System.Text;
namespace Apewer.Source
{
/// ORM 帮助程序。
public static class OrmHelper
{
private static List Convert(List input) where T : IRecord
{
if (input == null) return null;
var output = new List(input.Count);
foreach (var record in input)
{
if (record == null) continue;
var t = (T)record;
output.Add(t);
}
return output;
}
private static Result Convert(Result input) where T : IRecord
{
if (input == null) return null;
var result = new Result();
result.Code = input.Code;
result.Exception = input.Exception;
result.Message = input.Message;
if (input.HasEntity) result.Entity = (T)input.Entity;
return result;
}
private static Result> Convert(Result> input) where T : IRecord
{
if (input == null) return null;
var result = new Result>();
result.Code = input.Code;
result.Exception = input.Exception;
result.Message = input.Message;
result.Entity = Convert(input.Entity);
return result;
}
/// 查询记录。
/// 数据库对象。
/// 记录模型。
/// SQL 语句。
public static Result> Query(IDatabase database, Type model, string sql)
{
if (database == null) return Result>.Error("数据库无效。");
if (model == null) return Result>.Error("模型类型无效。");
if (string.IsNullOrEmpty(sql)) return Result>.Error("SQL 语句无效。");
using (var query = database.Query(sql) as Query)
{
if (query == null) return Result>.Error("查询实例无效。");
if (query.Exception != null) return Result>.Error(query.Exception);
try
{
var list = query.Fill(model);
return new Result>(list);
}
catch (Exception ex)
{
return Result>.Error(ex);
}
}
}
/// 查询记录。
/// 记录模型。
/// 数据库对象。
/// SQL 语句。
public static Result> Query(IDatabase database, string sql) where T : IRecord
{
return Convert(Query(database, typeof(T), sql));
}
/// 查询记录。
/// 数据库对象。
/// 记录模型。
/// 生成 SQL 语句的函数,传入参数为表名。
public static Result> Query(IDatabase database, Type model, Func sqlGetter)
{
if (sqlGetter == null) return Result>.Error("SQL 语句获取函数无效。");
try
{
var tableName = TableStructure.ParseModel(model).Table;
if (string.IsNullOrEmpty(tableName)) return Result>.Error("表名无效。");
return Query(database, model, sqlGetter(tableName));
}
catch (Exception ex)
{
return Result>.Error(ex);
}
}
/// 查询记录。
/// 记录模型。
/// 数据库对象。
/// 生成 SQL 语句的函数,传入参数为表名。
public static Result> Query(IDatabase database, Func sqlGetter) where T : IRecord
{
return Convert(Query(database, typeof(T), sqlGetter));
}
/// 获取具有指定主键的记录。
/// 数据库对象。
/// 记录模型。
/// 主键。
/// 生成 SQL 语句的函数,传入参数为表名和主键值。
public static Result Get(IDatabase database, Type model, string key, Func sqlGetter)
{
if (sqlGetter == null) return Result.Error("SQL 语句获取函数无效。");
var safetyKey = TextUtility.SafeKey(key);
if (string.IsNullOrEmpty(safetyKey)) return Result.Error("主键无效。");
string tableName;
try
{
tableName = TableStructure.ParseModel(model).Table;
if (string.IsNullOrEmpty(tableName)) return Result.Error("表名无效。");
}
catch (Exception ex)
{
return new Result(ex);
}
var sql = sqlGetter(tableName, safetyKey);
var list = Query(database, model, sql);
var result = new Result();
result.Code = list.Code;
result.Exception = list.Exception;
result.Message = list.Message;
result.Entity = list.Entity.SafeFirst();
return result;
}
/// 获取具有指定主键的记录。
/// 记录模型。
/// 数据库对象。
/// 主键。
/// 生成 SQL 语句的函数,传入参数为表名和主键值。
public static Result Get(IDatabase database, string key, Func sqlGetter) where T : IRecord
{
return Convert(Get(database, typeof(T), key, sqlGetter));
}
/// 获取主键。
/// 数据库对象。
/// 记录模型。
/// 生成 SQL 语句的函数,传入参数为表名。
public static Result> Keys(IDatabase database, Type model, Func sqlGetter)
{
if (database == null) return Result>.Error("数据库无效。");
if (model == null) return Result>.Error("模型类型无效。");
if (sqlGetter == null) return Result>.Error("SQL 语句获取函数无效。");
var tableStructure = null as TableStructure;
try
{
tableStructure = TableStructure.ParseModel(model);
}
catch (Exception ex)
{
return Result>.Error(ex);
}
var tableName = tableStructure.Table;
if (string.IsNullOrEmpty(tableName)) return Result>.Error("表名无效。");
// var keyName = null as string;
// foreach (var column in tableStructure.Columns)
// {
// if (column.Key == "Key")
// {
// keyName = column.Value.Field;
// break;
// }
// }
// if (string.IsNullOrEmpty(keyName)) return Result>.Error("主键字段无效。");
// var sql = sqlGetter(tableName, keyName);
var sql = sqlGetter(tableName);
var query = null as IQuery;
try
{
query = database.Query(sql);
if (query == null) return Result>.Error("查询实例无效。");
var list = new List(query.Rows);
for (var r = 0; r < query.Rows; r++)
{
var key = TextUtility.SafeKey(query.Text(r));
if (string.IsNullOrEmpty(key)) continue;
list.Add(key);
}
query.Dispose();
list.Capacity = list.Count;
return new Result>(list);
}
catch (Exception ex)
{
RuntimeUtility.Dispose(query);
return Result>.Error(ex);
}
}
/// 获取主键。
/// 记录模型。
/// 数据库对象。
/// 生成 SQL 语句的函数,传入参数为表名。
public static Result> Keys(IDatabase database, Func sqlGetter) where T : IRecord
{
return Keys(database, typeof(T), sqlGetter);
}
}
}