The data path of the linux application has been changed to XDG_DATA_HOME.

Файлы которые создаёт приложение помещаются в $XDG_DATA_HOME/pgadmin3 или
~/.local/share/pgadmin3.
Уже существующие файлы копируются из ~/postgresql на новое место.
Каталог postgresql преименовывается в postgresql-no_use. Его можно будет удалить.
Иконки в формате SVG теперь можно размещать и в $XDG_DATA_HOME/pgadmin3 в каталоге svg.

Такая структуры каталога данных приложения:
~/.local/share/pgadmin3
├── icons                      # иконки для баз данных
├── recovery                   # сохранённые вкладки
├── svg                        # каталог svg иконок приложения
├── filter_load.txt            # фильтры csv лога для Log view
├── gitlab.json                # настройки подключения к git
├── pgadmin3opt.json           # дополнительные настройки приложения
└── pgadmin_autoreplace.xml    # списки автозамены
This commit is contained in:
lsv 2025-12-25 17:39:53 +05:00
parent 9f6da5c40a
commit cc5cc00060
8 changed files with 67 additions and 61 deletions

View file

@ -7,7 +7,8 @@
"string.h": "c",
"libpq-fe.h": "c",
"new": "cpp",
"ostream": "cpp"
"ostream": "cpp",
"sstream": "cpp"
},
"cmake.configureArgs": [

View file

@ -318,7 +318,8 @@ ctlGitPanel::~ctlGitPanel()
wxJSONValue ctlGitPanel::GetConfig() {
wxString c;
wxJSONValue cfg;
wxString p = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql"+ wxFileName::GetPathSeparator() +"gitlab.json";
extern wxString dataDir;
wxString p = dataDir+ wxFileName::GetPathSeparator() +"gitlab.json";
if (!wxFileExists(p)) return cfg;
wxFileInputStream input(p);
if (input.IsOk()) {

View file

@ -306,12 +306,13 @@ wxBitmapBundle GetBundleSVG(wxBitmap* std, wxString name, wxSize sz) {
wxBitmapBundle *b=NULL;
bb = bundleHash[name];
if (bb.IsOk()) return bb;
if (wxFile::Exists(loadPath + sepPath +"svg" + sepPath + name)) {
//b = new wxBitmapBundle(wxBitmapBundle::FromSVGFile(loadPath + sepPath + "svg" + sepPath + name, sz));
bb=wxBitmapBundle::FromSVGFile(loadPath + sepPath + "svg" + sepPath + name, sz);
extern wxString dataDir;
wxString fullpath=dataDir+ sepPath +"svg" + sepPath + name; // 1. local data application
if (!wxFile::Exists(fullpath)) fullpath=loadPath + sepPath +"svg" + sepPath + name; // 2. execute path
if (wxFile::Exists(fullpath)) { // name only filename.svg
bb=wxBitmapBundle::FromSVGFile(fullpath, sz);
}
else if (wxFile::Exists(name)) {
else if (wxFile::Exists(name)) { // name = fullpath
if (name.AfterLast('.') == "png") {
wxBitmap bitmap(name, wxBITMAP_TYPE_PNG);
if (!bitmap.Ok())
@ -330,7 +331,7 @@ wxBitmapBundle GetBundleSVG(wxBitmap* std, wxString name, wxSize sz) {
}
if (!bb.IsOk() && std){
//b=new wxBitmapBundle(*std);
// file not found use standart bitmap
bb = wxBitmapBundle::FromBitmap(*std);
}

View file

@ -92,7 +92,7 @@
#define XML_FROM_WXSTRING(s) ((const xmlChar *)(const char *)s.mb_str(wxConvUTF8))
#define WXSTRING_FROM_XML(s) wxString((char *)s, wxConvUTF8)
#define XML_STR(s) ((const xmlChar *)s)
extern wxString dataDir;
// Initialize execution 'mutex'. As this will always run in the
// main thread, there aren't any real concurrency issues, so
// a simple flag will suffice.
@ -255,7 +255,7 @@ void frmQuery::seticon()
wxString str;
wxString filename;
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"icons"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"icons"+wxFileName::GetPathSeparator();
wxString db = conn->GetDbname();
wxString host = conn->GetHostName();
@ -525,7 +525,7 @@ frmQuery::frmQuery(frmMain *form, const wxString &_title, pgConn *_conn, const w
mapping["MNU_UNCOMMENT_TEXT"] = MNU_UNCOMMENT_TEXT;
mapping["MNU_DOROLLBACK"] = MNU_DOROLLBACK;
mapping["MNU_DOCOMMIT"] = MNU_DOCOMMIT;
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"keymap.txt";
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"keymap.txt";
wxLogInfo(wxT("frmQuery::Create key map ..."));
int idx = 0;
if (wxFileName::FileExists(tempDir) )
@ -867,7 +867,7 @@ frmQuery::frmQuery(frmMain *form, const wxString &_title, pgConn *_conn, const w
// load temp file
wxString str;
wxString filename;
tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql";
tempDir = dataDir;
if (!wxDirExists(tempDir)) {
wxMkdir(tempDir);
}
@ -2496,7 +2496,7 @@ void frmQuery::SaveTempFile()
wxString pref=conn->GetDbname();
//if (filename.StartsWith(pref))
filename+=wxT(".a");
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
if (autoSave) {
wxUtfFile file(tempDir + filename, wxFile::write, modeUnicode ? wxFONTENCODING_UTF8 : wxFONTENCODING_DEFAULT);
if (file.IsOpened())
@ -4436,7 +4436,7 @@ void frmQuery::SetOutputPaneCaption(bool update)
// Methods related to SQL tabs //
void frmQuery::fileMarkerActive(bool addOrRemove, const wxString &sqlTabName) {
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tabname = sqlTabName;
if (sqlTabName.Find("*")>=0) tabname = sqlTabName.BeforeLast('*');
@ -4619,7 +4619,7 @@ void frmQuery::OnSqlBookTabRDown (wxAuiNotebookEvent &event) {
pref,
wxOK | wxCANCEL); //setName( dlg.GetValue().wc_str() );
if (dialog.ShowModal() == wxID_OK) {
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString filename=sqlQuery->GetTitle(false);
wxString tf=tempDir+filename+".a";
if (wxFileName::FileExists(tf)) wxRemoveFile(tf);
@ -4668,7 +4668,7 @@ void frmQuery::OnSqlBookPageClose(wxAuiNotebookEvent &event)
SqlBookDisconnectPage();
//drop temp file
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString filename=sqlQuery->GetTitle(false)+wxT(".a");
if (wxFileName::FileExists(tempDir+filename)) wxRemoveFile(tempDir+filename);
fileMarkerActive(false, sqlQuery->GetTitle(false));
@ -4764,7 +4764,7 @@ bool frmQuery::SqlBookRemovePage()
SqlBookDisconnectPage();
pageidx = sqlQueryBook->GetSelection();
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() +wxFileName::GetPathSeparator()+"postgresql"+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
wxString tempDir = dataDir+wxFileName::GetPathSeparator()+"recovery"+wxFileName::GetPathSeparator();
ctlSQLBox *box;
box = wxDynamicCast(sqlQueryBook->GetPage(pageidx), ctlSQLBox);
wxString filename=box->GetTitle(false);

View file

@ -1054,6 +1054,33 @@ void pgAdmin3::InitAppPaths()
brandingPath = LocatePath(BRANDING_DIR, false);
pluginsDir = LocatePath(PLUGINS_DIR, false);
settingsIni = LocatePath(SETTINGS_INI, true);
#ifdef __LINUX__
wxString newdir;
wxString olddatadir=wxFileName::GetHomeDir()+sepPath+"postgresql";
if ( !wxGetEnv(wxS("XDG_DATA_HOME"), &newdir) || newdir.empty() )
newdir = wxFileName::GetHomeDir() + wxT("/.local/share/pgadmin3");
dataDir=newdir ;
if (!wxDir::Exists(newdir)) {
wxMkDir(newdir,wxS_IRUSR|wxS_IWUSR|wxS_IXUSR);
if (wxDir::Exists(olddatadir)) {
if (!wxShell(wxString::Format("cp -r %s/* %s",olddatadir,newdir))) {
wxLogError(wxString::Format("Error copy dirictory 'cp -r %s %s'",olddatadir,newdir));
dataDir=wxFileName::GetHomeDir() + sepPath + "postgresql";
} else {
wxShell(wxString::Format("mv %s %s",olddatadir,olddatadir+"-no_use"));
wxShell(wxString::Format("mv ~/.pgadmin3autoreplace %s",newdir+"/pgadmin_autoreplace.xml"));
}
}
}
#else
dataDir= wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql";
#endif
}
// Setup the paths for the helper apps etc.

View file

@ -4,7 +4,7 @@
#include "utils/utffile.h"
#include "utils/json/jsonval.h"
#include "frm/frmStatus.h"
extern wxString dataDir;
void WaitSample::Init() {
wxString clr = "h1 { \
region: \"IO:DataFileRead\", #2132bd;\n\
@ -132,7 +132,7 @@ region: \"Timeout:PgSleep\", #6ce4c6;\n\
if (cc1.IsOk()) color_gui.push_back(wxColour(cc1)); else
color_gui.push_back(wxColour(def["label"].AsString()));
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql" + wxFileName::GetPathSeparator() + "cache_sql.txt";
wxString tempDir = dataDir + wxFileName::GetPathSeparator() + "cache_sql.txt";
m_file_cache_sql = tempDir;
wxTextFile file(tempDir);
if (file.Exists()) file.Open();
@ -279,8 +279,8 @@ int WaitSample::GetGroupingData(int timeEnd, int needCountGroup, int groupInterv
wxString groupRule, wxArrayString& nameGroup,
std::vector<wxDateTime>& xAxisValue,
std::vector<wxTimeSpan>& yAxisValue,
std::vector<vec_int>& Values, // ìàññèâ ñòîëáöîâ ñïğàâà íà ëåâî
std::vector<long>& clr // öåòà ñëî¸â ğàçìåğíîñòüş groupRule.Count()
std::vector<vec_int>& Values, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
std::vector<long>& clr // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> groupRule.Count()
)
{
int idx_grp = wait_id.size();
@ -493,7 +493,7 @@ wxString WaitSample::GetQueryByQid(long long qid) {
}
void WaitSample::LoadFileSamples() {
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql" + wxFileName::GetPathSeparator() + "sample.dat";
wxString tempDir = dataDir + wxFileName::GetPathSeparator() + "sample.dat";
wxTextFile file(tempDir);
file.Open();
if (file.IsOpened())
@ -603,7 +603,7 @@ void WaitSample::LoadFileSamples() {
}
}
void WaitSample::SaveFileSamples() {
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql" + wxFileName::GetPathSeparator() + "sample.dat";
wxString tempDir = dataDir + wxFileName::GetPathSeparator() + "sample.dat";
wxUtfFile file(tempDir, wxFile::write, wxFONTENCODING_UTF8);
if (file.IsOpened())
{
@ -668,7 +668,7 @@ bool WaitSample::RemoveFiles() {
}
void WaitSample::AddSample(int pid, bool isXidTransation, wxString& btype, const wxString& sample) {
//PidWait pw(pid, basetime);;
// ïîèñê
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int pw;
auto iter = pids.find(pid);
if (iter != pids.end()) {

View file

@ -3,7 +3,7 @@
#include "utils/utffile.h"
#include <wx/filename.h>
#include <wx/stdpaths.h>
extern wxString dataDir;
int Storage::getCountStore() {
return storage.size();
}
@ -83,7 +83,7 @@ void Storage::Reset() {
m_cacheIndex = -1;
ClearRowsStat();
// load filter
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql" + wxFileName::GetPathSeparator();
wxString tempDir = dataDir + wxFileName::GetPathSeparator();
wxString f = tempDir + "filter_load.txt";
if (wxFileExists(f)) {
@ -199,7 +199,7 @@ int Storage::getFilterNames(wxArrayString& arr) {
}
void Storage::saveFilters() {
if (filterload.size() == 0) return;
wxString tempDir = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "postgresql" + wxFileName::GetPathSeparator();
wxString tempDir = dataDir + wxFileName::GetPathSeparator();
wxString f = tempDir + "filter_load.txt";
wxUtfFile file(f, wxFile::write, wxFONTENCODING_UTF8);
if (file.IsOpened())

View file

@ -32,6 +32,7 @@
#include "utils/json/jsonval.h"
#include "utils/json/jsonreader.h"
#include "utils/json/jsonwriter.h"
extern wxString dataDir;
sysSettings::sysSettings(const wxString& name) : wxConfig(name)
{
appName = name;
@ -68,7 +69,7 @@ sysSettings::~sysSettings()
#ifdef WIN32
wxRegKey key(wxRegKey::HKCU, "Software\\"+appName);
wxString fn= wxStandardPaths::Get().GetUserConfigDir() + wxT("\\postgresql\\autoSaveConfig.reg");
wxString fn= dataDir + wxT("\\autoSaveConfig.reg");
if (wxFileName::FileExists(fn)) wxRemoveFile(fn);
key.Export(fn);
#endif
@ -467,7 +468,7 @@ bool sysSettings::WriteJsonObect(const wxString& key, wxJSONValue& value)
return true;
}
bool sysSettings::ReloadJsonFileIfNeed() {
wxString path = wxStandardPaths::Get().GetUserConfigDir() + sepPath + "postgresql" + sepPath + "pgadmin3opt.json";
wxString path = dataDir + sepPath + "pgadmin3opt.json";
if (wxFileExists(path)) {
wxDateTime fmod = wxFileName(path).GetModificationTime();
if ((!jsonfilemod.IsValid() || fmod != jsonfilemod) && !jsonchange) {
@ -496,7 +497,7 @@ bool sysSettings::WriteJsonFile()
if (!jsoncfg.IsNull() && jsonchange) {
//wxString s = jsoncfg.Dump(true, 0);
{
wxString p = wxStandardPaths::Get().GetUserConfigDir() + sepPath + "postgresql" + sepPath + "pgadmin3opt.json";
wxString p = dataDir + sepPath + "pgadmin3opt.json";
{
wxFileOutputStream out(p);
if (out.IsOk()) {
@ -865,7 +866,7 @@ wxString sysSettings::GetConfigFile(configFileName cfgname)
{
fname = stdp.GetUserConfigDir();
#ifdef WIN32
fname += wxT("\\postgresql");
fname = dataDir;
if (!wxDirExists(fname))
wxMkdir(fname);
fname += wxT("\\pgpass.conf");
@ -927,15 +928,8 @@ wxString sysSettings::GetConfigFile(configFileName cfgname)
wxString sysSettings::GetFavouritesFile()
{
wxString s, tmp;
#if wxCHECK_VERSION(2, 9, 5)
wxStandardPaths &stdp = wxStandardPaths::Get();
#else
wxStandardPaths stdp;
#endif
tmp = stdp.GetUserConfigDir();
tmp = dataDir;
#ifdef WIN32
tmp += wxT("\\postgresql");
if (!wxDirExists(tmp))
wxMkdir(tmp);
tmp += wxT("\\pgadmin_favourites.xml");
@ -953,14 +947,8 @@ wxString sysSettings::GetMacrosFile()
{
wxString s, tmp;
#if wxCHECK_VERSION(2, 9, 5)
wxStandardPaths &stdp = wxStandardPaths::Get();
#else
wxStandardPaths stdp;
#endif
tmp = stdp.GetUserConfigDir();
tmp = dataDir;
#ifdef WIN32
tmp += wxT("\\postgresql");
if (!wxDirExists(tmp))
wxMkdir(tmp);
tmp += wxT("\\pgadmin_macros.xml");
@ -976,19 +964,13 @@ wxString sysSettings::GetAutoReplaceFile()
{
wxString s, tmp;
#if wxCHECK_VERSION(2, 9, 5)
wxStandardPaths &stdp = wxStandardPaths::Get();
#else
wxStandardPaths stdp;
#endif
tmp = stdp.GetUserConfigDir();
tmp = dataDir;
#ifdef WIN32
tmp += wxT("\\postgresql");
if (!wxDirExists(tmp))
wxMkdir(tmp);
tmp += wxT("\\pgadmin_autoreplace.xml");
#else
tmp += wxT("/.pgadminautoreplace");
tmp += wxT("/pgadmin_autoreplace.xml");
#endif
Read(wxT("AutoReplaceFile"), &s, tmp);
@ -1001,14 +983,8 @@ wxString sysSettings::GetHistoryFile()
{
wxString s, tmp;
#if wxCHECK_VERSION(2, 9, 5)
wxStandardPaths &stdp = wxStandardPaths::Get();
#else
wxStandardPaths stdp;
#endif
tmp = stdp.GetUserConfigDir();
tmp = dataDir;
#ifdef WIN32
tmp += wxT("\\postgresql");
if (!wxDirExists(tmp))
wxMkdir(tmp);
tmp += wxT("\\pgadmin_histoqueries.xml");