/// <summary> /// Register Data Object Type if not already Registered /// </summary> /// <param name="dataObjectType">DataObject Type</param> public override void RegisterDataObject(Type dataObjectType) { var tableName = AttributesUtils.GetTableOrViewName(dataObjectType); var isView = AttributesUtils.GetViewName(dataObjectType) != null; var viewAs = AttributesUtils.GetViewAs(dataObjectType); DataTableHandler existingHandler; if (TableDatasets.TryGetValue(tableName, out existingHandler)) { if (dataObjectType != existingHandler.ObjectType) { throw new DatabaseException(string.Format("Table Handler Duplicate for Type: {2}, Table Name '{0}' Already Registered with Type : {1}", tableName, existingHandler.ObjectType, dataObjectType)); } return; } var dataTableHandler = new DataTableHandler(dataObjectType); try { if (isView) { if (!string.IsNullOrEmpty(viewAs)) { ExecuteNonQueryImpl(string.Format("DROP VIEW IF EXISTS `{0}`", tableName)); ExecuteNonQueryImpl(string.Format("CREATE VIEW `{0}` AS {1}", tableName, string.Format(viewAs, string.Format("`{0}`", AttributesUtils.GetTableName(dataObjectType))))); } } else { CheckOrCreateTableImpl(dataTableHandler); } lock (Lock) { TableDatasets.Add(tableName, dataTableHandler); } // Init PreCache if (dataTableHandler.UsesPreCaching) { var primary = dataTableHandler.PrimaryKeys.Single(); var objects = MultipleSelectObjectsImpl(dataTableHandler, new [] { WhereClause.Empty }).First(); foreach (var obj in objects) { dataTableHandler.SetPreCachedObject(primary.GetValue(obj), obj); } } } catch (Exception e) { if (log.IsErrorEnabled) { log.ErrorFormat("RegisterDataObject: Error While Registering Table \"{0}\"\n{1}", tableName, e); } } }
/// <summary> /// Selects object from the db and updates or adds entry in the pre-cache /// </summary> /// <param name="objectType"></param> /// <param name="key"></param> public bool UpdateInCache <TObject>(object key) where TObject : DataObject { MemberInfo[] members = typeof(TObject).GetMembers(); var ret = (TObject)Activator.CreateInstance(typeof(TObject)); string tableName = ret.TableName; DataTableHandler dth = TableDatasets[tableName]; string whereClause = null; if (!dth.UsesPreCaching || key == null) { return(false); } // Escape PK value key = Escape(key.ToString()); for (int i = 0; i < members.Length; i++) { object[] keyAttrib = members[i].GetCustomAttributes(typeof(PrimaryKey), true); if (keyAttrib.Length > 0) { whereClause = "`" + members[i].Name + "` = '" + key + "'"; break; } } if (whereClause == null) { whereClause = "`" + ret.TableName + "_ID` = '" + key + "'"; } var objs = SelectObjects <TObject>(whereClause); if (objs.Count > 0) { dth.SetPreCachedObject(key, objs[0]); return(true); } return(false); }