//--------------------------------------------------------------------------- // Name: BrowserDB.h,cpp // Purpose: a wxDB; // Author: Mark Johnson, mj10777@gmx.net // Modified by: // Created: 19991127.mj10777 // Copyright: (c) Mark Johnson // Licence: wxWindows license //--------------------------------------------------------------------------- //-- 1) //--------------------------------------------------------------------------- //-- all #ifdefs that the whole Project needs. ------------------------------ //--------------------------------------------------------------------------- #ifdef __GNUG__ #pragma implementation #pragma interface #endif //--------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma hdrstop #endif //--------------------------------------------------------------------------- #ifndef WX_PRECOMP #include "wx/wx.h" #endif //--------------------------------------------------------------------------- #include #include "std.h" //--------------------------------------------------------------------------- // Global structure for holding ODBC connection information // - darf nur einmal im Projekte definiert werden ?? Extra Databasse Klasse ? struct DbStuff ConnectInf; // Für DBase //--------------------------------------------------------------------------- extern DbList* WXDLLEXPORT PtrBegDbList; /* from db.cpp, used in getting back error results from db connections */ //--------------------------------------------------------------------------- char *GetExtendedDBErrorMsg(char *ErrFile, int ErrLine) { static wxString msg; wxString tStr; if (ErrFile || ErrLine) { msg += "File: "; msg += ErrFile; msg += " Line: "; tStr.Printf("%d",ErrLine); msg += tStr.GetData(); // msg += "\n"; } msg.Append ("\nODBC errors:\n"); // msg += "\n"; /* Scan through each database connection displaying * any ODBC errors that have occured. */ for (DbList *pDbList = PtrBegDbList; pDbList; pDbList = pDbList->PtrNext) { // Skip over any free connections if (pDbList->Free) continue; // Display errors for this connection for (int i = 0; i < DB_MAX_ERROR_HISTORY; i++) { if (pDbList->PtrDb->errorList[i]) { msg.Append(pDbList->PtrDb->errorList[i]); if (strcmp(pDbList->PtrDb->errorList[i],"") != 0) msg.Append("\n"); } } } msg += "\n"; return (char*) (const char*) msg; } // GetExtendedDBErrorMsg ////////////////////////////////////////////////////////////////////////////////// // BJO 20000115 : New stuff : dialog to ask for username and password ////////////////////////////////////////////////////////////////////////////////// class UserDialog : public wxDialog { public: UserDialog(wxWindow* parent); virtual ~UserDialog(); void OnOK(wxCommandEvent& event); wxString s_UserName, s_Password; private: wxButton *m_OK; wxStaticText *m_Label1, *m_Label2; wxTextCtrl *m_UserName, *m_Password; DECLARE_EVENT_TABLE() }; //--------------------------------------------------------------------------- BEGIN_EVENT_TABLE(UserDialog, wxDialog) EVT_BUTTON(wxID_OK, UserDialog::OnOK) END_EVENT_TABLE() //--------------------------------------------------------------------------- UserDialog::UserDialog(wxWindow *parent): wxDialog(parent, -1, _("ODBC user"),wxDefaultPosition, wxSize(310, 300),wxDIALOG_MODAL | wxDEFAULT_DIALOG_STYLE) { wxLayoutConstraints* layout; SetAutoLayout(TRUE); //----------------------------------------------- m_OK = new wxButton(this, wxID_OK, _("Ok")); layout = new wxLayoutConstraints; layout->left.SameAs(this, wxLeft, 10); layout->top.SameAs(this, wxTop,10); layout->height.AsIs(); layout->width.Absolute(75); m_OK->SetConstraints(layout); m_Label1 = new wxStaticText(this, -1, _("User name:")); layout = new wxLayoutConstraints; layout->left.SameAs(m_OK, wxLeft); layout->top.SameAs(m_OK, wxBottom, 10); layout->height.AsIs(); layout->width.AsIs(); m_Label1->SetConstraints(layout); m_UserName = new wxTextCtrl(this, -1, ""); layout = new wxLayoutConstraints; layout->left.SameAs(m_OK, wxLeft); layout->top.SameAs(m_Label1, wxBottom, 3); layout->width.AsIs(); layout->height.AsIs(); m_UserName->SetConstraints(layout); m_Label2 = new wxStaticText(this, -1, _("Password:")); layout = new wxLayoutConstraints; layout->left.SameAs(m_OK, wxLeft); layout->top.SameAs(m_UserName, wxBottom, 10); layout->height.AsIs(); layout->width.AsIs(); m_Label2->SetConstraints(layout); m_Password = new wxTextCtrl(this, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD); layout = new wxLayoutConstraints; layout->left.SameAs(m_OK, wxLeft); layout->width.AsIs(); layout->top.SameAs(m_Label2, wxBottom, 3); layout->height.AsIs(); m_Password->SetConstraints(layout); s_UserName = ""; s_Password = ""; Layout(); } //--------------------------------------------------------------------------- UserDialog::~UserDialog() { } //--------------------------------------------------------------------------- void UserDialog::OnOK(wxCommandEvent& WXUNUSED(event)) { strcpy(ConnectInf.Uid, m_UserName->GetValue()); strcpy(ConnectInf.AuthStr, m_Password->GetValue()); EndModal(1); } ////////////////////////////////////////////////////////////////////////////////// // BJO 20000115 : end of new stuff ////////////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- BrowserDB::BrowserDB() { Zeiger_auf_NULL(0); ODBCSource = ""; // ODBC data source name (created with ODBC Administrator under Win95/NT) UserName = ""; // database username - must already exist in the data source Password = ""; // password database username OnFillSqlTyp(); OnFilldbTyp(); } // BrowserDB Constructor //--------------------------------------------------------------------------- BrowserDB::~BrowserDB() { Zeiger_auf_NULL(1); // Clean up Tables and Databases (Commit, Close und delete) } // BrowserDB destructor //-------------------------------------------------------------------------------------------- bool BrowserDB::Initialize(int Quite) { if (!OnStartDB(Quite)) { wxLogMessage(_("\n\n-E-> BrowserDB::OnStartDB(%s) : Failed ! "),ODBCSource.c_str()); return FALSE; } return TRUE; } // BrowserDB:Initialize //-------------------------------------------------------------------------------------------- bool BrowserDB::OnStartDB(int Quite) { if (!Quite) wxLogMessage(_("\n-I-> BrowserDB::OnStartDB(%s) : Begin "),ODBCSource.c_str()); if (db_BrowserDB != NULL) { if (!Quite) wxLogMessage(_("\n-I-> BrowserDB::OnStartDB() : DB is allready open.")); return TRUE; } // Initialize the ODBC Environment for Database Operations if (SQLAllocEnv(&ConnectInf.Henv) != SQL_SUCCESS) { if (!Quite) wxLogMessage(_("\n-E-> BrowserDB::OnStartDB() : DB CONNECTION ERROR : A problem occured while trying to get a connection to the data source")); return FALSE; } //--------------------------------------------------------------------------- // Connect to datasource //--------------------------- DlgUser p_Dlg(pDoc->p_MainFrame, "Username and Password", wxPoint(100, 100), wxSize(340, 170)); p_Dlg.s_DSN = ODBCSource; p_Dlg.s_User = UserName; p_Dlg.s_Password = Password; p_Dlg.OnInit(); if (p_Dlg.ShowModal() == wxID_OK) { (pDoc->p_DSN+i_Which)->Usr = p_Dlg.s_User; (pDoc->p_DSN+i_Which)->Pas = p_Dlg.s_Password; UserName = p_Dlg.s_User; Password = p_Dlg.s_Password; } p_Dlg.Destroy(); //--------------------------- strcpy(ConnectInf.Dsn, ODBCSource); // ODBC data source name (created with ODBC Administrator under Win95/NT) strcpy(ConnectInf.Uid, UserName); // database username - must already exist in the data source strcpy(ConnectInf.AuthStr, Password); // password database username db_BrowserDB = GetDbConnection(&ConnectInf); // wxLogMessage(">>>%s<<<>>>%s<<<",UserName.c_str(),Password.c_str()); if (db_BrowserDB == NULL) { strcpy(ConnectInf.Dsn, ""); strcpy(ConnectInf.Uid, ""); strcpy(ConnectInf.AuthStr, ""); if (!Quite) { wxLogMessage(_("\n-E-> BrowserDB::OnConnectDataSource() DB CONNECTION ERROR : Unable to connect to the data source.\n\nCheck the name of your data source to verify it has been correctly entered/spelled.\n\nWith some databases, the user name and password must\nbe created with full rights to the table prior to making a connection\n(using tools provided by the database manufacturer)")); wxLogMessage(_("-I-> BrowserDB::OnStartDB(%s) : End "),ODBCSource.c_str()); } return FALSE; } //-------------------------------------------------------------------------- if (!Quite) { Temp1 = db_BrowserDB->GetDatabaseName(); Temp2 = db_BrowserDB->GetDataSource(); wxLogMessage(_("-I-> BrowserDB::OnGetDataSourceODBC() - DatabaseName(%s) ; DataSource(%s)"),Temp1.c_str(),Temp2.c_str()); wxLogMessage(_("-I-> BrowserDB::OnStartDB(%s) : End "),ODBCSource.c_str()); } return TRUE; } //-------------------------------------------------------------------------------------------- bool BrowserDB::OnCloseDB(int Quite) { if (!Quite) wxLogMessage(_("-I-> BrowserDB::OnCloseDB() : Begin ")); if (db_BrowserDB) { db_BrowserDB->Close(); FreeDbConnection(db_BrowserDB); // Free Environment Handle that ODBC uses if (SQLFreeEnv(&ConnectInf.Henv) != SQL_SUCCESS) { // Error freeing environment handle } db_BrowserDB = NULL; } if (!Quite) wxLogMessage(_("\n-I-> BrowserDB::OnCloseDB() : End ")); return TRUE; } //---------------------------------------------------------------------------------------- bool BrowserDB::OnGetNext(int Cols,int Quite) { SDWORD cb; int i_dbDataType; int i=0; char s_temp[1024+1]; long l_temp; double f_temp; int AnzError=0; TIMESTAMP_STRUCT t_temp; wxString Temp0; //----------------------------- if (!db_BrowserDB->GetNext()) { return FALSE; Temp0.Printf(_("\n-E-> BrowserDB::OnGetNext - ODBC-Error with GetNext \n-E-> ")); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); wxLogMessage(Temp0); wxMessageBox(Temp0); } else { for (i=0;itableName,"-E->"); i_dbDataType = (cl_BrowserDB->pColFor+i)->i_dbDataType; if (i_dbDataType == 0) // Filter unsupported dbDataTypes { if (((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_VARCHAR) || ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_LONGVARCHAR)) i_dbDataType = DB_DATA_TYPE_VARCHAR; if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_DATE) i_dbDataType = DB_DATA_TYPE_DATE; if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_BIT) i_dbDataType = DB_DATA_TYPE_INTEGER; if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_NUMERIC) i_dbDataType = DB_DATA_TYPE_VARCHAR; if ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_REAL) i_dbDataType = DB_DATA_TYPE_FLOAT; } if ((i_dbDataType == DB_DATA_TYPE_INTEGER) && ((cl_BrowserDB->pColFor+i)->i_sqlDataType == SQL_C_DOUBLE)) { // DBASE Numeric i_dbDataType = DB_DATA_TYPE_FLOAT; } switch(i_dbDataType) { case DB_DATA_TYPE_VARCHAR: strcpy(s_temp,""); if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_dbDataType,&s_temp,sizeof(s_temp), &cb)) { Temp0.Printf(_("\n-E-> BrowserDB::OnGetNext - ODBC-Error with GetNext of >%s<.\n-E-> "),(cl_BrowserDB+i)->tableName); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); wxLogMessage(Temp0); } Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,s_temp); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); break; case DB_DATA_TYPE_INTEGER: l_temp = 0; if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&l_temp,sizeof(l_temp), &cb)) { Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); } else { Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,l_temp); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); } break; case DB_DATA_TYPE_FLOAT: f_temp = 0; if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&f_temp,sizeof(f_temp), &cb)) { Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); wxMessageBox(Temp0); } else { Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,f_temp); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); } break; case DB_DATA_TYPE_DATE: t_temp.day = t_temp.month = t_temp.year = t_temp.hour = t_temp.minute = t_temp.second = t_temp.fraction = 0; if (!db_BrowserDB->GetData(i+1,(cl_BrowserDB->pColFor+i)->i_sqlDataType,&t_temp,sizeof(t_temp), &cb)) { Temp0.Printf(_("\n-E-> BrowserDB::OnGetData - ODBC-Error with GetNext \n-E-> ")); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); } else { // i_Nation = 0 = timestamp , 1=EU, 2=UK, 3=International, 4=US if (((cl_BrowserDB->pColFor+i)->i_Nation == 0) || // TS YYYY-MM-DD ((cl_BrowserDB->pColFor+i)->i_Nation == 3)) // IT YYYY-MM-DD { Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.year,t_temp.month,t_temp.day, t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); } if ( ((cl_BrowserDB->pColFor+i)->i_Nation == 1) || // EU DD.MM.YYYY ((cl_BrowserDB->pColFor+i)->i_Nation == 2)) // UK DD/MM/YYYY { Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.day,t_temp.month,t_temp.year, t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); } if ((cl_BrowserDB->pColFor+i)->i_Nation == 3) // US MM/DD/YYYY { Temp0.Printf((cl_BrowserDB->pColFor+i)->s_Field,t_temp.month,t_temp.day,t_temp.year, t_temp.hour, t_temp.minute, t_temp.second, t_temp.fraction); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); } } break; default: AnzError++; if (AnzError <= 100) { Temp0 = (cl_BrowserDB+i)->colName; wxLogMessage(_("-E-> BrowserDB::OnGetNext - DB_DATA_TYPE_?? (%d) in Col(%s)"),(cl_BrowserDB->pColFor+i)->i_dbDataType,Temp0.c_str()); } else return TRUE; Temp0.Printf(_("-E-> unknown Format(%d) - sql(%d)"),(cl_BrowserDB->pColFor+i)->i_dbDataType,(cl_BrowserDB->pColFor+i)->i_sqlDataType); strcpy((cl_BrowserDB+i)->tableName,Temp0.c_str()); break; }; } } // wxLogMessage("-E-> BrowserDB::OnGetNext - End"); return TRUE; } //---------------------------------------------------------------------------------------- bool BrowserDB::OnSelect(wxString tb_Name, int Quite) { wxString SQLStmt; i_Records = 0; //-------------------------------------------------------------------------- SQLStmt.sprintf("SELECT * FROM %s",tb_Name.c_str()); if (!db_BrowserDB->ExecSql((char *)(SQLStmt.GetData()))) { Temp0.Printf(_("\n-E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of >%s<.\n-E-> "),tb_Name.c_str()); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); wxLogMessage(Temp0); wxMessageBox("-E-> BrowserDB::OnSelect - GetData()"); return FALSE; } //-------------------------------------------------------------------------- while (db_BrowserDB->GetNext()) { i_Records++; } //-------------------------------------------------------------------------- if (!db_BrowserDB->ExecSql((char *)(SQLStmt.GetData()))) { Temp0.Printf(_("\n-E-> BrowserDB::OnSelect - ODBC-Error with ExecSql of >%s<.\n-E-> "),tb_Name.c_str()); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); wxLogMessage(Temp0); return FALSE; } //-------------------------------------------------------------------------- // SetColDefs ( 0,"NAME", DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index //-------------------------------------------------------------------------- if (!Quite) { wxLogMessage(_("\n-I-> BrowserDB::OnSelect(%s) Records(%d): End "),tb_Name.c_str(),i_Records); } return TRUE; } //---------------------------------------------------------------------------------------- bool BrowserDB::OnExecSql(wxString SQLStmt, int Quite) { //-------------------------------------------------------------------------- if (!db_BrowserDB->ExecSql((char *)(SQLStmt.GetData()))) { Temp0.Printf(_("\n-E-> BrowserDB::OnExecSQL - ODBC-Error with ExecSql of >%s<.\n-E-> "),SQLStmt.c_str()); Temp0 += GetExtendedDBErrorMsg(__FILE__,__LINE__); if (!Quite) wxLogMessage(Temp0); else wxMessageBox("-E-> BrowserDB::OnExecSql - ExecSql()"); return FALSE; } if (!Quite) { // wxLogMessage(_("\n-I-> BrowserDB::OnExecSql(%s) - End "),SQLStmt.c_str()); } return TRUE; } //---------------------------------------------------------------------------------------- wxDbInf* BrowserDB::OnGetCatalog(int Quite) { char UName[255]; strcpy(UName,UserName); ct_BrowserDB = db_BrowserDB->GetCatalog(UName); return ct_BrowserDB; } //---------------------------------------------------------------------------------------- wxColInf* BrowserDB::OnGetColumns(char *tableName, int numCols,int Quite) { char UName[255]; int i; strcpy(UName,UserName); cl_BrowserDB = db_BrowserDB->GetColumns(tableName,&numCols,UName); cl_BrowserDB->pColFor = new wxColFor[numCols]; for (i=0;ipColFor+i)->Format(1,(cl_BrowserDB+i)->dbDataType,(cl_BrowserDB+i)->sqlDataType, (cl_BrowserDB+i)->columnSize, (cl_BrowserDB+i)->decimalDigits); } return cl_BrowserDB; } //---------------------------------------------------------------------------------------- void BrowserDB::Zeiger_auf_NULL(int Art) { if (Art == 1) // Löschen { if (cl_BrowserDB != NULL) { // Destroy the memory delete [] cl_BrowserDB; } if (ct_BrowserDB != NULL) { // Destroy the memory delete [] ct_BrowserDB; } if (db_BrowserDB != NULL) { db_BrowserDB->CommitTrans(); db_BrowserDB->Close(); CloseDbConnections(); delete db_BrowserDB; } } cl_BrowserDB = NULL; ct_BrowserDB = NULL; db_BrowserDB = NULL; p_LogWindow = NULL; } //---------------------------------------------------------------------------------------- void BrowserDB::OnFillSqlTyp() { i_SqlTyp[1] = SQL_C_BINARY; s_SqlTyp[1] = "SQL_C_BINARY"; i_SqlTyp[2] = SQL_C_BIT; s_SqlTyp[2] = "SQL_C_BIT"; i_SqlTyp[3] = SQL_C_BOOKMARK; s_SqlTyp[3] = "SQL_C_BOOKMARK"; i_SqlTyp[4] = SQL_C_CHAR; s_SqlTyp[4] = "SQL_C_CHAR"; i_SqlTyp[5] = SQL_C_DATE; s_SqlTyp[5] = "SQL_C_DATE"; i_SqlTyp[6] = SQL_C_DEFAULT; s_SqlTyp[6] = "SQL_C_DEFAULT"; i_SqlTyp[7] = SQL_C_DOUBLE; s_SqlTyp[7] = "SQL_C_DOUBLE"; i_SqlTyp[8] = SQL_C_FLOAT; s_SqlTyp[8] = "SQL_C_FLOAT"; i_SqlTyp[9] = SQL_C_LONG; s_SqlTyp[9] = "SQL_C_LONG"; i_SqlTyp[10] = SQL_C_SHORT; s_SqlTyp[10] = "SQL_C_SHORT"; i_SqlTyp[11] = SQL_C_SLONG; s_SqlTyp[11] = "SQL_C_SLONG"; i_SqlTyp[12] = SQL_C_SSHORT; s_SqlTyp[12] = "SQL_C_SSHORT"; i_SqlTyp[13] = SQL_C_STINYINT; s_SqlTyp[13] = "SQL_C_STINYINT"; i_SqlTyp[14] = SQL_C_TIME; s_SqlTyp[14] = "SQL_C_TIME"; i_SqlTyp[15] = SQL_C_TIMESTAMP; s_SqlTyp[15] = "SQL_C_TIMESTAMP"; i_SqlTyp[16] = SQL_C_TINYINT; s_SqlTyp[16] = "SQL_C_TINYINT"; i_SqlTyp[17] = SQL_C_ULONG; s_SqlTyp[17] = "SQL_C_ULONG"; i_SqlTyp[18] = SQL_C_USHORT; s_SqlTyp[18] = "SQL_C_USHORT"; i_SqlTyp[19] = SQL_C_UTINYINT; s_SqlTyp[19] = "SQL_C_UTINYINT"; i_SqlTyp[20] = SQL_VARCHAR; s_SqlTyp[20] = "SQL_VARCHAR"; i_SqlTyp[21] = SQL_NUMERIC; s_SqlTyp[21] = "SQL_NUMERIC"; i_SqlTyp[22] = SQL_LONGVARCHAR; s_SqlTyp[22] = "SQL_LONGVARCHAR"; i_SqlTyp[23] = SQL_REAL; s_SqlTyp[23] = "SQL_REAL"; i_SqlTyp[0] = 23; s_SqlTyp[0] = ""; } //---------------------------------------------------------------------------------------- void BrowserDB::OnFilldbTyp() { i_dbTyp[1] = DB_DATA_TYPE_VARCHAR; s_dbTyp[1] = "DB_DATA_TYPE_VARCHAR"; i_dbTyp[2] = DB_DATA_TYPE_INTEGER; s_dbTyp[2] = "DB_DATA_TYPE_INTEGER"; i_dbTyp[3] = DB_DATA_TYPE_FLOAT; s_dbTyp[3] = "DB_DATA_TYPE_FLOAT"; i_dbTyp[4] = DB_DATA_TYPE_DATE; s_dbTyp[4] = "DB_DATA_TYPE_DATE"; i_dbTyp[0] = 4; s_dbTyp[0] = ""; } //----------------------------------------------------------------------------------------