using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Collections.Generic; using MySql.Data.MySqlClient; using DBToolControls; using System.IO; namespace DBAdminService { /// /// Zusammenfassungsbeschreibung für MySqlService /// [WebService(Namespace = "http://tempuri.org")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // Um das Aufrufen dieses Webdiensts aus einem Skript mit ASP.NET-AJAX zuzulassen, heben Sie die Auskommentierung der folgenden Zeile auf. // [System.Web.Script.Services.ScriptService] public class MySqlService : System.Web.Services.WebService { public static readonly string TransportEncryptionKey = @"b7困!#vS?難\n.어u"; public List queryResponse; public static string configurationFilePath = @"configuration.conf"; private DBAdminServiceDBCreationReturnValue generateDbFiles(String host, String user, String pw, String db, String customerName) { DBAdminServiceDBCreationReturnValue result = new DBAdminServiceDBCreationReturnValue(); try { FileStream fs = File.OpenRead(Server.MapPath(configurationFilePath)); StreamReader sr = new StreamReader(fs); StreamWriter sw; String conf = sr.ReadToEnd(), tmp, id=null; String DBcnfTmp = null, BakCnf = null, targetFolder = null, targetFolder2 = null; int pos, epos; if (conf != "" && conf != null) { pos = conf.IndexOf(""); epos = conf.IndexOf(""); if (pos != -1 && epos != -1) { DBcnfTmp = conf.Substring(pos + "".Length, epos - (pos + "".Length)); result.DBcnfTmp = DBcnfTmp; } pos = conf.IndexOf(""); epos = conf.IndexOf(""); if (pos != -1 && epos != -1) { BakCnf = conf.Substring(pos + "".Length, epos - (pos + "".Length)); result.BakCnf = BakCnf; } pos = conf.IndexOf(""); epos = conf.IndexOf(""); if (pos != -1 && epos != -1) { targetFolder = conf.Substring(pos + "".Length, epos - (pos + "".Length)); result.TargetFolder = targetFolder; } pos = conf.IndexOf(""); epos = conf.IndexOf(""); if (pos != -1 && epos != -1) { targetFolder2 = conf.Substring(pos + "".Length, epos - (pos + "".Length)); result.TargetFolder2 = targetFolder2; } // Create Dbcnf File try { fs = File.OpenRead(DBcnfTmp); sr = new StreamReader(fs); tmp = sr.ReadToEnd(); id = db; pos = tmp.IndexOf(""); tmp = tmp.Remove(tmp.IndexOf(""), "".Length); tmp = tmp.Insert(pos, pw); pos = tmp.IndexOf(""); tmp = tmp.Remove(tmp.IndexOf(""), "".Length); tmp = tmp.Insert(pos, user); pos = tmp.IndexOf(""); tmp = tmp.Remove(tmp.IndexOf(""), "".Length); tmp = tmp.Insert(pos, db); fs = File.Create(targetFolder+"\\"+db+".config"); sw = new StreamWriter(fs); sw.WriteLine(tmp); sw.Flush(); sw.Close(); fs.Close(); result.DBCnfFileCreated = true; } catch { result.BakFileCreated = false; } try { fs = File.OpenRead(BakCnf); sr = new StreamReader(fs); tmp = sr.ReadToEnd(); id = db; pos = tmp.IndexOf(""); tmp = tmp.Remove(tmp.IndexOf(""), "".Length); tmp = tmp.Insert(pos, customerName); pos = tmp.IndexOf(""); tmp = tmp.Remove(tmp.IndexOf(""), "".Length); tmp = tmp.Insert(pos, db); fs = File.Create(targetFolder2 + "\\" + db + ".db2mail"); sw = new StreamWriter(fs); sw.WriteLine(tmp); sw.Flush(); sw.Close(); fs.Close(); result.BakFileCreated = true; } catch { result.BakFileCreated = false; } } result.Success = true; return result; } catch { result.Success = false; throw new Exception("Could not open configuration file"); return result; } } private String findDatabaseName(String query) { String id = query.Substring(query.IndexOf("CREATE DATABASE `") + "CREATE DATABASE `".Length, 10); return id; } [WebMethod] public DBAdminServiceReturnValue createDatabase(string userName, string pw, string port, string query, string customerName) { DBAdminServiceReturnValue ret = new DBAdminServiceReturnValue(); DBAdminServiceDBCreationReturnValue result = new DBAdminServiceDBCreationReturnValue(); string connStr = String.Format("server=localhost;user id={0}; password={1}; port={2}; database=mysql; pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(port)); MySqlConnection conn = new MySqlConnection(connStr); MySqlCommand com = new MySqlCommand(Decrypt(query), conn); try { conn.Open(); com.ExecuteNonQuery(); ret.WasSuccessful = true; result = this.generateDbFiles("localhost", Decrypt(userName), Decrypt(pw), this.findDatabaseName(Decrypt(query)), Decrypt(customerName)); if (result.BakFileCreated == false) throw new Exception("Exception BakFileCreated"); if (result.DBCnfFileCreated == false) throw new Exception("Exception DBCnfFileCreated"); } catch (Exception e) { ret.WasSuccessful = false; if(e.Message.Equals("Exception BakFileCreated")) ret.ErrorMessage = String.Format("Konnte db2mail-Datei \"{0}\" nicht in \"{1}\" anlegen", result.BakCnf, result.TargetFolder2); else if(e.Message.Equals("Exception DBCnfFileCreated")) ret.ErrorMessage = String.Format("Konnte Datenbankkonfigurationsdatei \"{0}\" nicht in \"{1}\" anlegen", result.DBcnfTmp, result.TargetFolder); else ret.ErrorMessage = String.Format("Ausführen des SQL-Scriptes fehlgeschlagen. {0} ({1})", e.Message, e.GetType().ToString()); } return ret; } [WebMethod] public string[] GetDatabaseList(string userName, string pw, string port) { string connStr = String.Format("server=localhost;user id={0}; password={1}; port={2}; database=mysql; pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(port)); List dbList = new List(); using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand cmd = new MySqlCommand("SHOW DATABASES", conn)) { try { conn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) dbList.Add(reader.GetString(0)); } catch (Exception e) { dbList.Add(String.Format("Auslesen der Datenbanken fehlgeschlagen. {0} ({1})", e.Message, e.GetType().ToString())); } } } return dbList.ToArray(); } [WebMethod] public DBAdminServiceReturnValue ExecuteUpdateOnDatabase(string userName, string pw, string port, string db, string query) { string connStr = String.Format("server=localhost;user id={0}; password={1}; database={2}; port={3}; pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(db), Decrypt(port)); DBAdminServiceReturnValue result = new DBAdminServiceReturnValue(); using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand command = new MySqlCommand(Decrypt(query), conn)) { MySqlDataReader sqlReadData; try { conn.Open(); //command.ExecuteNonQuery(); sqlReadData = command.ExecuteReader(); this.queryResponse = new List(); while(sqlReadData.Read()) { string tmp = ""; for (int i = 0; i < sqlReadData.FieldCount; i++) { tmp += sqlReadData.GetName(i) + ": " + sqlReadData.GetValue(i).ToString() + "\n" ; } tmp += "-------\n"; this.queryResponse.Add(tmp); result.QueryAnswer = queryResponse; } result.WasSuccessful = true; } catch (Exception e) { result.WasSuccessful = false; result.ErrorMessage = Encrypt(String.Format("{0} ({1})", e.Message, e.GetType().ToString())); result.QueryAnswer = null; } } } return result; } [WebMethod] public DBAdminServiceReturnValue ExecuteHiddenUpdateOnDatabase(string userName, string pw, string db, string port, string query) { string connStr = String.Format("server=localhost;user id={0}; password={1}; database={2}; port={3};pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(db), Decrypt(port)); DBAdminServiceReturnValue result = new DBAdminServiceReturnValue(); using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand command = new MySqlCommand(Decrypt(query), conn)) { MySqlDataReader sqlReadData; try { conn.Open(); sqlReadData = command.ExecuteReader(); this.queryResponse = new List(); while (sqlReadData.Read()) { string tmp = ""; for (int i = 0; i < sqlReadData.FieldCount; i++) { tmp += sqlReadData.GetValue(i).ToString() + "\n"; } this.queryResponse.Add(tmp); result.QueryAnswer = queryResponse; } result.WasSuccessful = true; } catch (Exception e) { result.WasSuccessful = false; result.ErrorMessage = Encrypt(String.Format("{0} ({1})", e.Message, e.GetType().ToString())); } } } return result; } public List QueryResponse { get { return this.queryResponse; } private set { this.queryResponse = value; } } [WebMethod] public DBAdminServiceReturnValue DatabaseIsReachable(string userName, string pw, string db, string port) { string connStr = String.Format("server=localhost;user id={0}; password={1}; database={2}; port={3}; pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(db), Decrypt(port)); DBAdminServiceReturnValue result = new DBAdminServiceReturnValue(); using (MySqlConnection conn = new MySqlConnection(connStr)) { try { conn.Open(); result.WasSuccessful = true; } catch (Exception e) { result.WasSuccessful = false; result.ErrorMessage = Encrypt(e.Message + " (" + e.GetType().ToString() + ")"); } } return result; } [WebMethod] public string[] GetTables(string userName, string pw, string db, string port) { string connStr = String.Format("server=localhost;user id={0}; password={1}; database={2}; port={3}; pooling=false", Decrypt(userName), Decrypt(pw), Decrypt(db), Decrypt(port)); List tableList = new List(); using (MySqlConnection conn = new MySqlConnection(connStr)) { using (MySqlCommand cmd = new MySqlCommand("SHOW TABLES", conn)) { try { conn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) tableList.Add(Encrypt(reader.GetString(0))); } catch (Exception e) { tableList.Add(Encrypt(String.Format("Auslesen der Tabellen fehlgeschlagen. {0} ({1})", e.Message, e.GetType().ToString()))); } } } return tableList.ToArray(); } [WebMethod] public string CreateNewTenantID() { // TODO implement // TODO implement create new Database System.Threading.Thread.Sleep(500); return "0000000000"; } private static string Encrypt(string s) { return EncryptionHelper.EncryptString(TransportEncryptionKey, s); } private static string Decrypt(string s) { return EncryptionHelper.DecryptString(TransportEncryptionKey, s); } } public class DBAdminServiceReturnValue { bool wasSuccessful = true; string errorMessage = ""; private List queryAnswer = new List(); public List QueryAnswer { get { return this.queryAnswer; } set { this.queryAnswer = value; } } public bool WasSuccessful { get { return wasSuccessful; } set { wasSuccessful = value; } } public string ErrorMessage { get { return errorMessage; } set { errorMessage = value; } } } public class DBAdminServiceDBCreationReturnValue { private bool success; public bool Success { get { return success; } set { success = value; } } public bool DBCnfFileCreated { get; set; } public bool BakFileCreated { get; set; } public String TargetFolder { get; set; } public String TargetFolder2 { get; set; } public String BakCnf { set; get; } public String DBcnfTmp { set; get; } } }