@ -27,8 +27,8 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
// Check if given class is marked as dbObject
// Check if given class is marked as dbObject
if ( ! ( classType . GetCustomAttribute ( typeof ( DbObject ) , true ) is DbObject dbObject ) ) throw new InvalidOperationException ( $"Cannot init '{classType.Name}'. Missing Attribute 'DbObject'" ) ;
if ( ! ( classType . GetCustomAttribute ( typeof ( DbObject ) , true ) is DbObject dbObject ) ) throw new InvalidOperationException ( $"Cannot init '{classType.Name}'. Missing Attribute 'DbObject'" ) ;
dbObject . Init ( classType ) ; // Init dbObject
initiatedClassTypes . Add ( classType , dbObject ) ; // Set it to the list
initiatedClassTypes . Add ( classType , dbObject ) ; // Set it to the list
dbObject . Init ( classType ) ; // Init dbObject
cachedDbObject = dbObject ;
cachedDbObject = dbObject ;
}
}
@ -36,7 +36,6 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
return cachedDbObject ;
return cachedDbObject ;
}
}
/// <summary>
/// <summary>
/// Fills an given dbObject with given data<para/>
/// Fills an given dbObject with given data<para/>
/// Data-attribute-names and class-fieldNames have to match! (non case-sensitive)
/// Data-attribute-names and class-fieldNames have to match! (non case-sensitive)
@ -44,6 +43,21 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="data">The data</param>
/// <param name="data">The data</param>
/// <param name="key">Key-name of data</param>
public static void FillObject < T > ( T classObject , string key , object data )
{
Dictionary < string , object > dicData = new Dictionary < string , object > ( ) ;
dicData . Add ( key , data ) ;
FillObject < T > ( classObject , dicData ) ;
}
/// <summary>
/// Fills an given dbObject with given data<para/>
/// Data-attribute-names and class-fieldNames have to match! (non case-sensitive)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="data">The data</param>
/// <param name="key">Key-name of data</param>
public static void FillObject < T > ( T classObject , Dictionary < string , object > data )
public static void FillObject < T > ( T classObject , Dictionary < string , object > data )
{
{
Type classType = classObject . GetType ( ) ;
Type classType = classObject . GetType ( ) ;
@ -54,6 +68,8 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
// Iterate through data
// Iterate through data
foreach ( KeyValuePair < string , object > data_keySet in data )
foreach ( KeyValuePair < string , object > data_keySet in data )
{
{
bool dataMatchFound = false ;
// Interate through class-fields
// Interate through class-fields
foreach ( BaseAttribute baseAttribute in dbObject . baseAttributes )
foreach ( BaseAttribute baseAttribute in dbObject . baseAttributes )
{
{
@ -69,12 +85,17 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
if ( baseAttribute . _attributeName . ToLower ( ) = = data_keySet . Key . ToLower ( ) )
if ( baseAttribute . _attributeName . ToLower ( ) = = data_keySet . Key . ToLower ( ) )
{
{
object value = data_keySet . Value ;
object value = data_keySet . Value ;
//if (baseAttribute.parentField.FieldType == typeof(Guid)) value = new Guid((string)value); // If its a guid, i need to convert
if ( ! ( value is DBNull ) ) // Check if value is empty
{
baseAttribute . parentField . SetValue ( classObject , value ) ;
baseAttribute . parentField . SetValue ( classObject , value ) ;
}
dataMatchFound = true ;
break ;
break ;
}
}
}
}
if ( ! dataMatchFound ) throw new InvalidOperationException ( $"Attribute '{data_keySet.Key}' has no match in object '{classObject.GetType().Name}'" ) ;
}
}
}
}
@ -83,8 +104,11 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// Gets an dbObject by primaryKey/s
/// Gets an dbObject by primaryKey/s
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classType">The classType (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param>
/// <param name="primaryKeyName">Name of the primaryKey</param>
/// <param name="primaryKeyValue">Value of the primaryKey</param>
/// <param name="primaryKeyData">KeyData of multiple primaryKeys</param>
/// <param name="queryExecutor">Function to handle query-calls</param>
public static T GetByPrimaryKey < T > ( Type classType , object primaryKeyValue , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
public static T GetByPrimaryKey < T > ( Type classType , object primaryKeyValue , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
// Read dbObject-attribute
// Read dbObject-attribute
@ -95,6 +119,15 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
return GetByPrimaryKey < T > ( classType , dbObject . primaryKeyAttributes [ 0 ] . _attributeName , primaryKeyValue , queryExecutor ) ;
return GetByPrimaryKey < T > ( classType , dbObject . primaryKeyAttributes [ 0 ] . _attributeName , primaryKeyValue , queryExecutor ) ;
}
}
/// <summary>
/// Gets an dbObject by primaryKey/s
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classType">The classType (marked with Db-attributes)</param>
/// <param name="primaryKeyName">Name of the primaryKey</param>
/// <param name="primaryKeyValue">Value of the primaryKey</param>
/// <param name="primaryKeyData">KeyData of multiple primaryKeys</param>
/// <param name="queryExecutor">Function to handle query-calls</param>
public static T GetByPrimaryKey < T > ( Type classType , string primaryKeyName , object primaryKeyValue , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
public static T GetByPrimaryKey < T > ( Type classType , string primaryKeyName , object primaryKeyValue , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
Dictionary < string , object > primaryKeyData = new Dictionary < string , object > ( ) { } ;
Dictionary < string , object > primaryKeyData = new Dictionary < string , object > ( ) { } ;
@ -102,16 +135,25 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
return GetByPrimaryKey < T > ( classType , primaryKeyData , queryExecutor ) ;
return GetByPrimaryKey < T > ( classType , primaryKeyData , queryExecutor ) ;
}
}
/// <summary>
/// Gets an dbObject by primaryKey/s
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="classType">The classType (marked with Db-attributes)</param>
/// <param name="primaryKeyName">Name of the primaryKey</param>
/// <param name="primaryKeyValue">Value of the primaryKey</param>
/// <param name="primaryKeyData">KeyData of multiple primaryKeys</param>
/// <param name="queryExecutor">Function to handle query-calls</param>
public static T GetByPrimaryKey < T > ( Type classType , Dictionary < string , object > primaryKeyData , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
public static T GetByPrimaryKey < T > ( Type classType , Dictionary < string , object > primaryKeyData , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
// Create new empty object
T obj = new T ( ) ;
// Read dbObject-attribute
// Read dbObject-attribute
DbObject dbObject = ClassAction . Init ( classType ) ;
DbObject dbObject = ClassAction . Init ( classType ) ;
if ( dbObject . primaryKeyAttributes . Count < 1 ) throw new InvalidOperationException ( $"No primaryKey found in '{classType.Name}'" ) ;
if ( dbObject . primaryKeyAttributes . Count < 1 ) throw new InvalidOperationException ( $"No primaryKey found in '{classType.Name}'" ) ;
// Create new empty object
T obj = ( T ) dbObject . parentCInfo . Invoke ( null ) ;
// iterate thru them to check and fill object
// iterate thru them to check and fill object
foreach ( DbPrimaryKey primaryKeyAtt in dbObject . primaryKeyAttributes )
foreach ( DbPrimaryKey primaryKeyAtt in dbObject . primaryKeyAttributes )
{
{
@ -154,7 +196,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
public static List < T > GetList < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
public static List < T > GetList < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
// Read dbObject - attribute
// Read dbObject - attribute
@ -175,18 +217,21 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
}
}
/// <summary>
/// <summary>
/// Gets a n dbObject by custom where-clause
/// Gets a list of dbObjects by attribute/s
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classType">Type of class</param>
/// <param name="whereClause">Custom where-clause params attached to query (SELECT * FROM tableName WHERE whereClause)</param>
/// <param name="fields">class-fields for select</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param>
/// <param name="queryExecutor">Function to handle query-calls</param>
public static List < T > GetListWithWhere < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor , params object [ ] whereClause ) where T : new ( )
/// <returns>List of dbObjects</returns>
public static List < T > GetListByAttribute < T > ( Type classType , Dictionary < string , object > fields , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
// Read dbObject-attribute
// Read dbObject-attribute
DbObject dbObject = ClassAction . Init ( classType ) ;
DbObject dbObject = ClassAction . Init ( classType ) ;
string query = QueryBuilder . SelectWithWhere ( dbObject . _tableName , whereClause ) ; // Generate query
Function . ConvertAttributeToDbAttributes ( classType , fields ) ;
string query = QueryBuilder . SelectByAttribute ( dbObject . _tableName , fields ) ; // Generate query
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < T > objs = new List < T > ( ) { } ;
List < T > objs = new List < T > ( ) { } ;
@ -201,18 +246,18 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
}
}
/// <summary>
/// <summary>
/// Gets an dbObject by full query
/// Gets an dbObject by custom where-clause
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name=" customQuery">Custom sql-query </param>
/// <param name=" whereClause">Custom where-clause params attached to query (SELECT * FROM tableName WHERE whereClause) </param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
public static List < T > GetListWith Query < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor , params object [ ] customQuery ) where T : new ( )
public static List < T > GetListWith Where < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor , params object [ ] whereClause ) where T : new ( )
{
{
// Read dbObject - attribute
// Read dbObject - attribute
DbObject dbObject = ClassAction . Init ( classType ) ;
DbObject dbObject = ClassAction . Init ( classType ) ;
string query = QueryBuilder . BuildQuery( customQuery ) ;
string query = QueryBuilder . SelectWithWhere( dbObject . _tableName , whereClause ) ; // Generate query
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < T > objs = new List < T > ( ) { } ;
List < T > objs = new List < T > ( ) { } ;
@ -226,23 +271,19 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
return objs ; // Return list
return objs ; // Return list
}
}
/// <summary>
/// <summary>
/// Gets a list of dbObjects by attribute/s
/// Gets a n dbObject by full query
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classType">Type of class</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="fields">class-fields for select</param>
/// <param name="customQuery">Custom sql-query</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue]</param>
/// <param name="queryExecutor">Function to handle query-calls</param>
/// <returns>List of dbObjects</returns>
public static List < T > GetListWithQuery < T > ( Type classType , Func < string , List < Dictionary < string , object > > > queryExecutor , params object [ ] customQuery ) where T : new ( )
public static List < T > GetListByAttribute < T > ( Type classType , Dictionary < string , object > fields , Func < string , List < Dictionary < string , object > > > queryExecutor ) where T : new ( )
{
{
// Read dbObject - attribute
// Read dbObject - attribute
DbObject dbObject = ClassAction . Init ( classType ) ;
DbObject dbObject = ClassAction . Init ( classType ) ;
Function . ConvertAttributeToDbAttributes ( classType , fields ) ;
string query = QueryBuilder . BuildQuery ( customQuery ) ;
string query = QueryBuilder . SelectByAttribute ( dbObject . _tableName , fields ) ; // Generate query
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < Dictionary < string , object > > dataSet = queryExecutor ( query ) ; // Execute
List < T > objs = new List < T > ( ) { } ;
List < T > objs = new List < T > ( ) { } ;
@ -264,7 +305,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
public static void ResolveByPrimaryKey < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , bool throwExceptions = true )
public static void ResolveByPrimaryKey < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , bool throwExceptions = true )
{
{
string query = QueryBuilder . SelectByPrimaryKey ( classObject ) ; // Generate query
string query = QueryBuilder . SelectByPrimaryKey ( classObject ) ; // Generate query
@ -283,7 +324,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
/// <param name="max_depth">Determents how deep resolving will be executed</param>
/// <param name="max_depth">Determents how deep resolving will be executed</param>
public static void ResolveForeignKeys < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 ) where T : new ( )
public static void ResolveForeignKeys < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 ) where T : new ( )
{
{
@ -295,13 +336,14 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
// Resolve foreignObjects
// Resolve foreignObjects
foreach ( DbForeignObject foreignObjectAtt in dbObject . foreignObjectAttributes )
foreach ( DbForeignObject foreignObjectAtt in dbObject . foreignObjectAttributes )
{
{
object foreignKey_value = foreignObjectAtt . foreignKeyAttribute . parentField . GetValue ( classObject ) ;
object foreignObject_value = foreignObjectAtt . parentField . GetValue ( classObject ) ;
object foreignObject_value = foreignObjectAtt . parentField . GetValue ( classObject ) ;
// When its empty, get it & set it
// When key is se t and object i s empty, get it & set it
if ( foreign Object_value = = null )
if ( foreign Key_value ! = null & & foreign Object_value = = null )
{
{
// Resolve it
// Resolve it
foreignObject_value = GetByPrimaryKey < T > ( classType, foreignObjectAtt . foreignKeyAttribute . parentField . GetValue ( classObject ) , queryExecutor ) ;
foreignObject_value = GetByPrimaryKey < T > ( foreignObjectAtt. foreignObjectType , foreignKey_value , queryExecutor ) ;
foreignObjectAtt . parentField . SetValue ( classObject , foreignObject_value ) ; // Set the value
foreignObjectAtt . parentField . SetValue ( classObject , foreignObject_value ) ; // Set the value
// Now scan the just resolved class to be able to set myself
// Now scan the just resolved class to be able to set myself
@ -465,7 +507,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
/// <param name="max_depth">Determents how deep resolving will be executed (if the corresponding foreignKey-object is resolved)</param>
/// <param name="max_depth">Determents how deep resolving will be executed (if the corresponding foreignKey-object is resolved)</param>
public static void Update < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
public static void Update < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
{
{
@ -492,7 +534,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
/// <param name="max_depth">Determents how deep insertion will be executed (if the corresponding foreignKey-object is resolved)</param>
/// <param name="max_depth">Determents how deep insertion will be executed (if the corresponding foreignKey-object is resolved)</param>
public static void Insert < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
public static void Insert < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
{
{
@ -520,7 +562,7 @@ namespace eu.railduction.netcore.dll.Database_Attribute_System
/// </summary>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="classObject">Given object (marked with Db-attributes)</param>
/// <param name="queryExecutor">Function to handle query-calls - Has to return Dictionary[attributeName, attributeValue] </param>
/// <param name="queryExecutor">Function to handle query-calls </param>
/// <param name="max_depth">Determents how deep deletion will be executed (if the corresponding foreignKey-object is resolved)</param>
/// <param name="max_depth">Determents how deep deletion will be executed (if the corresponding foreignKey-object is resolved)</param>
public static void Delete < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
public static void Delete < T > ( T classObject , Func < string , List < Dictionary < string , object > > > queryExecutor , int max_depth = 1 )
{
{