1
//////////////////////////////////////////////////////////////////////////
3
// pgAdmin III - PostgreSQL Tools
4
// RCS-ID: $Id: pgconfig.cpp 6930 2008-01-02 00:10:01Z dpage $
5
// Copyright (C) 2002 - 2008, The pgAdmin Development Team
6
// This software is released under the Artistic Licence
8
// pgconfig.cpp - backend configuration classes
10
//////////////////////////////////////////////////////////////////////////
14
#include <wx/textbuf.h>
16
#include "utils/pgconfig.h"
17
#include "db/pgConn.h"
19
#include "utils/utffile.h"
22
#define DEFAULT_COMMENT_INDEX wxT("\t\t# ")
25
int FindToken(const wxString &str, const wxChar **list)
28
for (index = 0 ; list[index] ; index++)
30
if (list[index] == str)
38
const wxChar *pgConfigTypeStrings[]=
48
void pgSettingItem::SetType(const wxString &str)
50
int index=FindToken(str, pgConfigTypeStrings);
54
type = (pgConfigType)index;
58
const wxChar *pgConfigContextStrings[]=
71
void pgSettingItem::SetContext(const wxString &str)
73
int index = FindToken(str, pgConfigContextStrings);
75
context = PGC_INTERNAL;
77
context = (pgConfigContext)index;
81
const wxChar *pgConfigSourceStrings[]=
84
wxT("environment variable"),
85
wxT("configuration file"),
99
void pgSettingItem::SetSource(const wxString &str)
101
int index = FindToken(str, pgConfigSourceStrings);
103
source = PGC_UNKNOWNSOURCE;
105
source = (pgConfigSource)index;
109
wxString pgSettingItem::GetActiveValue()
113
if (!newLine->isComment)
114
return newLine->value;
118
if (!orgLine->isComment)
119
return orgLine->value;
125
pgConfigLine::pgConfigLine(pgConfigLine *line)
129
comment=line->comment;
130
isComment = line->isComment;
134
bool pgConfigLine::Differs(pgConfigLine *line)
136
return value != line->value || comment != line->comment || isComment != line->isComment;
140
wxString pgConfigLine::GetNewText()
144
if (item->type == pgSettingItem::PGC_STRING)
146
if (value.Find('\'') >= 0)
154
newLine += item->name + wxT(" = ")
155
+ quote + value + quote;
157
if (!comment.IsEmpty())
159
if (item->orgLine && item->orgLine->commentIndent.Find('#') >= 0)
160
newLine += item->orgLine->commentIndent;
162
newLine += DEFAULT_COMMENT_INDEX;
169
pgConfigOrgLine::pgConfigOrgLine(pgConfigLine *line) : pgConfigLine(line)
171
text = line->GetNewText();
173
commentIndent = DEFAULT_COMMENT_INDEX;
177
wxString pgConfigOrgLine::GetNewText()
179
if (!item || !item->newLine)
181
return item->newLine->GetNewText();
185
////////////////////////////////////////////////
188
pgSettingFileReader::pgSettingFileReader(bool localized)
192
extern wxString i18nPath;
194
wxString path=i18nPath + wxT("/") + settings->GetCanonicalLanguage() +wxT("/pg_settings.csv");
195
if (localized && wxFile::Exists(path))
198
file.Open(i18nPath+wxT("/pg_settings.csv"));
206
if (!buffer.IsEmpty())
208
buffer = wxTextBuffer::Translate(buffer, wxTextFileType_Unix);
210
columnNames = buffer.BeforeFirst('\n');
211
bp = (wxChar*)buffer.c_str() + columnNames.Length()+1;
216
pgSettingFileReader::~pgSettingFileReader()
221
pgSettingItem *pgSettingFileReader::GetNextItem()
223
if (!bp || !*bp || *bp == '\n')
226
pgSettingItem *item=new pgSettingItem;
227
wxStringTokenizer tk(columnNames, wxT(";"));
228
wxString column=tk.GetNextToken();
240
while (*c && *c != '\n')
256
if (column == wxT("name") || column == wxT("\"name\""))
258
else if (column == wxT("category") || column == wxT("\"category\""))
259
item->category = value;
260
else if (column == wxT("short_desc") || column == wxT("\"short_desc\""))
261
item->short_desc = value;
262
else if (column == wxT("extra_desc") || column == wxT("\"extra_desc\""))
263
item->extra_desc = value;
264
else if (column == wxT("min_val") || column == wxT("\"min_val\""))
265
item->min_val = value;
266
else if (column == wxT("max_val") || column == wxT("\"max_val\""))
267
item->max_val = value;
268
else if (column == wxT("context") || column == wxT("\"context\""))
269
item->SetContext(value);
270
else if (column == wxT("vartype") || column == wxT("\"vartype\""))
271
item->SetType(value);
273
column = tk.GetNextToken();
297
pgSettingDbReader::pgSettingDbReader(pgConn *conn)
299
set=conn->ExecuteSet(wxT("SELECT name, setting, source, category, short_desc, extra_desc, context, vartype, min_val, max_val FROM pg_settings ORDER BY name"));
303
pgSettingDbReader::~pgSettingDbReader()
309
pgSettingItem *pgSettingDbReader::GetNextItem()
314
pgSettingItem *item=new pgSettingItem;
316
item->name = set->GetVal(wxT("name"));
317
item->category = set->GetVal(wxT("category"));
318
item->short_desc = set->GetVal(wxT("short_desc"));
319
item->extra_desc = set->GetVal(wxT("extra_desc"));
320
item->min_val = set->GetVal(wxT("min_val"));
321
item->max_val = set->GetVal(wxT("max_val"));
322
item->SetContext(set->GetVal(wxT("context")));
323
item->SetType(set->GetVal(wxT("vartype")));
324
item->SetSource(set->GetVal(wxT("source")));
325
item->value = set->GetVal(wxT("setting"));
333
///////////////////////////////////////////////////////
335
// must match enum pgHbaConnectType!!!
336
const wxChar *pgHbaConnectTypeStrings[] =
346
// must match enum pgHbaMethod!!!
347
const wxChar *pgHbaMethodStrings[] =
362
bool IsSpaceChar(wxChar c, const wxChar *spaceChars=wxT("\t "))
364
return wxStrchr(spaceChars, c) != NULL;
368
void SkipSpace(const wxChar* &ptr, const wxChar *spaceChars=wxT("\t "))
370
while (*ptr && IsSpaceChar(*ptr))
375
void SkipNonspace(const wxChar* &ptr, const wxChar *spaceChars=wxT("\t "))
377
while (*ptr && !IsSpaceChar(*ptr))
382
pgHbaConfigLine::pgHbaConfigLine(const wxString &line)
385
connectType = PGC_INVALIDCONF;
386
method = PGC_INVALIDMETHOD;
391
void pgHbaConfigLine::Init(const wxString &line)
393
connectType = PGC_INVALIDCONF;
401
const wxChar *p0=line.c_str();
416
wxString str=line.Mid(p0-line.c_str(), p1-p0);
418
int i=FindToken(str, pgHbaConnectTypeStrings);
421
connectType = (pgHbaConnectType)i;
424
connectType = PGC_INVALIDCONF;
436
if (!quoted && IsSpaceChar(*p2))
443
database = line.Mid(p1-line.c_str(), p2-p1);
452
if (!quoted && IsSpaceChar(*p3))
459
user = line.Mid(p2-line.c_str(), p3-p2);
465
if (connectType == PGC_LOCAL)
472
while (*p4 && !IsSpaceChar(*p4))
484
ipaddress = line.Mid(p3-line.c_str(), p4-p3);
491
str=line.Mid(p4-line.c_str(), p5-p4);
493
i = FindToken(str, pgHbaMethodStrings);
496
method = (pgHbaMethod)i;
499
connectType = PGC_INVALIDCONF;
508
const wxChar *pgHbaConfigLine::GetConnectType()
510
if (connectType >= 0 && connectType < PGC_INVALIDCONF)
511
return pgHbaConnectTypeStrings[connectType];
516
const wxChar *pgHbaConfigLine::GetMethod()
518
if (method >= 0 && method < PGC_INVALIDMETHOD)
519
return pgHbaMethodStrings[method];
524
wxString pgHbaConfigLine::GetText()
530
wxString tabspace=wxT("\t ");
534
str += GetConnectType()
535
+ tabspace + database
538
if (connectType != PGC_LOCAL)
539
str += tabspace + ipaddress;
541
str += tabspace + GetMethod();
543
if (method >= PGC_IDENT && !option.IsEmpty())
544
str += tabspace + option;
550
////////////////////////////////////////////////
551
pgPassConfigLine::pgPassConfigLine(const wxString &line)
557
void pgPassConfigLine::Init(const wxString &line)
564
isComment = line.StartsWith(wxT("#"));
566
wxStringTokenizer tok(isComment?line.Mid(1):line, wxT(":"));
567
if (tok.HasMoreTokens())
568
hostname = tok.GetNextToken();
569
if (tok.HasMoreTokens())
570
port = tok.GetNextToken();
571
if (tok.HasMoreTokens())
572
database = tok.GetNextToken();
573
if (tok.HasMoreTokens())
574
username = tok.GetNextToken();
575
if (tok.HasMoreTokens())
576
password = tok.GetNextToken();
579
wxString pgPassConfigLine::GetText()
581
return (isComment?wxT("#"):wxT("")) +
582
hostname + wxT(":") +
584
database + wxT(":") +
585
username + wxT(":") +