示例#1
0
pgObject *edbPrivateSynonymFactory::CreateObjects(pgCollection *collection, ctlTree *browser, const wxString &restriction)
{
    edbPrivateSynonym *synonym=0;

    wxString sql = wxT("SELECT s.*, pg_get_userbyid(s.synowner) AS owner,\n") 
               wxT("  COALESCE((SELECT relkind \n")
               wxT("  FROM pg_class c, pg_namespace n\n")
               wxT("  WHERE c.relnamespace = n.oid\n") 
               wxT("    AND n.nspname = s.synobjschema\n")
               wxT("    AND c.relname = s.synobjname), '') AS targettype\n")
               wxT("  FROM pg_synonym s\n")
               wxT("  JOIN pg_namespace ns ON s.synnamespace = ns.oid AND ns.nspname = ")
               + qtConnString(collection->GetSchema()->GetName()) + wxT(" \n")
               + restriction +
               wxT("  ORDER BY synname;");

    pgSet *synonyms = collection->GetDatabase()->ExecuteSet(sql);

    if (synonyms)
    {
        while (!synonyms->Eof())
        {
            wxString name=synonyms->GetVal(wxT("synname"));
            synonym = new edbPrivateSynonym(collection->GetSchema(), name);

            synonym->iSetDatabase(collection->GetDatabase());
            synonym->iSetOwner(synonyms->GetVal(wxT("owner")));

            if (synonyms->GetVal(wxT("targettype")) == wxT("r"))
                synonym->iSetTargetType(_("Table"));
            else if (synonyms->GetVal(wxT("targettype")) == wxT("S"))
                synonym->iSetTargetType(_("Sequence"));
            else if (synonyms->GetVal(wxT("targettype")) == wxT("v"))
                synonym->iSetTargetType(_("View"));
            else
                synonym->iSetTargetType(_("Synonym"));

            synonym->iSetTargetSchema(synonyms->GetVal(wxT("synobjschema")));
            synonym->iSetTargetObject(synonyms->GetVal(wxT("synobjname")));

            if (browser)
            {
                browser->AppendObject(collection, synonym);
			    synonyms->MoveNext();
            }
            else
                break;
        }
        delete synonyms;
    }
    return synonym;
}
示例#2
0
pgConn::pgConn(const wxString &server, const wxString &service, const wxString &hostaddr, const wxString &database, const wxString &username, const wxString &password,
               int port, const wxString &rolename, int sslmode, OID oid, const wxString &applicationname,
               const wxString &sslcert, const wxString &sslkey, const wxString &sslrootcert, const wxString &sslcrl,
               const bool sslcompression) : m_cancelConn(NULL)
{
	wxString msg;

	save_server = server;
	save_hostaddr = hostaddr;
	save_service = service;
	save_database = database;
	save_username = username;
	save_password = password;
	save_port = port;
	save_rolename = rolename;
	save_sslmode = sslmode;
	save_oid = oid;
	save_applicationname = applicationname;
	save_sslcert = sslcert;
	save_sslkey = sslkey;
	save_sslrootcert = sslrootcert;
	save_sslcrl = sslcrl;
	save_sslcompression = sslcompression;

	memset(features, 0, sizeof(features));
	majorVersion = 0;

	conv = &wxConvLibc;
	needColQuoting = false;
	utfConnectString = false;

	// Check the hostname/ipaddress
	conn = 0;
	noticeArg = 0;
	connStatus = PGCONN_BAD;

	// Create the connection string
	if (!server.IsEmpty())
	{
		connstr.Append(wxT(" host="));
		connstr.Append(qtConnString(server));
	}
	if (!hostaddr.IsEmpty())
	{
		connstr.Append(wxT(" hostaddr="));
		connstr.Append(qtConnString(hostaddr));
	}
	if (!service.IsEmpty())
	{
		connstr.Append(wxT(" service="));
		connstr.Append(qtConnString(service));
	}
	if (!database.IsEmpty())
	{
		connstr.Append(wxT(" dbname="));
		connstr.Append(qtConnString(database));
	}
	if (!username.IsEmpty())
	{
		connstr.Append(wxT(" user="******" password="******" port="));
		connstr.Append(NumToStr((long)port));
	}

	if (libpqVersion > 7.3)
	{
		switch (sslmode)
		{
			case 1:
				connstr.Append(wxT(" sslmode=require"));
				break;
			case 2:
				connstr.Append(wxT(" sslmode=prefer"));
				break;
			case 3:
				connstr.Append(wxT(" sslmode=allow"));
				break;
			case 4:
				connstr.Append(wxT(" sslmode=disable"));
				break;
			case 5:
				connstr.Append(wxT(" sslmode=verify-ca"));
				break;
			case 6:
				connstr.Append(wxT(" sslmode=verify-full"));
				break;
		}
	}
	else
	{
		switch (sslmode)
		{
			case 1:
				connstr.Append(wxT(" requiressl=1"));
				break;
			case 2:
				connstr.Append(wxT(" requiressl=0"));
				break;
		}
	}

	if (libpqVersion > 8.3 && sslmode != 4)
	{
		if (!sslcert.IsEmpty())
		{
			connstr.Append(wxT(" sslcert="));
			connstr.Append(qtConnString(sslcert));
		}
		if (!sslkey.IsEmpty())
		{
			connstr.Append(wxT(" sslkey="));
			connstr.Append(qtConnString(sslkey));
		}
		if (!sslrootcert.IsEmpty())
		{
			connstr.Append(wxT(" sslrootcert="));
			connstr.Append(qtConnString(sslrootcert));
		}
		if (!sslcrl.IsEmpty())
		{
			connstr.Append(wxT(" sslcrl="));
			connstr.Append(qtConnString(sslcrl));
		}
	}

	if (libpqVersion > 9.1 && sslmode != 4)
	{
		if (!sslcompression)
		{
			connstr.Append(wxT(" sslcompression=0"));
		}
	}

	connstr.Trim(false);

	dbHost = server;
	dbHostName = server;
	dbRole = rolename;

#ifdef HAVE_CONNINFO_PARSE
	if (!applicationname.IsEmpty())
	{
		// Check connection string with application_name
		char *errmsg;
		wxString connstr_with_applicationname = connstr + wxT(" application_name='") + applicationname + wxT("'");
		if (PQconninfoParse(connstr_with_applicationname.mb_str(wxConvUTF8), &errmsg))
		{
			connstr = connstr_with_applicationname;
		}
		else if (PQconninfoParse(connstr_with_applicationname.mb_str(wxConvLibc), &errmsg))
		{
			connstr = connstr_with_applicationname;
		}
	}
#endif

	// Open the connection
	wxString cleanConnStr = connstr;
	cleanConnStr.Replace(qtConnString(password), wxT("'XXXXXX'"));
	wxLogInfo(wxT("Opening connection with connection string: %s"), cleanConnStr.c_str());

	DoConnect();
}
示例#3
0
void dbgPgConn::Init( const wxString &server, const wxString &database, const wxString &username, const wxString &password, const wxString &port, int sslmode, const wxString &applicationname, bool startThread )
{
	bool utfConnectString = false;
	bool libcConnectString = false;

	m_pgConn       = NULL;
	m_majorVersion = 0;
	m_minorVersion = 0;
	m_debuggerApiVersion = DEBUGGER_UNKNOWN_API;
	m_isEdb = false;

	if( startThread )
		m_workerThread = new dbgPgThread( *this );
	else
		m_workerThread = NULL;

	wxString 	msg;
	wxString	delimiter;

	// To keep the user interface thread responsive while we're waiting for the
	// PostgreSQL server, we create a separate thread to interact with the
	// database - the worker thread sleeps until the GUI thread signals that it
	// has some work to do.  When the result set arrives from the server, the
	// worker thread creates a DBResult event and posts it to the GUI thread's
	// event queue.

	if( m_workerThread )
	{
		m_workerThread->Create();
		m_workerThread->Run();
	}

	// Figure out the hostname/IP address
	struct hostent *host;
	in_addr_t addr;
	wxString hostip, hostname;

#ifdef __WXMSW__
	struct in_addr ipaddr;
#else
	unsigned long ipaddr;
#endif

#ifndef __WXMSW__
	if (!(server.IsEmpty() || server.StartsWith(wxT("/"))))
	{
#endif
		addr = inet_addr(server.ToAscii());
		if (addr == INADDR_NONE) // szServer is not an IP address
		{
			host = gethostbyname(server.ToAscii());
			if (host == NULL)
			{
				wxLogError(__("Could not resolve hostname %s"), server.c_str());
				return;
			}

			memcpy(&(ipaddr), host->h_addr, host->h_length);
			hostip = wxString::FromAscii(inet_ntoa(*((struct in_addr *) host->h_addr_list[0])));
			hostname = server;
		}
		else
		{
			hostip = server;
			hostname = server;
		}
#ifndef __WXMSW__
	}
	else
		hostname = server;
#endif

	// Build up a connection string
	wxString connectParams;

	if(hostname.Length())
	{
		connectParams.Append(wxT( "host="));
		connectParams.Append(hostname);

		msg += delimiter + server;
		delimiter = _(":");
	}

	if (hostip.Length())
	{
		connectParams.Append(wxT(" hostaddr="));
		connectParams.Append(hostip);
	}

	if(port.Length())
	{
		connectParams += wxT(" port=");
		connectParams += port;

		msg += delimiter + port;
		delimiter = _(":");
	}


	if(database.Length())
	{
		connectParams.Append(wxT(" dbname="));
		connectParams.Append(qtConnString(database));

		msg += delimiter + database;
		delimiter = _(":");
	}

	if(username.Length())
	{
		connectParams.Append(wxT(" user="******":");
	}

	if(password.Length())
	{
		connectParams.Append(wxT(" password="******" sslmode=require"));
			break;

		case 2:
			connectParams.Append(wxT(" sslmode=prefer"));
			break;

		case 3:
			connectParams.Append(wxT(" sslmode=allow"));
			break;

		case 4:
			connectParams.Append(wxT(" sslmode=disable"));
			break;

		case 5:
			connectParams.Append(wxT(" sslmode=verify-ca"));
			break;

		case 6:
			connectParams.Append(wxT(" sslmode=verify-full"));
			break;

		default:
			break;
	}

	connectParams.Trim(true);
	connectParams.Trim(false);

#ifdef HAVE_CONNINFO_PARSE
	if (!applicationname.IsEmpty())
	{
		// Check connection string with application_name
		char *errmsg;
		wxString connectParams_with_applicationname = connectParams + wxT(" application_name='") + applicationname + wxT("'");
		if (PQconninfoParse(connectParams_with_applicationname.mb_str(wxConvUTF8), &errmsg))
		{
			utfConnectString = true;
			connectParams = connectParams_with_applicationname;
		}
		else if (PQconninfoParse(connectParams_with_applicationname.mb_str(wxConvLibc), &errmsg))
		{
			libcConnectString = true;
			connectParams = connectParams_with_applicationname;
		}
	}
#endif

	m_frame->getStatusBar()->SetStatusText( wxString::Format(_( "Connecting to %s" ), msg.c_str()), 1 );
	wxCharBuffer cstrUTF = connectParams.mb_str(wxConvUTF8);
	wxCharBuffer cstrLibc = connectParams.mb_str(wxConvLibc);

	if (!libcConnectString)
		m_pgConn = PQconnectdb(cstrUTF);
	else
		m_pgConn = PQconnectdb(cstrLibc);

	if (PQstatus(m_pgConn) != CONNECTION_OK)
	{
		PQfinish(m_pgConn);
		m_pgConn = PQconnectdb(cstrLibc);
	}

	if( PQstatus( m_pgConn ) == CONNECTION_OK )
	{
		m_frame->getStatusBar()->SetStatusText( wxString::Format(_( "Connected to %s" ), msg.c_str()), 1 );
		PQsetClientEncoding( m_pgConn, "UNICODE" );
	}
	else
	{
		throw( std::runtime_error( PQerrorMessage( m_pgConn )));
	}
}