using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
namespace WmData {
///
/// This object is like a cache for the Reflection logic
/// in the Data system. It uses the System.Reflection.Emit namespace;
/// Created 10th of july 2009
///
public class WmIntermediateObject {
protected Type objectType;
protected string name;
protected string tableName;
protected DataTable dataTable;
protected object dataTableLockObject = new object();
protected CreateInstanceHandler creator;
protected List properties;
protected WmIntermediateObjectProperty idProperty;
protected WmDataBaseCredentials databaseCredentials;
public WmIntermediateObject(Type objectType, WmDataBaseCredentials databaseCredentials) {
this.objectType = objectType;
name = objectType.Name;
tableName = WmDataTools.getTableName(objectType);
creator = WmIntermediateObjectTools.GetInstanceCreator(objectType);
this.databaseCredentials = databaseCredentials;
properties = new List();
foreach (PropertyInfo propInfo in objectType.GetProperties()) {
if (WmDataTools.checkDataNeed(propInfo.PropertyType)) {
WmIntermediateObjectProperty property = new WmIntermediateObjectProperty(propInfo);
properties.Add(property);
}
}
}
public int getObjectInstanceId(object objectInstance) {
return (int) IdProperty.Getter(objectInstance);
}
public string Name {
get { return name; }
}
public string TableName {
get { return tableName; }
}
public Type ObjectType {
get { return objectType; }
}
public CreateInstanceHandler Creator {
get { return creator; }
}
public WmIntermediateObjectProperty IdProperty {
get {
if (idProperty == null) {
idProperty = getProperty("Id");
}
return idProperty;
}
}
public List Properties {
get { return properties; }
}
public WmIntermediateObjectProperty getProperty(string propertyName) {
foreach (WmIntermediateObjectProperty property in properties) {
if (property.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)) {
return property;
}
}
return null;
}
public DataTable DataTable{
get {
using (TimedLock.Lock(this.dataTableLockObject)) {
if (dataTable == null && databaseCredentials != null) {
dataTable = WmDataBaseCreator.getDataTable(objectType, databaseCredentials);
return dataTable.Clone();
} else {
if (dataTable != null) {
return dataTable.Clone();
} else {
return null;
}
}
}
}
}
}
public class WmIntermediateObjectProperty {
protected PropertyInfo info;
protected string name;
protected string dataName;
protected Type type;
protected int dataColumnIndex = -1;
protected PropertyGetHandler getter;
protected PropertySetHandler setter;
public WmIntermediateObjectProperty(PropertyInfo propertyInfo) {
this.info = propertyInfo;
this.name = propertyInfo.Name;
this.dataName = propertyInfo.Name.ToLower();
this.type = propertyInfo.PropertyType;
this.getter = WmIntermediateObjectTools.GetPropertyGetter(propertyInfo);
this.setter = WmIntermediateObjectTools.GetPropertySetter(propertyInfo);
}
public int DataColumnIndex {
get { return dataColumnIndex; }
set { dataColumnIndex = value; }
}
public PropertyInfo Info {
get { return info; }
}
public string Name {
get { return name; }
}
public string DataName {
get { return dataName; }
}
public Type Type {
get { return type; }
}
public PropertyGetHandler Getter {
get { return getter; }
}
public PropertySetHandler Setter {
get { return setter; }
}
public object parseValueFromString(string value) {
if (value != null && value.Equals("##NULL##")) {
return null;
} else {
if (type.Equals(typeof(int))) {
return int.Parse(value);
} else if (type.Equals(typeof(double))) {
return double.Parse(value);
} else if (type.Equals(typeof(long))) {
return long.Parse(value);
} else if (type.Equals(typeof(bool))) {
if (value.Equals("0") || value.ToLower().Equals("false")) {
return false;
} else {
return true;
}
} else if (type.Equals(typeof(DateTime))) {
return DateTime.Parse(value);
} else if (type.Equals(typeof(string))) {
return (string)value;
} else {
return value;
}
}
}
}
}