mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 14:15:49 -06:00
157 lines
4.9 KiB
C++
157 lines
4.9 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// pgAdmin III - PostgreSQL Tools
|
|
//
|
|
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
|
|
// This software is released under the PostgreSQL Licence
|
|
//
|
|
// gqbDatabase.cpp - Database object for GQB.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// App headers
|
|
#include "pgAdmin3.h"
|
|
|
|
// wxWindows headers
|
|
#include <wx/wx.h>
|
|
#include <wx/regex.h>
|
|
|
|
// App headers
|
|
#include "gqb/gqbDatabase.h"
|
|
#include "gqb/gqbObject.h"
|
|
#include "gqb/gqbSchema.h"
|
|
#include "schema/pgSchema.h"
|
|
|
|
gqbDatabase::gqbDatabase(wxString name, pgConn *connection)
|
|
: gqbObject(name, NULL, connection)
|
|
{
|
|
setType(GQB_DATABASE);
|
|
}
|
|
|
|
|
|
void gqbDatabase::createObjects(gqbBrowser *_tablesBrowser)
|
|
{
|
|
|
|
wxString rootNodeString = wxString(conn->GetDbname());
|
|
// Create Root Node
|
|
_tablesBrowser->createRoot(rootNodeString);
|
|
|
|
// FillBrowser
|
|
createSchemas(_tablesBrowser, _tablesBrowser->getCatalogRootNode(), GQB_CATALOG, GQB_IMG_CATALOG);
|
|
createSchemas(_tablesBrowser, _tablesBrowser->getTablesRootNode(), GQB_OTHER, GQB_IMG_NAMESPACE);
|
|
}
|
|
|
|
|
|
// Use database connection to create all objects inside tree
|
|
void gqbDatabase::createSchemas(gqbBrowser *tablesBrowser, wxTreeItemId parentNode, typeSchema MetaType, int indexImage)
|
|
{
|
|
|
|
// Search Schemas and insert it
|
|
wxString restr = wxT(" WHERE ");
|
|
|
|
if (MetaType != GQB_CATALOG)
|
|
{
|
|
restr += wxT("NOT ");
|
|
}
|
|
restr += wxT("((nspname = 'pg_catalog' AND EXISTS (SELECT 1 FROM pg_class WHERE relname = 'pg_class' AND relnamespace = nsp.oid LIMIT 1)) OR\n");
|
|
restr += wxT("(nspname = 'pgagent' AND EXISTS (SELECT 1 FROM pg_class WHERE relname = 'pga_job' AND relnamespace = nsp.oid LIMIT 1)) OR\n");
|
|
restr += wxT("(nspname = 'information_schema' AND EXISTS (SELECT 1 FROM pg_class WHERE relname = 'tables' AND relnamespace = nsp.oid LIMIT 1)) OR\n");
|
|
restr += wxT("(nspname LIKE '_%' AND EXISTS (SELECT 1 FROM pg_proc WHERE proname='slonyversion' AND pronamespace = nsp.oid LIMIT 1)) OR\n");
|
|
restr += wxT("(nspname = 'dbo' AND EXISTS (SELECT 1 FROM pg_class WHERE relname = 'systables' AND relnamespace = nsp.oid LIMIT 1)) OR\n");
|
|
restr += wxT("(nspname = 'sys' AND EXISTS (SELECT 1 FROM pg_class WHERE relname = 'all_tables' AND relnamespace = nsp.oid LIMIT 1)))\n");
|
|
|
|
if (conn->EdbMinimumVersion(8, 2))
|
|
{
|
|
restr += wxT(" AND nsp.nspparent = 0\n");
|
|
// Do not show dbms_job_procedure in schemas
|
|
if (!settings->GetShowSystemObjects())
|
|
restr += wxT("AND NOT (nspname = 'dbms_job_procedure' AND EXISTS(SELECT 1 FROM pg_proc WHERE pronamespace = nsp.oid and proname = 'run_job' LIMIT 1))\n");
|
|
}
|
|
|
|
wxString sql;
|
|
|
|
if (MetaType == GQB_CATALOG)
|
|
{
|
|
sql = wxT("SELECT 2 AS nsptyp, nspname, nsp.oid")
|
|
wxT(" FROM pg_namespace nsp\n")
|
|
+ restr +
|
|
wxT(" ORDER BY 1, nspname");
|
|
}
|
|
else
|
|
{
|
|
if (conn->BackendMinimumVersion(8, 1))
|
|
{
|
|
sql = wxT("SELECT CASE WHEN nspname LIKE E'pg\\\\_temp\\\\_%' THEN 1\n")
|
|
wxT(" WHEN (nspname LIKE E'pg\\\\_%') THEN 0\n");
|
|
}
|
|
else
|
|
{
|
|
sql = wxT("SELECT CASE WHEN nspname LIKE 'pg\\\\_temp\\\\_%' THEN 1\n")
|
|
wxT(" WHEN (nspname LIKE 'pg\\\\_%') THEN 0\n");
|
|
}
|
|
sql += wxT(" ELSE 3 END AS nsptyp, nspname, nsp.oid\n")
|
|
wxT(" FROM pg_namespace nsp\n")
|
|
+ restr +
|
|
wxT(" ORDER BY 1, nspname");
|
|
}
|
|
|
|
pgSet *schemas = conn->ExecuteSet(sql);
|
|
wxTreeItemId parent;
|
|
|
|
if (schemas)
|
|
{
|
|
while (!schemas->Eof())
|
|
{
|
|
wxString name = schemas->GetVal(wxT("nspname"));
|
|
long nsptyp = schemas->GetLong(wxT("nsptyp"));
|
|
|
|
wxStringTokenizer tokens(settings->GetSystemSchemas(), wxT(","));
|
|
while (tokens.HasMoreTokens())
|
|
{
|
|
wxRegEx regex(tokens.GetNextToken());
|
|
if (regex.Matches(name))
|
|
{
|
|
nsptyp = SCHEMATYP_USERSYS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (nsptyp <= SCHEMATYP_USERSYS && MetaType != GQB_CATALOG && !settings->GetShowSystemObjects())
|
|
{
|
|
schemas->MoveNext();
|
|
continue;
|
|
}
|
|
|
|
int tableImage = GQB_IMG_TABLE, viewImage = GQB_IMG_VIEW;
|
|
gqbSchema *schema;
|
|
|
|
if (MetaType == GQB_CATALOG)
|
|
{
|
|
|
|
// Create Schema Object
|
|
schema = new gqbSchema(this, name, conn, schemas->GetOid(wxT("oid")));
|
|
parent = tablesBrowser->AppendItem(parentNode, name, indexImage, indexImage, schema);
|
|
schema->createObjects(tablesBrowser, schema->getOid(), parent, GQB_IMG_TABLE, GQB_IMG_VIEW, GQB_IMG_EXTTABLE);
|
|
|
|
if(name != wxT("pg_catalog") && name != wxT("pgagent"))
|
|
{
|
|
tableImage = GQB_IMG_CATALOG_OBJ;
|
|
viewImage = GQB_IMG_CATALOG_OBJ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
// Create Schema Object
|
|
// Note that the schema will be populated when the node is expanded.
|
|
schema = new gqbSchema(this, name, conn, schemas->GetOid(wxT("oid")));
|
|
parent = tablesBrowser->AppendItem(parentNode, name , indexImage, indexImage, schema);
|
|
schema->createObjects(tablesBrowser, schema->getOid(), parent, GQB_IMG_TABLE, GQB_IMG_VIEW, GQB_IMG_EXTTABLE);
|
|
}
|
|
|
|
schemas->MoveNext();
|
|
}
|
|
|
|
delete schemas;
|
|
}
|
|
}
|