pgadmin3/include/schema/pgTable.h
lsv 38b4b4a5ed Add table properties "Create table timestamp"
Для серверов с установленным track_commit_timestamp=on у таблиц можно определить время создания.
Это время равно значению запроса:
"select pg_xact_commit_timestamp(xmin) create_ts from pg_type where typrelid=$oid_table".
Если это время определить не удалось то "Create table timestamp" не отображается.
2024-06-17 20:37:23 +05:00

757 lines
16 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// pgTable.h PostgreSQL Table
//
//////////////////////////////////////////////////////////////////////////
#ifndef PGTABLE_H
#define PGTABLE_H
#include "pgSchema.h"
enum
{
REPLICATIONSTATUS_NONE = 0,
REPLICATIONSTATUS_SUBSCRIBED,
REPLICATIONSTATUS_REPLICATED,
REPLICATIONSTATUS_MULTIPLY_PUBLISHED
};
class pgTableFactory : public pgSchemaObjFactory
{
public:
pgTableFactory();
virtual dlgProperty *CreateDialog(frmMain *frame, pgObject *node, pgObject *parent);
virtual pgObject *CreateObjects(pgCollection *obj, ctlTree *browser, const wxString &restr = wxEmptyString);
virtual pgCollection *CreateCollection(pgObject *obj);
int GetReplicatedIconId()
{
return replicatedIconId;
}
int GetPartitionsIconId()
{
return partitionsIconId;
}
private:
int replicatedIconId;
int partitionsIconId;
};
extern pgTableFactory tableFactory;
class slSet;
class pgTable : public pgSchemaObject
{
public:
pgTable(pgSchema *newSchema, const wxString &newName = wxT(""));
pgTable(pgSchema *newSchema, pgaFactory &factory, const wxString &newName = wxT(""));
~pgTable();
wxString GetTranslatedMessage(int kindOfMessage) const;
int GetIconId();
void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0);
void ShowHint(frmMain *form, bool force);
void ShowStatistics(frmMain *form, ctlListView *statistics);
bool CanDropCascaded()
{
return !GetSystemObject() && pgSchemaObject::CanDrop();
}
int GetReplicationStatus(ctlTree *browser, wxString *clusterName = 0, long *setId = 0);
bool GetHasOids() const
{
return hasOids;
}
void iSetHasOids(bool b)
{
hasOids = b;
}
bool GetUnlogged() const
{
return unlogged;
}
void iSetUnlogged(bool b)
{
unlogged = b;
}
wxString GetPrimaryKey() const
{
return primaryKey;
}
void iSetPrimaryKey(const wxString &s)
{
primaryKey = s;
}
wxString GetQuotedPrimaryKey() const
{
return quotedPrimaryKey;
}
void iSetQuotedPrimaryKey(const wxString &s)
{
quotedPrimaryKey = s;
}
wxString GetPrimaryKeyColNumbers() const
{
return primaryKeyColNumbers;
}
void iSetPrimaryKeyColNumbers(const wxString &s)
{
primaryKeyColNumbers = s;
}
wxString GetPrimaryKeyName() const
{
return primaryKeyName;
}
void iSetPrimaryKeyName(const wxString &s)
{
primaryKeyName = s;
}
wxString GetDistributionColNumbers() const
{
return distributionColNumbers; // for Greenplum
}
void iSetDistributionColNumbers(const wxString &s)
{
distributionColNumbers = s; // for Greenplum
if (s.Length() > 0) distributionIsRandom = false;
}
void iSetDistributionIsRandom()
{
distributionIsRandom = true;
}
double GetEstimatedRows() const
{
return estimatedRows;
}
void iSetEstimatedRows(const double d)
{
estimatedRows = d;
}
wxString GetTablespace() const
{
return tablespace;
};
void iSetTablespace(const wxString &newVal)
{
tablespace = newVal;
}
wxString GetCreateTableTS() const
{
return create_table_TS;
};
void iSetCreateTableTS(const wxString& newVal)
{
create_table_TS = newVal;
}
wxString GetRatio() const
{
return ratio;
};
void iSetRatio(const wxString &newVal)
{
if (newVal==wxT("NaN")) ratio=wxEmptyString; else ratio = newVal;
}
OID GetTablespaceOid() const
{
return tablespaceOid;
};
void iSetTablespaceOid(const OID newVal)
{
tablespaceOid = newVal;
}
wxString GetOfType() const
{
return ofType;
};
void iSetOfType(const wxString &newVal)
{
ofType = newVal;
}
OID GetOfTypeOid() const
{
return ofTypeOid;
};
void iSetOfTypeOid(const OID newVal)
{
ofTypeOid = newVal;
}
wxULongLong GetRows() const
{
return rows;
}
long GetInheritedTableCount()
{
if (inheritedTableCount < 0) UpdateInheritance();
return inheritedTableCount;
}
wxString GetInheritedTables()
{
GetInheritedTableCount();
return inheritedTables;
}
wxString GetQuotedInheritedTables()
{
GetInheritedTableCount();
return quotedInheritedTables;
}
wxArrayString GetInheritedTablesOidList()
{
GetInheritedTableCount();
return inheritedTablesOidList;
}
wxArrayString GetQuotedInheritedTablesList()
{
GetInheritedTableCount();
return quotedInheritedTablesList;
}
wxString GetCoveringIndex(ctlTree *browser, const wxString &collist);
pgCollection *GetColumnCollection(ctlTree *browser);
pgCollection *GetConstraintCollection(ctlTree *browser);
bool GetHasSubclass() const
{
return hasSubclass;
}
void iSetHasSubclass(bool b)
{
hasSubclass = b;
}
void iSetIsReplicated(bool b)
{
isReplicated = b;
}
bool GetIsReplicated() const
{
return isReplicated;
}
void iSetTriggerCount(long l)
{
triggerCount = l;
}
int GetTriggerCount() const
{
return triggerCount;
}
bool EnableTriggers(const bool b);
void UpdateRows();
bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded);
bool Truncate(bool cascaded);
bool ResetStats();
bool CanView()
{
return true;
}
bool CanMaintenance()
{
return true;
}
bool CanBackup()
{
return true;
}
bool CanRestore()
{
return true;
}
bool WantDummyChild()
{
return true;
}
bool GetCanHint();
bool GetShowExtendedStatistics()
{
return showExtendedStatistics;
}
void iSetShowExtendedStatistics(bool b)
{
showExtendedStatistics = b;
}
wxString GetFillFactor()
{
return fillFactor;
}
void iSetFillFactor(const wxString &s)
{
fillFactor = s;
}
wxString GetAppendOnly()
{
return appendOnly;
}
void iSetAppendOnly(const wxString &s)
{
appendOnly = s;
}
wxString GetCompressLevel()
{
return compressLevel;
}
void iSetCompressLevel(const wxString &s)
{
compressLevel = s;
}
wxString GetOrientation()
{
return orientation;
}
void iSetOrientation(const wxString &s)
{
orientation = s;
}
wxString GetCompressType()
{
return compresstype;
}
void iSetCompressType(const wxString &s)
{
compresstype = s;
};
wxString GetBlocksize()
{
return blocksize;
}
void iSetBlocksize(const wxString &s)
{
blocksize = s;
};
wxString GetChecksum()
{
return checksum;
}
void iSetChecksum(const wxString &s)
{
checksum = s;
};
wxString GetPartitionDef()
{
return partitionDef;
}
void iSetPartitionDef(const wxString &s)
{
partitionDef = s;
}
wxString GetPartKeyDef()
{
return partkeydef;
}
void iSetPartKeyDef(const wxString &s)
{
partkeydef = s;
}
wxString GetPartExp()
{
return partexp;
}
void iSetPartExp(const wxString &s)
{
partexp = s;
}
void iSetStatExt(const wxString &s)
{
statext = s;
}
wxString GetStatExt()
{
return statext;
}
bool GetIsPartitioned() const
{
return isPartitioned || partitionDef.Length() > 0;
}
void iSetIsPartitioned(bool b)
{
isPartitioned = b;
}
bool GetCustomAutoVacuumEnabled()
{
return !reloptions.IsEmpty();
}
wxString GetRelOptions()
{
return reloptions;
}
void iSetRelOptions(const wxString &s)
{
reloptions = s;
}
int GetAutoVacuumEnabled()
{
return autovacuum_enabled;
}
void iSetAutoVacuumEnabled(int i)
{
autovacuum_enabled = i;
}
wxString GetAutoVacuumVacuumThreshold()
{
return autovacuum_vacuum_threshold;
}
void iSetAutoVacuumVacuumThreshold(const wxString &s)
{
autovacuum_vacuum_threshold = s;
}
wxString GetAutoVacuumVacuumScaleFactor()
{
return autovacuum_vacuum_scale_factor;
}
void iSetAutoVacuumVacuumScaleFactor(const wxString &s)
{
autovacuum_vacuum_scale_factor = s;
}
wxString GetAutoVacuumAnalyzeThreshold()
{
return autovacuum_analyze_threshold;
}
void iSetAutoVacuumAnalyzeThreshold(const wxString &s)
{
autovacuum_analyze_threshold = s;
}
wxString GetAutoVacuumAnalyzeScaleFactor()
{
return autovacuum_analyze_scale_factor;
}
void iSetAutoVacuumAnalyzeScaleFactor(const wxString &s)
{
autovacuum_analyze_scale_factor = s;
}
wxString GetAutoVacuumVacuumCostDelay()
{
return autovacuum_vacuum_cost_delay;
}
void iSetAutoVacuumVacuumCostDelay(const wxString &s)
{
autovacuum_vacuum_cost_delay = s;
}
wxString GetAutoVacuumVacuumCostLimit()
{
return autovacuum_vacuum_cost_limit;
}
void iSetAutoVacuumVacuumCostLimit(const wxString &s)
{
autovacuum_vacuum_cost_limit = s;
}
wxString GetAutoVacuumFreezeMinAge()
{
return autovacuum_freeze_min_age;
}
void iSetAutoVacuumFreezeMinAge(const wxString &s)
{
autovacuum_freeze_min_age = s;
}
wxString GetAutoVacuumFreezeMaxAge()
{
return autovacuum_freeze_max_age;
}
void iSetAutoVacuumFreezeMaxAge(const wxString &s)
{
autovacuum_freeze_max_age = s;
}
wxString GetAutoVacuumFreezeTableAge()
{
return autovacuum_freeze_table_age;
}
void iSetAutoVacuumFreezeTableAge(const wxString &s)
{
autovacuum_freeze_table_age = s;
}
bool GetHasToastTable()
{
return hasToastTable;
}
void iSetHasToastTable(bool b)
{
hasToastTable = b;
}
/* TOAST TABLE autovacuum settings */
bool GetToastCustomAutoVacuumEnabled()
{
return !toast_reloptions.IsEmpty();
}
wxString GetToastRelOptions()
{
return toast_reloptions;
}
void iSetToastRelOptions(const wxString &s)
{
toast_reloptions = s;
}
int GetToastAutoVacuumEnabled()
{
return toast_autovacuum_enabled;
}
void iSetToastAutoVacuumEnabled(int i)
{
toast_autovacuum_enabled = i;
}
wxString GetToastAutoVacuumVacuumThreshold()
{
return toast_autovacuum_vacuum_threshold;
}
void iSetToastAutoVacuumVacuumThreshold(const wxString &s)
{
toast_autovacuum_vacuum_threshold = s;
}
wxString GetToastAutoVacuumVacuumScaleFactor()
{
return toast_autovacuum_vacuum_scale_factor;
}
void iSetToastAutoVacuumVacuumScaleFactor(const wxString &s)
{
toast_autovacuum_vacuum_scale_factor = s;
}
wxString GetToastAutoVacuumVacuumCostDelay()
{
return toast_autovacuum_vacuum_cost_delay;
}
void iSetToastAutoVacuumVacuumCostDelay(const wxString &s)
{
toast_autovacuum_vacuum_cost_delay = s;
}
wxString GetToastAutoVacuumVacuumCostLimit()
{
return toast_autovacuum_vacuum_cost_limit;
}
void iSetToastAutoVacuumVacuumCostLimit(const wxString &s)
{
toast_autovacuum_vacuum_cost_limit = s;
}
wxString GetToastAutoVacuumFreezeMinAge()
{
return toast_autovacuum_freeze_min_age;
}
void iSetToastAutoVacuumFreezeMinAge(const wxString &s)
{
toast_autovacuum_freeze_min_age = s;
}
wxString GetToastAutoVacuumFreezeMaxAge()
{
return toast_autovacuum_freeze_max_age;
}
void iSetToastAutoVacuumFreezeMaxAge(const wxString &s)
{
toast_autovacuum_freeze_max_age = s;
}
wxString GetToastAutoVacuumFreezeTableAge()
{
return toast_autovacuum_freeze_table_age;
}
void iSetToastAutoVacuumFreezeTableAge(const wxString &s)
{
toast_autovacuum_freeze_table_age = s;
}
bool HasStats()
{
return true;
}
bool HasDepends()
{
return true;
}
bool HasReferences()
{
return true;
}
bool HasPgstattuple();
virtual wxMenu *GetNewMenu();
virtual wxString GetSql(ctlTree *browser);
wxString GetSelectSql(ctlTree *browser);
wxString GetInsertSql(ctlTree *browser);
wxString GetUpdateSql(ctlTree *browser);
wxString GetDeleteSql(ctlTree *browser);
wxString GetHelpPage(bool forCreate) const;
pgObject *Refresh(ctlTree *browser, const wxTreeItemId item);
void iSetTriggersEnabled(ctlTree *browser, bool enable);
private:
void UpdateInheritance();
bool GetVacuumHint();
wxString GetCols(ctlTree *browser, size_t indent, wxString &QMs, bool withQM);
void AppendStuff(wxString &sql, ctlTree *browser, pgaFactory &factory);
void AppendStuffNoSql(wxString &sql, ctlTree *browser, pgaFactory &factory);
void Init();
wxULongLong rows;
double estimatedRows;
bool hasToastTable;
/*
* Three possible values:
* 0 - Disabled
* 1 - Enabled
* 2 - GUC Setting
*/
int autovacuum_enabled, toast_autovacuum_enabled;
wxString reloptions, toast_reloptions;
wxString fillFactor, autovacuum_vacuum_threshold,
autovacuum_vacuum_scale_factor, autovacuum_analyze_threshold,
autovacuum_analyze_scale_factor, autovacuum_vacuum_cost_delay,
autovacuum_vacuum_cost_limit, autovacuum_freeze_min_age,
autovacuum_freeze_max_age, autovacuum_freeze_table_age;
wxString appendOnly;
wxString compressLevel;
wxString orientation; // "row" or "column"
wxString compresstype;
wxString blocksize;
wxString checksum;
wxString partkeydef; // partition feature 10 version
wxString partexp; // partition feature 10 version
wxString partitionDef;
wxString statext;
bool isPartitioned;
bool hasOids, unlogged, hasSubclass, rowsCounted, isReplicated, showExtendedStatistics, distributionIsRandom;
wxString toast_fillFactor, toast_autovacuum_vacuum_threshold,
toast_autovacuum_vacuum_scale_factor, toast_autovacuum_vacuum_cost_delay,
toast_autovacuum_vacuum_cost_limit, toast_autovacuum_freeze_min_age,
toast_autovacuum_freeze_max_age, toast_autovacuum_freeze_table_age;
long inheritedTableCount, triggerCount;
wxString quotedInheritedTables, inheritedTables, primaryKey, quotedPrimaryKey,
primaryKeyName, primaryKeyColNumbers, tablespace, ratio, create_table_TS,
distributionColNumbers, ofType;
wxArrayString quotedInheritedTablesList, inheritedTablesOidList;
slSet *replicationSet;
OID tablespaceOid;
OID ofTypeOid;
};
class pgTableObject : public pgSchemaObject
{
public:
pgTableObject(pgTable *newTable, pgaFactory &factory, const wxString &newName = wxT(""))
: pgSchemaObject(newTable->GetSchema(), factory, newName)
{
table = newTable;
}
virtual pgTable *GetTable() const
{
return table;
}
OID GetTableOid() const
{
return table->GetOid();
}
wxString GetTableOidStr() const
{
return NumToStr(table->GetOid()) + wxT("::oid");
}
protected:
pgTable *table;
};
class pgTableCollection : public pgSchemaObjCollection
{
public:
pgTableCollection(pgaFactory *factory, pgSchema *sch);
wxString GetTranslatedMessage(int kindOfMessage) const;
void ShowStatistics(frmMain *form, ctlListView *statistics);
};
class pgTableObjCollection : public pgSchemaObjCollection
{
public:
pgTableObjCollection(pgaFactory *factory, pgTable *_table)
: pgSchemaObjCollection(factory, _table->GetSchema())
{
iSetOid(_table->GetOid());
table = _table;
}
virtual pgTable *GetTable() const
{
return table;
}
bool CanCreate();
protected:
pgTable *table;
};
class pgTableObjFactory : public pgSchemaObjFactory
{
public:
pgTableObjFactory(const wxChar *tn, const wxChar *ns, const wxChar *nls, wxImage *img, wxImage *imgSm = 0)
: pgSchemaObjFactory(tn, ns, nls, img, imgSm) {}
virtual pgCollection *CreateCollection(pgObject *obj);
};
class countRowsFactory : public contextActionFactory
{
public:
countRowsFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
class executePgstattupleFactory : public contextActionFactory
{
public:
executePgstattupleFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
bool CheckChecked(pgObject *obj);
};
class disableAllTriggersFactory : public contextActionFactory
{
public:
disableAllTriggersFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
class enableAllTriggersFactory : public contextActionFactory
{
public:
enableAllTriggersFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
class truncateFactory : public contextActionFactory
{
public:
truncateFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
class truncateCascadedFactory : public contextActionFactory
{
public:
truncateCascadedFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
class resetTableStatsFactory : public contextActionFactory
{
public:
resetTableStatsFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
wxWindow *StartDialog(frmMain *form, pgObject *obj);
bool CheckEnable(pgObject *obj);
};
#endif