///////////////////////////////////////////////////////////////////////////// // Name: dbserver.cpp // Purpose: Database Server // Author: Daniel Horak // Modified by: // RCS-ID: $Id: dbserver.cc,v 1.3 2003/12/21 22:04:34 horakdan Exp $ // Copyright: (c) Daniel Horak // Licence: GPL ///////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include #endif #include "config.h" #include "xml.h" #include "view.h" #include "dbserver.h" #include "dbsgeneric.h" #include "dbspgsql.h" #include "dbsmysql.h" #include "dbsibase.h" #include "dbsoracle.h" #include "dbsdb2.h" WX_DECLARE_LIST(DBServer, DBServerList); #include WX_DEFINE_LIST(DBServerList); static DBServerList *g_dbserverlist; DBServer::DBServer(DBServerType type, const wxString& name, const wxString& version, const wxString& xslt) : m_type(type), m_name(name), m_version(version), m_xslt(xslt) { m_stylesheet = ParseStyle(m_xslt); } DBServer::~DBServer() { #ifdef HAVE_XSLT_SUPPORT if (m_stylesheet) xsltFreeStylesheet(m_stylesheet); #endif } #ifdef HAVE_XSLT_SUPPORT xsltStylesheetPtr DBServer::ParseStyle(wxString& xslt) { xsltStylesheetPtr res = NULL; #ifdef ENABLE_DEBUG wxLogMessage("DBServer::ParseStyle"); #endif if (! xslt.IsEmpty()) { #ifdef __WXGTK__ xslt.Prepend("/"); xslt.Prepend(PKGDATADIR); #endif #ifdef ENABLE_DEBUG wxLogMessage("DBServer - final xslt=%s", xslt.c_str()); #endif if (wxFileExists(xslt)) { res = xsltParseStylesheetFile((const xmlChar *)xslt.c_str()); } else { #ifdef ENABLE_DEBUG wxLogMessage("DBServer::ParseStyle - style doesn't exist"); #endif } } return res; } #endif bool DBServer::ExportDDL(DataDesignerView *view) { #ifdef ENABLE_DEBUG wxLogMessage("DBServer::ExportDDL"); #endif #ifdef HAVE_XSLT_SUPPORT Transform(view, m_stylesheet); #else wxMessageBox(_("Function is not supported in this build."), _("Warning"), wxOK | wxICON_WARNING); #endif return TRUE; } #ifdef HAVE_XSLT_SUPPORT bool DBServer::Transform(DataDesignerView *view, xsltStylesheetPtr stylesheet) { #ifdef ENABLE_DEBUG wxLogMessage("DBServer::Transform"); #endif wxDocument *doc = view->GetDocument(); xmlDocPtr xmldoc, res; wxString outfile; if (stylesheet == NULL) { wxMessageBox(_("Target SQL server doesn't have defined transformation stylesheet."), _("Warning"), wxOK | wxICON_WARNING); return FALSE; } if (doc->IsModified()) doc->Save(); outfile = wxSaveFileSelector("File with SQL commands", ".sql", "output"); xmldoc = xmlParseFile(doc->GetFilename().c_str()); if (xmldoc == NULL) wxMessageBox(_("Cannot parse input file '") + doc->GetFilename() + _("'."), _("Error"), wxOK | wxICON_ERROR); res = xsltApplyStylesheet(stylesheet, xmldoc, NULL); if (res == NULL) wxMessageBox(_("Cannot transform input file '") + doc->GetFilename() + _("'."), _("Error"), wxOK | wxICON_ERROR); xsltSaveResultToFilename(outfile.c_str(), res, stylesheet, 0); xmlFreeDoc(res); xmlFreeDoc(xmldoc); return TRUE; } #endif void InitServers() { g_dbserverlist = new DBServerList(wxKEY_STRING); g_dbserverlist->Append("Generic", new DBServerGeneric); g_dbserverlist->Append("PostgreSQL", new DBServerPostgreSQL); g_dbserverlist->Append("MySQL", new DBServerMySQL); g_dbserverlist->Append("InterBase", new DBServerInterBase); g_dbserverlist->Append("Oracle", new DBServerOracle); g_dbserverlist->Append("DB2", new DBServerDB2); #ifdef HAVE_XSLT_SUPPORT // xmlSubstituteEntitiesDefault(1); // xmlLoadExtDtdDefaultValue = 1; #endif } void DestroyServers() { #ifdef HAVE_XSLT_SUPPORT xsltCleanupGlobals(); xmlCleanupParser(); #endif delete g_dbserverlist; } int GetServerCount() { return g_dbserverlist->GetCount(); } wxString *GetServerNames() { wxString *names; wxDBServerListNode *node; int idx = 0; names = new wxString[g_dbserverlist->GetCount()]; node = g_dbserverlist->GetFirst(); while (node) { names[idx] = (node->GetData()->GetName()); node = node->GetNext(); idx++; } return names; } DBServer *GetServerByName(const wxString& name) { DBServer *server = NULL; wxDBServerListNode *node; #ifdef ENABLE_DEBUG wxLogMessage("looking for server '%s'", name.c_str()); #endif node = g_dbserverlist->Find(name); if (node) { server = node->GetData(); #ifdef ENABLE_DEBUG wxLogMessage("found server '%s'", server->GetName().c_str()); #endif } return server; }