wxString dlgRepSequence::GetSql() { wxString sql; if (sequence) { // edit mode } else { // create mode sql = wxT("SELECT ") + cluster->GetSchemaPrefix() + wxT("setaddsequence(") + NumToStr(set->GetSlId()) + wxT(", "); if (StrToLong(txtID->GetValue()) > 0) sql += txtID->GetValue(); else sql += wxT("(SELECT COALESCE(MAX(seq_id), 0) + 1 FROM ") + cluster->GetSchemaPrefix() + wxT("sl_sequence)"); sql += wxT(", ") + qtDbString(cbSequence->GetGuessedStringSelection()) + wxT(", ") + qtDbString(txtComment->GetValue()) + wxT(")\n"); } return sql; }
/* * Execute default privileges statement * * - Hacked to execute the default privileges statement (sql) for dlgDatabse against this database, * because connection for this database object is getting disconnected, and replaced by the server * connection, before execution of any statements (sqls) in dlgPropery::apply function called * from dlgPropery::OnOK event handler. * * NOTE: This will work only if the database object exists. */ bool dlgDatabase::executeDDLSql(const wxString &strSql) { pgConn *myConn = connection; if (!strSql.IsEmpty()) { wxString tmp; if (cbClusterSet && cbClusterSet->GetSelection() > 0) { replClientData *data = (replClientData *)cbClusterSet->wxItemContainer::GetClientData(cbClusterSet->GetSelection()); if (data->majorVer > 1 || (data->majorVer == 1 && data->minorVer >= 2)) { tmp = wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript_prepare(") + NumToStr(data->setId) + wxT(", 0);\n") + wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript_complete(") + NumToStr(data->setId) + wxT(", ") + qtDbString(strSql) + wxT(", 0);\n"); } else { tmp = wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript(") + NumToStr(data->setId) + wxT(", ") + qtDbString(strSql) + wxT(", 0);\n"); } } else tmp = strSql; if (!myConn->ExecuteVoid(tmp)) // error message is displayed inside ExecuteVoid return false; } return true; }
wxString dlgForeignServer::GetSql() { wxString sql, name; name = txtName->GetValue(); if (foreignserver) { // edit mode AppendNameChange(sql, wxT("SERVER ") + qtIdent(foreignserver->GetName())); if (txtVersion->GetValue() != foreignserver->GetVersion()) { sql = wxT("ALTER SERVER ") + qtIdent(name) + wxT("\n VERSION ") + qtDbString(txtVersion->GetValue()) + wxT(";\n"); } wxString sqloptions = GetOptionsSql(); if (sqloptions.Length() > 0) { sql += wxT("ALTER SERVER ") + name + wxT("\n OPTIONS (") + sqloptions + wxT(");\n"); } AppendOwnerChange(sql, wxT("SERVER ") + qtIdent(name)); } else { // create mode sql = wxT("CREATE SERVER ") + qtIdent(name); if (!(txtType->GetValue()).IsEmpty()) sql += wxT("\n TYPE ") + qtDbString(txtType->GetValue()); if (!(txtVersion->GetValue()).IsEmpty()) sql += wxT("\n VERSION ") + qtDbString(txtVersion->GetValue()); sql += wxT("\n FOREIGN DATA WRAPPER ") + qtIdent(foreigndatawrapper->GetName()); // check for options if (lstOptions->GetItemCount() > 0) { wxString options = wxEmptyString; for (int pos = 0 ; pos < lstOptions->GetItemCount() ; pos++) { if (options.Length() > 0) options += wxT(", "); options += lstOptions->GetText(pos, 0) + wxT(" '") + lstOptions->GetText(pos, 1) + wxT("' "); } sql += wxT("\n OPTIONS (") + options + wxT(")"); } sql += wxT(";\n"); AppendOwnerNew(sql, wxT("SERVER ") + qtIdent(name)); } sql += GetGrant(wxT("U"), wxT("SERVER ") + qtIdent(name)); AppendComment(sql, wxT("SERVER"), 0, foreignserver); return sql; }
bool pgConn::HasPrivilege(const wxString &objTyp, const wxString &objName, const wxString &priv) { wxString res = ExecuteScalar( wxT("SELECT has_") + objTyp.Lower() + wxT("_privilege(") + qtDbString(objName) + wxT(", ") + qtDbString(priv) + wxT(")")); return StrToBool(res); }
void dlgRepCluster::OnChangeCluster(wxCommandEvent &ev) { clusterBackup = wxEmptyString; remoteVersion = wxEmptyString; cbAdminNode->Clear(); cbAdminNode->Append(_("<none>"), (void *) - 1); int sel = cbClusterName->GetCurrentSelection(); if (remoteConn && sel >= 0) { wxString schemaPrefix = qtIdent(wxT("_") + cbClusterName->GetValue()) + wxT("."); long adminNodeID = settings->Read(wxT("Replication/") + cbClusterName->GetValue() + wxT("/AdminNode"), -1L); remoteVersion = remoteConn->ExecuteScalar(wxT("SELECT ") + schemaPrefix + wxT("slonyVersion();")); wxString sql = wxT("SELECT no_id, no_comment\n") wxT(" FROM ") + schemaPrefix + wxT("sl_node\n") wxT(" JOIN ") + schemaPrefix + wxT("sl_path ON no_id = pa_client\n") wxT(" WHERE pa_server = (SELECT last_value FROM ") + schemaPrefix + wxT("sl_local_node_id)\n") wxT(" AND pa_conninfo ILIKE ") + qtDbString(wxT("%host=") + remoteServer->GetName() + wxT("%")) + wxT("\n") wxT(" AND pa_conninfo LIKE ") + qtDbString(wxT("%dbname=") + cbDatabase->GetValue() + wxT("%")) + wxT("\n"); if (remoteServer->GetPort() != 5432) sql += wxT(" AND pa_conninfo LIKE ") + qtDbString(wxT("%port=") + NumToStr((long)remoteServer->GetPort()) + wxT("%")); pgSet *set = remoteConn->ExecuteSet(sql); if (set) { if (!set->Eof()) { long id = set->GetLong(wxT("no_id")); cbAdminNode->Append(IdAndName(id, set->GetVal(wxT("no_comment"))), (void *)id); if (adminNodeID == id) cbAdminNode->SetSelection(cbAdminNode->GetCount() - 1); } } usedNodes.Clear(); set = remoteConn->ExecuteSet( wxT("SELECT no_id FROM ") + schemaPrefix + wxT("sl_node")); if (set) { while (!set->Eof()) { usedNodes.Add(set->GetLong(wxT("no_id"))); set->MoveNext(); } delete set; } } OnChange(ev); }
pgObject *dlgColumn::CreateObject(pgCollection *collection) { pgObject *obj; obj = columnFactory.CreateObjects(collection, 0, wxT("\n AND attname=") + qtDbString(GetName()) + wxT("\n AND cl.relname=") + qtDbString(table->GetName()) + wxT("\n AND cl.relnamespace=") + table->GetSchema()->GetOidStr() + wxT("\n")); return obj; }
pgObject *dlgPackage::CreateObject(pgCollection *collection) { pgObject *obj; if (collection->GetConnection()->EdbMinimumVersion(8, 2)) obj = packageFactory.CreateObjects(collection, 0, wxT(" AND nspname = ") + qtDbString(GetName())); else obj = packageFactory.CreateObjects(collection, 0, wxT(" AND pkgname = ") + qtDbString(GetName())); return obj; }
pgObject *dlgSynonym::CreateObject(pgCollection *collection) { pgObject *obj = NULL; if (!synonymSchema) obj = synonymFactory.CreateObjects(collection, 0, wxT(" WHERE synname = ") + qtDbString(GetName())); else obj = edbPrivFactory.CreateObjects(collection, 0, wxT(" WHERE s.synname=") + qtDbString(GetName()) + wxT(" AND s.synnamespace=") + collection->GetSchema()->GetOidStr() + wxT(" \n")); return obj; }
wxString slSequence::GetSql(ctlTree *browser) { if (sql.IsNull()) { sql = wxT("-- Register sequence ") + GetName() + wxT(" for replication.\n\n") wxT("SELECT ") + GetCluster()->GetSchemaPrefix() + wxT("setaddsequence(") + NumToStr(GetSet()->GetSlId()) + wxT(", ") + NumToStr(GetSlId()) + wxT(", ") + qtDbString(GetName()) + wxT(", ") + qtDbString(GetComment()) + wxT(");\n"); } return sql; }
void dlgSynonym::ProcessSchemaChange() { cbTargetObject->Clear(); wxString restriction; if (cbTargetType->GetValue() == _("Sequence")) restriction = wxT("S"); else if (cbTargetType->GetValue() == _("Table")) restriction = wxT("r"); else if (cbTargetType->GetValue() == _("View")) restriction = wxT("v"); else if (cbTargetType->GetValue() == _("Function")) restriction = wxT("0"); else if (cbTargetType->GetValue() == _("Procedure")) restriction = wxT("1"); wxString sql; if (cbTargetType->GetValue() == _("Synonym")) { sql = wxT("SELECT synname FROM pg_synonym s JOIN pg_namespace n\n") wxT(" ON s.synnamespace = n.oid AND \n") wxT(" n.nspname = ") + qtDbString(cbTargetSchema->GetValue()) + wxT(" ORDER BY synname;"); } else if (cbTargetType->GetValue() == _("Function") || cbTargetType->GetValue() == _("Procedure")) { // "protype" is available, no need to check for version again here.. sql = wxT("SELECT DISTINCT proname from pg_proc p, pg_namespace n\n") wxT(" WHERE p.pronamespace = n.oid AND\n") wxT(" n.nspname = ") + qtDbString(cbTargetSchema->GetValue()) + wxT(" AND\n") wxT(" p.protype = '") + restriction + wxT("' ORDER BY proname;"); } else { sql = wxT("SELECT relname FROM pg_class c, pg_namespace n\n") wxT(" WHERE c.relnamespace = n.oid AND\n") wxT(" n.nspname = ") + qtDbString(cbTargetSchema->GetValue()) + wxT(" AND\n") wxT(" c.relkind = '") + restriction + wxT("' ORDER BY relname;"); } pgSet *objects = connection->ExecuteSet(sql); for (int x = 0; x < objects->NumRows(); x++) { cbTargetObject->Append(objects->GetVal(0)); objects->MoveNext(); } delete objects; cbTargetObject->Enable(); }
wxString dlgJob::GetInsertSql() { wxString sql; if (!job) { sql = wxT("INSERT INTO pgagent.pga_job (jobid, jobjclid, jobname, jobdesc, jobenabled, jobhostagent)\n") wxT("SELECT <JobId>, jcl.jclid, ") + qtDbString(GetName()) + wxT(", ") + qtDbString(txtComment->GetValue()) + wxT(", ") + BoolToStr(chkEnabled->GetValue()) + wxT(", ") + qtDbString(txtHostAgent->GetValue()) + wxT("\n") wxT(" FROM pgagent.pga_jobclass jcl WHERE jclname=") + qtDbString(cbJobclass->GetValue()) + wxT(";\n"); } return sql; }
/* * Execute default privileges statement * * - Hacked to execute the default privileges statement (sql) for dlgDatabse against this database, * because connection for this database object is getting disconnected, and replaced by the server * connection, before execution of any statements (sqls) in dlgPropery::apply function called * from dlgPropery::OnOK event handler. * * NOTE: This will work only if the database object exists. */ bool dlgDatabase::executeDDLSql(const wxString &strSql) { pgConn *myConn = connection; if (!strSql.IsEmpty()) { wxString tmp; if (cbClusterSet && cbClusterSet->GetSelection() > 0) { replClientData *data = (replClientData *)cbClusterSet->wxItemContainer::GetClientData(cbClusterSet->GetSelection()); if (data->majorVer > 1 || (data->majorVer == 1 && data->minorVer >= 2)) { // From slony version 2.2.0 onwards ddlscript_prepare() method is removed and // ddlscript_complete() method arguments got changed so we have to use ddlcapture() method // instead of ddlscript_prepare() and changed the argument of ddlscript_complete() method if ((data->majorVer == 2 && data->minorVer >= 2) || (data->majorVer > 2)) { tmp = wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlcapture(") + qtDbString(strSql) + wxT(", ") + wxT("NULL::text") + wxT(");\n") + wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript_complete(") + wxT("NULL::text") + wxT(");\n"); } else { tmp = wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript_prepare(") + NumToStr(data->setId) + wxT(", -1);\n") + strSql + wxT(";\n") + wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript_complete(") + NumToStr(data->setId) + wxT(", ") + qtDbString(strSql) + wxT(", -1);\n"); } } else { tmp = wxT("SELECT ") + qtIdent(data->cluster) + wxT(".ddlscript(") + NumToStr(data->setId) + wxT(", ") + qtDbString(strSql) + wxT(", 0);\n"); } } else tmp = strSql; if (!myConn->ExecuteVoid(tmp)) // error message is displayed inside ExecuteVoid return false; } return true; }
pgObject *edbPackage::Refresh(ctlTree *browser, const wxTreeItemId item) { pgObject *package=0; pgCollection *coll=browser->GetParentCollection(item); if (coll) { if (coll->GetConnection()->EdbMinimumVersion(8, 2)) package = packageFactory.CreateObjects(coll, 0, wxT(" AND nspname=") + qtDbString(GetName())); else package = packageFactory.CreateObjects(coll, 0, wxT(" AND pkgname=") + qtDbString(GetName())); } return package; }
pgObject *dlgView::CreateObject(pgCollection *collection) { pgObject *obj = viewFactory.CreateObjects(collection, 0, wxT("\n AND c.relname=") + qtDbString(txtName->GetValue()) + wxT("\n AND c.relnamespace=") + schema->GetOidStr()); return obj; }
pgObject *dlgRepCluster::CreateObject(pgCollection *collection) { pgObject *obj = slClusterFactory.CreateObjects(collection, 0, wxT(" WHERE nspname = ") + qtDbString(wxT("_") + GetName())); return obj; }
void dlgRepTable::LoadTrigger(OID relid) { wxString sql = wxT("SELECT tgname FROM pg_trigger\n") wxT(" JOIN pg_proc pr ON pr.oid=tgfoid\n") wxT(" JOIN pg_namespace ns ON ns.oid=pronamespace\n") wxT(" WHERE tgrelid=") + NumToStr(relid); if (connection->BackendMinimumVersion(8, 5)) sql += wxT(" AND tgconstraint=0\n"); else sql += wxT(" AND NOT tgisconstraint\n"); sql += wxT(" AND nspname <> ") + qtDbString(wxT("_") + set->GetCluster()->GetName()) + wxT("\n") wxT(" ORDER BY tgname"); pgSet *trg=connection->ExecuteSet(sql); if (trg) { while (!trg->Eof()) { chkTrigger->Append(trg->GetVal(wxT("tgname"))); trg->MoveNext(); } delete trg; } }
pgObject *dlgRule::CreateObject(pgCollection *collection) { pgObject *obj = ruleFactory.CreateObjects(collection, 0, wxT("\n AND rulename=") + qtDbString(GetName()) + wxT("\n AND rw.ev_class=") + table->GetOidStr()); return obj; }
wxString pgTablespace::GetSql(ctlTree *browser) { if (sql.IsNull()) { sql = wxT("-- Tablespace: ") + GetName() + wxT("\n\n"); if (location.IsEmpty()) sql += wxT("-- System Tablespace\n"); else sql += wxT("-- DROP TABLESPACE ") + GetQuotedIdentifier() + wxT("\n\nCREATE TABLESPACE ") + GetQuotedIdentifier() + wxT("\n OWNER ") + qtIdent(GetOwner()) + wxT("\n LOCATION ") + qtDbString(location) + wxT(";\n"); sql += GetCommentSql(); size_t i; for (i = 0 ; i < variables.GetCount() ; i++) sql += wxT("ALTER TABLESPACE ") + GetQuotedFullIdentifier() + wxT(" SET (") + variables.Item(i) + wxT(");\n"); if (GetConnection()->BackendMinimumVersion(9, 2)) sql += GetSeqLabelsSql(); } return sql; }
pgObject *dlgSchema::CreateObject(pgCollection *collection) { wxString name = GetName(); pgObject *obj = schemaFactory.CreateObjects(collection, 0, wxT(" WHERE nspname=") + qtDbString(name) + wxT("\n")); return obj; }
wxString pgConn::SystemNamespaceRestriction(const wxString &nsp) { if (reservedNamespaces.IsEmpty()) { reservedNamespaces = wxT("'information_schema'"); if (GetIsEdb()) reservedNamespaces += wxT(", 'sys'"); pgSet *set = ExecuteSet( wxT("SELECT nspname FROM pg_namespace nsp\n") wxT(" JOIN pg_proc pr ON pronamespace=nsp.oid\n") wxT(" WHERE proname IN ('slonyversion')")); if (set) { while (!set->Eof()) { reservedNamespaces += wxT(", ") + qtDbString(set->GetVal(wxT("nspname"))); set->MoveNext(); } delete set; } } if (BackendMinimumVersion(8, 1)) return wxT("(") + nsp + wxT(" NOT LIKE E'pg\\_%' AND ") + nsp + wxT(" NOT in (") + reservedNamespaces + wxT("))"); else return wxT("(") + nsp + wxT(" NOT LIKE 'pg\\_%' AND ") + nsp + wxT(" NOT in (") + reservedNamespaces + wxT("))"); }
wxString pgOperator::GetSql(ctlTree *browser) { if (sql.IsNull()) { sql = wxT("-- Operator: ") + GetQuotedFullIdentifier() + wxT("(") + GetOperands() + wxT(")\n\n") + wxT("-- DROP OPERATOR ") + GetQuotedFullIdentifier() + wxT("(") + GetOperands() + wxT(");\n\n") wxT("CREATE OPERATOR ") + GetQuotedFullIdentifier() + wxT("(\n PROCEDURE = ") + GetOperatorFunction(); AppendIfFilled(sql, wxT(",\n LEFTARG = "), qtTypeIdent(GetLeftType())); AppendIfFilled(sql, wxT(",\n RIGHTARG = "), qtTypeIdent(GetRightType())); AppendIfFilled(sql, wxT(",\n COMMUTATOR = "), GetCommutator()); AppendIfFilled(sql, wxT(",\n RESTRICT = "), GetRestrictFunction()); AppendIfFilled(sql, wxT(",\n JOIN = "), GetJoinFunction()); if (GetHashJoins()) sql += wxT(",\n HASHES"); if (GetMergeJoins()) sql += wxT(",\n MERGES"); if (!GetDatabase()->BackendMinimumVersion(8, 3)) { AppendIfFilled(sql, wxT(",\n SORT1 = "), GetLeftSortOperator()); AppendIfFilled(sql, wxT(",\n SORT2 = "), GetRightSortOperator()); AppendIfFilled(sql, wxT(",\n LTCMP = "), GetLessOperator()); AppendIfFilled(sql, wxT(",\n GTCMP = "), GetGreaterOperator()); } sql += wxT(");\n"); if (!GetComment().IsNull()) sql += wxT("COMMENT ON OPERATOR ") + GetQuotedFullIdentifier() + wxT("(") + GetOperands() + wxT(") IS ") + qtDbString(GetComment()) + wxT(";\n"); } return sql; }
wxString dlgSchedule::GetInsertSql() { wxString sql; if (!schedule) { wxString name = GetName(); wxString jscjobid, list = wxT("NULL"); if (jobId) jscjobid = NumToStr(jobId); else jscjobid = wxT("<JobId>"); // Build the various arrays of values sql = wxT("INSERT INTO pgagent.pga_schedule (jscid, jscjobid, jscname, jscdesc, jscminutes, jschours, jscweekdays, jscmonthdays, jscmonths, jscenabled, jscstart, jscend)\n") wxT("VALUES(<SchId>, ") + jscjobid + wxT(", ") + qtDbString(name) + wxT(", ") + qtDbString(txtComment->GetValue()) + wxT(", ") + wxT("'") + ChkListBox2PgArray(chkMinutes) + wxT("', ") + wxT("'") + ChkListBox2PgArray(chkHours) + wxT("', ") + wxT("'") + ChkListBox2PgArray(chkWeekdays) + wxT("', ") + wxT("'") + ChkListBox2PgArray(chkMonthdays) + wxT("', ") + wxT("'") + ChkListBox2PgArray(chkMonths) + wxT("', ") + BoolToStr(chkEnabled->GetValue()) + wxT(", ") + wxT("'") + DateToAnsiStr(calStart->GetValue() + timStart->GetValue()) + wxT("'"); if (calEnd->GetValue().IsValid()) sql += wxT(", '") + DateToAnsiStr(calEnd->GetValue() + timEnd->GetValue()) + wxT("'"); else sql += wxT(", NULL"); sql += wxT(");\n"); } return sql; }
bool dlgRepCluster::CopyTable(pgConn *from, pgConn *to, const wxString &table) { bool ok = true; pgSet *set = from->ExecuteSet(wxT("SELECT * FROM ") + table); if (!set) return false; while (ok && !set->Eof()) { wxString sql = wxT("INSERT INTO ") + table + wxT("("); wxString vals; int i; for (i = 0 ; i < set->NumCols() ; i++) { if (i) { sql += wxT(", ");; vals += wxT(", "); } sql += set->ColName(i); if (set->IsNull(i)) vals += wxT("NULL"); else { switch (set->ColTypeOid(i)) { case PGOID_TYPE_BOOL: case PGOID_TYPE_BYTEA: case PGOID_TYPE_CHAR: case PGOID_TYPE_NAME: case PGOID_TYPE_TEXT: case PGOID_TYPE_VARCHAR: case PGOID_TYPE_TIME: case PGOID_TYPE_TIMESTAMP: case PGOID_TYPE_TIME_ARRAY: case PGOID_TYPE_TIMESTAMPTZ: case PGOID_TYPE_INTERVAL: case PGOID_TYPE_TIMETZ: vals += qtDbString(set->GetVal(i)); break; default: vals += set->GetVal(i); } } } ok = to->ExecuteVoid( sql + wxT(")\n VALUES (") + vals + wxT(");")); set->MoveNext(); } delete set; return ok; }
pgObject *dlgTrigger::CreateObject(pgCollection *collection) { pgObject *obj = triggerFactory.CreateObjects(collection, 0, wxT("\n AND tgname=") + qtDbString(GetName()) + wxT("\n AND tgrelid=") + table->GetOidStr() + wxT("\n AND relnamespace=") + table->GetSchema()->GetOidStr()); return obj; }
pgObject *dlgTextSearchDictionary::CreateObject(pgCollection *collection) { pgObject *obj=textSearchDictionaryFactory.CreateObjects(collection, 0, wxT("\n AND dict.dictname=") + qtDbString(GetName()) + wxT("\n AND dict.dictnamespace=") + schema->GetOidStr()); return obj; }
pgObject *dlgSequence::CreateObject(pgCollection *collection) { pgObject *obj = sequenceFactory.CreateObjects(collection, 0, wxT(" AND relname=") + qtDbString(GetName()) + wxT("\n AND relnamespace=") + schema->GetOidStr()); return obj; }
pgObject *dlgTextSearchParser::CreateObject(pgCollection *collection) { pgObject *obj = textSearchParserFactory.CreateObjects(collection, 0, wxT("\n AND prs.prsname=") + qtDbString(GetName()) + wxT("\n AND prs.prsnamespace=") + schema->GetOidStr()); return obj; }
pgObject *dlgTextSearchTemplate::CreateObject(pgCollection *collection) { pgObject *obj = textSearchTemplateFactory.CreateObjects(collection, 0, wxT("\n AND tmpl.tmplname=") + qtDbString(GetName()) + wxT("\n AND tmpl.tmplnamespace=") + schema->GetOidStr()); return obj; }
pgObject *dlgIndex::CreateObject(pgCollection *collection) { wxString name=GetName(); pgObject *obj=indexFactory.CreateObjects(collection, 0, wxT( "\n AND cls.relname=") + qtDbString(name) + wxT( "\n AND cls.relnamespace=") + table->GetSchema()->GetOidStr()); return obj; }
wxString pgType::GetSql(ctlTree *browser) { if (sql.IsNull()) { sql = wxT("-- Type: ") + GetQuotedFullIdentifier() + wxT("\n\n") + wxT("-- DROP TYPE ") + GetQuotedFullIdentifier() + wxT(";") + wxT("\n\nCREATE TYPE ") + GetQuotedFullIdentifier(); if (GetTypeClass() == TYPE_COMPOSITE) { sql += wxT(" AS\n ("); sql += GetQuotedTypesList(); } else if (GetTypeClass() == TYPE_ENUM) { sql += wxT(" AS ENUM\n ("); sql += GetQuotedLabelList(); } else { sql += wxT("\n (INPUT=") + qtIdent(GetInputFunction()) + wxT(", OUTPUT=") + qtIdent(GetOutputFunction()); AppendIfFilled(sql, wxT(", DEFAULT="), qtDbString(GetDefault())); if (!GetElement().IsNull()) { sql += wxT(",\n ELEMENT=") + GetElement() + wxT(", DELIMITER='") + GetDelimiter() + wxT("'"); } sql += wxT(",\n INTERNALLENGTH=") + NumToStr(GetInternalLength()) + wxT(", ALIGNMENT=" + GetAlignment() + wxT(", STORAGE=") + GetStorage()); if (GetConnection()->BackendMinimumVersion(8, 3)) { if (GetTypmodinFunction() != wxEmptyString && GetTypmodoutFunction() != wxEmptyString) { sql += wxT(",\n TYPMOD_IN=") + GetTypmodinFunction() + wxT(", TYPMOD_OUT=") + GetTypmodoutFunction(); } else if (GetTypmodinFunction() != wxEmptyString) sql += wxT(",\n TYPMOD_IN=") + GetTypmodinFunction(); else if (GetTypmodoutFunction() != wxEmptyString) sql += wxT(",\n TYPMOD_OUT=") + GetTypmodoutFunction(); } if (GetConnection()->BackendMinimumVersion(9, 1) && GetCollatable()) { sql += wxT(",\n COLLATABLE=true"); } } sql += wxT(");\n") + GetOwnerSql(8, 0) + GetCommentSql(); if (GetConnection()->BackendMinimumVersion(9, 1)) sql += GetSeqLabelsSql(); } return sql; }