Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
e9ce658b
Commit
e9ce658b
authored
Mar 22, 2012
by
Tom Lane
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor to eliminate duplicate copies of conninfo default-finding code.
Alex Shulgin, lightly edited by me
parent
04dfc877
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
84 additions
and
101 deletions
+84
-101
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-connect.c
+84
-101
No files found.
src/interfaces/libpq/fe-connect.c
View file @
e9ce658b
...
@@ -121,9 +121,9 @@ static int ldapServiceLookup(const char *purl, PQconninfoOption *options,
...
@@ -121,9 +121,9 @@ static int ldapServiceLookup(const char *purl, PQconninfoOption *options,
* fallback is available. If after all no value can be determined
* fallback is available. If after all no value can be determined
* for an option, an error is returned.
* for an option, an error is returned.
*
*
* The value for the username is treated specially in conninfo_
parse
.
* The value for the username is treated specially in conninfo_
add_defaults
.
* If the
Compiled-in resource is specified as a NULL value, the
* If the
value is not obtained any other way, the username is determined
*
user is determined
by pg_fe_getauthname().
* by pg_fe_getauthname().
*
*
* The Label and Disp-Char entries are provided for applications that
* The Label and Disp-Char entries are provided for applications that
* want to use PQconndefaults() to create a generic database connection
* want to use PQconndefaults() to create a generic database connection
...
@@ -292,11 +292,14 @@ static PGconn *makeEmptyPGconn(void);
...
@@ -292,11 +292,14 @@ static PGconn *makeEmptyPGconn(void);
static
void
fillPGconn
(
PGconn
*
conn
,
PQconninfoOption
*
connOptions
);
static
void
fillPGconn
(
PGconn
*
conn
,
PQconninfoOption
*
connOptions
);
static
void
freePGconn
(
PGconn
*
conn
);
static
void
freePGconn
(
PGconn
*
conn
);
static
void
closePGconn
(
PGconn
*
conn
);
static
void
closePGconn
(
PGconn
*
conn
);
static
PQconninfoOption
*
conninfo_init
(
PQExpBuffer
errorMessage
);
static
PQconninfoOption
*
conninfo_parse
(
const
char
*
conninfo
,
static
PQconninfoOption
*
conninfo_parse
(
const
char
*
conninfo
,
PQExpBuffer
errorMessage
,
bool
use_defaults
);
PQExpBuffer
errorMessage
,
bool
use_defaults
);
static
PQconninfoOption
*
conninfo_array_parse
(
const
char
*
const
*
keywords
,
static
PQconninfoOption
*
conninfo_array_parse
(
const
char
*
const
*
keywords
,
const
char
*
const
*
values
,
PQExpBuffer
errorMessage
,
const
char
*
const
*
values
,
PQExpBuffer
errorMessage
,
bool
use_defaults
,
int
expand_dbname
);
bool
use_defaults
,
int
expand_dbname
);
static
bool
conninfo_add_defaults
(
PQconninfoOption
*
options
,
PQExpBuffer
errorMessage
);
static
char
*
conninfo_getval
(
PQconninfoOption
*
connOptions
,
static
char
*
conninfo_getval
(
PQconninfoOption
*
connOptions
,
const
char
*
keyword
);
const
char
*
keyword
);
static
void
defaultNoticeReceiver
(
void
*
arg
,
const
PGresult
*
res
);
static
void
defaultNoticeReceiver
(
void
*
arg
,
const
PGresult
*
res
);
...
@@ -813,10 +816,9 @@ connectOptions2(PGconn *conn)
...
@@ -813,10 +816,9 @@ connectOptions2(PGconn *conn)
/*
/*
* PQconndefaults
* PQconndefaults
*
*
* Parse an empty string like PQconnectdb() would do and return the
* Construct a default connection options array, which identifies all the
* resulting connection options array, ie, all the default values that are
* available options and shows any default values that are available from the
* available from the environment etc. On error (eg out of memory),
* environment etc. On error (eg out of memory), NULL is returned.
* NULL is returned.
*
*
* Using this function, an application may determine all possible options
* Using this function, an application may determine all possible options
* and their current default values.
* and their current default values.
...
@@ -833,10 +835,21 @@ PQconndefaults(void)
...
@@ -833,10 +835,21 @@ PQconndefaults(void)
PQExpBufferData
errorBuf
;
PQExpBufferData
errorBuf
;
PQconninfoOption
*
connOptions
;
PQconninfoOption
*
connOptions
;
/* We don't actually report any errors here, but callees want a buffer */
initPQExpBuffer
(
&
errorBuf
);
initPQExpBuffer
(
&
errorBuf
);
if
(
PQExpBufferDataBroken
(
errorBuf
))
if
(
PQExpBufferDataBroken
(
errorBuf
))
return
NULL
;
/* out of memory already :-( */
return
NULL
;
/* out of memory already :-( */
connOptions
=
conninfo_parse
(
""
,
&
errorBuf
,
true
);
connOptions
=
conninfo_init
(
&
errorBuf
);
if
(
connOptions
!=
NULL
)
{
if
(
!
conninfo_add_defaults
(
connOptions
,
&
errorBuf
))
{
PQconninfoFree
(
connOptions
);
connOptions
=
NULL
;
}
}
termPQExpBuffer
(
&
errorBuf
);
termPQExpBuffer
(
&
errorBuf
);
return
connOptions
;
return
connOptions
;
}
}
...
@@ -3986,6 +3999,25 @@ PQconninfoParse(const char *conninfo, char **errmsg)
...
@@ -3986,6 +3999,25 @@ PQconninfoParse(const char *conninfo, char **errmsg)
return
connOptions
;
return
connOptions
;
}
}
/*
* Build a working copy of the constant PQconninfoOptions array.
*/
static
PQconninfoOption
*
conninfo_init
(
PQExpBuffer
errorMessage
)
{
PQconninfoOption
*
options
;
options
=
(
PQconninfoOption
*
)
malloc
(
sizeof
(
PQconninfoOptions
));
if
(
options
==
NULL
)
{
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
return
NULL
;
}
memcpy
(
options
,
PQconninfoOptions
,
sizeof
(
PQconninfoOptions
));
return
options
;
}
/*
/*
* Conninfo parser routine
* Conninfo parser routine
*
*
...
@@ -4002,21 +4034,15 @@ conninfo_parse(const char *conninfo, PQExpBuffer errorMessage,
...
@@ -4002,21 +4034,15 @@ conninfo_parse(const char *conninfo, PQExpBuffer errorMessage,
char
*
pname
;
char
*
pname
;
char
*
pval
;
char
*
pval
;
char
*
buf
;
char
*
buf
;
char
*
tmp
;
char
*
cp
;
char
*
cp
;
char
*
cp2
;
char
*
cp2
;
PQconninfoOption
*
options
;
PQconninfoOption
*
options
;
PQconninfoOption
*
option
;
PQconninfoOption
*
option
;
/* Make a working copy of PQconninfoOptions */
/* Make a working copy of PQconninfoOptions */
options
=
malloc
(
sizeof
(
PQconninfoOptions
)
);
options
=
conninfo_init
(
errorMessage
);
if
(
options
==
NULL
)
if
(
options
==
NULL
)
{
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
return
NULL
;
return
NULL
;
}
memcpy
(
options
,
PQconninfoOptions
,
sizeof
(
PQconninfoOptions
));
/* Need a modifiable copy of the input string */
/* Need a modifiable copy of the input string */
if
((
buf
=
strdup
(
conninfo
))
==
NULL
)
if
((
buf
=
strdup
(
conninfo
))
==
NULL
)
...
@@ -4170,74 +4196,15 @@ conninfo_parse(const char *conninfo, PQExpBuffer errorMessage,
...
@@ -4170,74 +4196,15 @@ conninfo_parse(const char *conninfo, PQExpBuffer errorMessage,
free
(
buf
);
free
(
buf
);
/*
/*
* Stop here if caller doesn't want defaults filled in.
* Add in defaults if the caller wants that.
*/
if
(
!
use_defaults
)
return
options
;
/*
* If there's a service spec, use it to obtain any not-explicitly-given
* parameters.
*/
if
(
parseServiceInfo
(
options
,
errorMessage
))
{
PQconninfoFree
(
options
);
return
NULL
;
}
/*
* Get the fallback resources for parameters not specified in the conninfo
* string nor the service.
*/
for
(
option
=
options
;
option
->
keyword
!=
NULL
;
option
++
)
{
if
(
option
->
val
!=
NULL
)
continue
;
/* Value was in conninfo or service */
/*
* Try to get the environment variable fallback
*/
if
(
option
->
envvar
!=
NULL
)
{
if
((
tmp
=
getenv
(
option
->
envvar
))
!=
NULL
)
{
option
->
val
=
strdup
(
tmp
);
if
(
!
option
->
val
)
{
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
PQconninfoFree
(
options
);
return
NULL
;
}
continue
;
}
}
/*
* No environment variable specified or this one isn't set - try
* compiled in
*/
*/
if
(
option
->
compiled
!=
NULL
)
if
(
use_defaults
)
{
{
option
->
val
=
strdup
(
option
->
compiled
);
if
(
!
conninfo_add_defaults
(
options
,
errorMessage
))
if
(
!
option
->
val
)
{
{
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
PQconninfoFree
(
options
);
PQconninfoFree
(
options
);
return
NULL
;
return
NULL
;
}
}
continue
;
}
/*
* Special handling for user
*/
if
(
strcmp
(
option
->
keyword
,
"user"
)
==
0
)
{
option
->
val
=
pg_fe_getauthname
(
errorMessage
);
continue
;
}
}
}
return
options
;
return
options
;
...
@@ -4262,7 +4229,6 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4262,7 +4229,6 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
PQExpBuffer
errorMessage
,
bool
use_defaults
,
PQExpBuffer
errorMessage
,
bool
use_defaults
,
int
expand_dbname
)
int
expand_dbname
)
{
{
char
*
tmp
;
PQconninfoOption
*
options
;
PQconninfoOption
*
options
;
PQconninfoOption
*
str_options
=
NULL
;
PQconninfoOption
*
str_options
=
NULL
;
PQconninfoOption
*
option
;
PQconninfoOption
*
option
;
...
@@ -4298,18 +4264,15 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4298,18 +4264,15 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
}
}
/* Make a working copy of PQconninfoOptions */
/* Make a working copy of PQconninfoOptions */
options
=
malloc
(
sizeof
(
PQconninfoOptions
)
);
options
=
conninfo_init
(
errorMessage
);
if
(
options
==
NULL
)
if
(
options
==
NULL
)
{
{
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
PQconninfoFree
(
str_options
);
PQconninfoFree
(
str_options
);
return
NULL
;
return
NULL
;
}
}
memcpy
(
options
,
PQconninfoOptions
,
sizeof
(
PQconninfoOptions
));
i
=
0
;
/* Parse the keywords/values arrays */
/* Parse the keywords/values arrays */
i
=
0
;
while
(
keywords
[
i
])
while
(
keywords
[
i
])
{
{
const
char
*
pname
=
keywords
[
i
];
const
char
*
pname
=
keywords
[
i
];
...
@@ -4386,20 +4349,42 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4386,20 +4349,42 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
PQconninfoFree
(
str_options
);
PQconninfoFree
(
str_options
);
/*
/*
*
Stop here if caller doesn't want defaults filled in
.
*
Add in defaults if the caller wants that
.
*/
*/
if
(
!
use_defaults
)
if
(
use_defaults
)
{
if
(
!
conninfo_add_defaults
(
options
,
errorMessage
))
{
PQconninfoFree
(
options
);
return
NULL
;
}
}
return
options
;
return
options
;
}
/*
* Add the default values for any unspecified options to the connection
* options array.
*
* Defaults are obtained from a service file, environment variables, etc.
*
* Returns TRUE if successful, otherwise FALSE; errorMessage is filled in
* upon failure. Note that failure to locate a default value is not an
* error condition here --- we just leave the option's value as NULL.
*/
static
bool
conninfo_add_defaults
(
PQconninfoOption
*
options
,
PQExpBuffer
errorMessage
)
{
PQconninfoOption
*
option
;
char
*
tmp
;
/*
/*
* If there's a service spec, use it to obtain any not-explicitly-given
* If there's a service spec, use it to obtain any not-explicitly-given
* parameters.
* parameters.
*/
*/
if
(
parseServiceInfo
(
options
,
errorMessage
))
if
(
parseServiceInfo
(
options
,
errorMessage
)
!=
0
)
{
return
false
;
PQconninfoFree
(
options
);
return
NULL
;
}
/*
/*
* Get the fallback resources for parameters not specified in the conninfo
* Get the fallback resources for parameters not specified in the conninfo
...
@@ -4422,16 +4407,15 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4422,16 +4407,15 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
{
{
printfPQExpBuffer
(
errorMessage
,
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
libpq_gettext
(
"out of memory
\n
"
));
PQconninfoFree
(
options
);
return
false
;
return
NULL
;
}
}
continue
;
continue
;
}
}
}
}
/*
/*
* No environment variable specified or th
is on
e isn't set - try
* No environment variable specified or th
e variabl
e isn't set - try
* compiled
in
* compiled
-in default
*/
*/
if
(
option
->
compiled
!=
NULL
)
if
(
option
->
compiled
!=
NULL
)
{
{
...
@@ -4440,14 +4424,13 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4440,14 +4424,13 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
{
{
printfPQExpBuffer
(
errorMessage
,
printfPQExpBuffer
(
errorMessage
,
libpq_gettext
(
"out of memory
\n
"
));
libpq_gettext
(
"out of memory
\n
"
));
PQconninfoFree
(
options
);
return
false
;
return
NULL
;
}
}
continue
;
continue
;
}
}
/*
/*
* Special handling for
user
* Special handling for
"user" option
*/
*/
if
(
strcmp
(
option
->
keyword
,
"user"
)
==
0
)
if
(
strcmp
(
option
->
keyword
,
"user"
)
==
0
)
{
{
...
@@ -4456,7 +4439,7 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
...
@@ -4456,7 +4439,7 @@ conninfo_array_parse(const char *const * keywords, const char *const * values,
}
}
}
}
return
options
;
return
true
;
}
}
static
char
*
static
char
*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment