using System; using System.Data; using System.Reflection; using System.Diagnostics; using MySql; using MySql.Data; using MySql.Data.MySqlClient; namespace WmData { /// /// This class is like the handy assistent of the data adapter class /// it creates non existent tables in the MySql database. /// /// Created 19th of May 2006 /// public class WmDataBaseCreator { public WmDataBaseCreator(){} /// /// Checks if a given table is already present in the database /// /// True if exists public static bool isTableExistent(string tableName,WmDataBaseCredentials wmDataBaseCredentials){ bool exists = false; string query = "show tables from " + wmDataBaseCredentials.Catalog; MySqlConnection connection = new MySqlConnection(wmDataBaseCredentials.getConnectionString()); MySqlCommand showTableCommand = new MySqlCommand(query,connection ); try{ connection.Open(); MySqlDataReader dataReader; dataReader = showTableCommand.ExecuteReader(); while(dataReader.Read()){ string dBTableName = (string) dataReader[0]; if(dBTableName.Equals(tableName)){ exists = true; break; } } }catch(Exception error){ Trace.WriteLine("WmDataBaseCreator: While attempting to find out if a table exits, something went wrong: "+error.Message); }finally{ connection.Close(); } return exists; } /// /// Creates a table in the database for the given objecttype /// /// ObjectType to create a table for. public static void createTable(Type objectType, WmDataBaseCredentials dataBaseCredentials) { MySqlConnection connection = new MySqlConnection(dataBaseCredentials.getConnectionString()); string tableName = objectType.Name.ToLower(); // it would be neater if this was a static call to data.getTableName() string sqlCreateTable = "CREATE TABLE `"+tableName+"` ("; foreach(PropertyInfo property in objectType.GetProperties()){ if(WmDataTools.checkDataNeed(property.PropertyType)){ sqlCreateTable += "`"+property.Name.ToLower()+"` "+getMySqlDataType(property)+ ","; } } sqlCreateTable += "PRIMARY KEY(`id`) ) ENGINE=InnoDB;"; MySqlCommand tableCommand = new MySqlCommand(sqlCreateTable,connection); try{ connection.Open(); tableCommand.ExecuteNonQuery(); Trace.WriteLine("WmDataBaseCreator: Ooh lord, I am soo good, created table "+tableName); }catch(Exception error){ throw new Exception("WmDataBaseCreator: Something went wrong while creating table "+tableName+ ". "+error.Message+" "+Environment.NewLine+Environment.NewLine+" "+sqlCreateTable); }finally{ tableCommand.Connection.Close(); connection.Close(); } } /// /// Returns a DataTable that matches the structure of the SQL table. /// public static DataTable getDataTable(Type objectType, WmDataBaseCredentials databaseCredentials) { DataTable returnTable = null; MySqlConnection connection = new MySqlConnection(databaseCredentials.getConnectionString()); string tableName = objectType.Name.ToLower(); // it would be neater if this was a static call to data.getTableName() string sqlCommand = "SELECT * FROM " + databaseCredentials.Catalog + "." + tableName + " LIMIT 0"; MySqlCommand command = new MySqlCommand(sqlCommand, connection); try { connection.Open(); MySqlDataReader reader = command.ExecuteReader(); DataTable databaseTable = new DataTable(); databaseTable.Load(reader); foreach (DataColumn dataColumn in databaseTable.Columns) { if (dataColumn.MaxLength == 0 && dataColumn.DataType.Equals(typeof(string))) { dataColumn.MaxLength = -1; // this is a MySQL .NET bug // Trace.WriteLine("WmDataBaseCreator: Circumventing MySQL bug"); } } returnTable = databaseTable.Clone(); DataColumn[] tableKeys = new DataColumn[1]; tableKeys[0] = returnTable.Columns["id"]; returnTable.PrimaryKey = tableKeys; } catch (Exception error) { Trace.WriteLine("WmDataBaseCreator: While retrieving DataTable from database backend, something went wrong: " + error.Message); } finally { connection.Close(); } return returnTable; } protected static string getMySqlDataType(PropertyInfo property){ Type propType = property.PropertyType; // First step is to find out what kind of datatype where dealing with: if(propType.Equals(typeof(int))){ // Integer if(property.Name.ToLower().Equals("id")){ return "INTEGER NOT NULL DEFAULT 0"; } return "INTEGER"; }else if(propType.Equals(typeof(double))){ // double return "DOUBLE"; }else if(propType.Equals(typeof(long))){ // long return "BIGINT"; }else if(propType.Equals(typeof(bool))){ // bool return "BOOLEAN"; }else if(propType.Equals(typeof(DateTime))){ // DateTime return "DATETIME"; }else if(propType.Equals(typeof(string))){ // Some kind of string if(property.Name.ToLower().Equals("description") || property.Name.ToLower().Equals("body") || property.Name.ToLower().Equals("ordercontent")|| property.Name.ToLower().Equals("legacyordercontent")|| property.Name.ToLower().Equals("cssstylestring") || property.Name.ToLower().Equals("headerhtml")|| property.Name.ToLower().Equals("rightcolumnhtml")|| property.Name.ToLower().Equals("footerhtml") || property.Name.ToLower().Equals("customernumber")|| property.Name.ToLower().Equals("companyname")|| property.Name.ToLower().Equals("street")|| property.Name.ToLower().Equals("housenumber")|| property.Name.ToLower().Equals("housenumberaddition")|| property.Name.ToLower().Equals("postalcode")|| property.Name.ToLower().Equals("city")|| property.Name.ToLower().Equals("country")|| property.Name.ToLower().Equals("phone1")|| property.Name.ToLower().Equals("phone2")|| property.Name.ToLower().Equals("fax")|| property.Name.ToLower().Equals("email")|| property.Name.ToLower().Equals("extramessage")|| property.Name.ToLower().Equals("longtext") || property.Name.ToLower().Equals("shorttext") || property.Name.ToLower().Equals("submitterinfo")|| property.Name.ToLower().Equals("specification") || property.Name.ToLower().Equals("billtext") || property.Name.ToLower().Equals("introductiontext") || property.Name.ToLower().Equals("detailtext") || property.Name.ToLower().Equals("customheading") || property.Name.ToLower().Equals("customheader") || property.Name.ToLower().Equals("column1text") || property.Name.ToLower().Equals("column2text") || property.Name.ToLower().Equals("internalnote") || property.Name.ToLower().Equals("propertyvalue") || property.Name.ToLower().StartsWith("str") || (property.Name.ToLower().IndexOf("text") != -1) || (property.Name.ToLower().IndexOf("body") != -1) || (property.Name.ToLower().IndexOf("description") != -1) || (property.Name.ToLower().IndexOf("note") != -1) || (property.Name.ToLower().IndexOf("specification") != -1) ) { // Assume that this kind of string will need some space in DB // LONGTEXT silles voes plets :) return "TEXT"; } else if (property.Name.ToLower().Equals("namevaluequerystring")) { return "LONGTEXT"; } else { // Assume this is a normal string. Give it a VARCHAR space of max 1000 chars. return "VARCHAR(1000)"; } } return "NULL"; // Will surely cause a nice exception... } } }