Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
oai
freediameter
Commits
68ea7fb2
Commit
68ea7fb2
authored
Oct 30, 2011
by
Sebastien Decugis
Browse files
Making app_acct thread_safe for PGsql. NOT TESTED.
parent
d38cf07f
Changes
2
Hide whitespace changes
Inline
Side-by-side
extensions/app_acct/acct_db.c
View file @
68ea7fb2
...
@@ -35,6 +35,10 @@
...
@@ -35,6 +35,10 @@
/* Database interface module */
/* Database interface module */
/* There is one connection to the db per thread.
The connection is stored in the pthread_key_t variable */
#include "app_acct.h"
#include "app_acct.h"
#include <libpq-fe.h>
#include <libpq-fe.h>
...
@@ -53,7 +57,8 @@ static const char * stmt = "acct_db_stmt";
...
@@ -53,7 +57,8 @@ static const char * stmt = "acct_db_stmt";
#ifndef TEST_DEBUG
#ifndef TEST_DEBUG
static
static
#endif
/* TEST_DEBUG */
#endif
/* TEST_DEBUG */
PGconn
*
conn
=
NULL
;
pthread_key_t
connk
;
/* Initialize the database context: connection to the DB, prepared statement to insert new records */
/* Initialize the database context: connection to the DB, prepared statement to insert new records */
int
acct_db_init
(
void
)
int
acct_db_init
(
void
)
...
@@ -65,6 +70,7 @@ int acct_db_init(void)
...
@@ -65,6 +70,7 @@ int acct_db_init(void)
size_t
sql_offset
=
0
;
/* The actual data already written in this buffer */
size_t
sql_offset
=
0
;
/* The actual data already written in this buffer */
int
idx
=
0
;
int
idx
=
0
;
PGresult
*
res
;
PGresult
*
res
;
PGconn
*
conn
;
#define REALLOC_SIZE 1024
/* We extend the buffer by this amount */
#define REALLOC_SIZE 1024
/* We extend the buffer by this amount */
TRACE_ENTRY
();
TRACE_ENTRY
();
...
@@ -194,6 +200,9 @@ int acct_db_init(void)
...
@@ -194,6 +200,9 @@ int acct_db_init(void)
free
(
sql
);
free
(
sql
);
acct_rec_empty
(
&
emptyrecords
);
acct_rec_empty
(
&
emptyrecords
);
CHECK_POSIX
(
pthread_key_create
(
&
connk
,
(
void
(
*
)(
void
*
))
PQfinish
)
);
CHECK_POSIX
(
pthread_setspecific
(
connk
,
conn
)
);
/* Ok, ready */
/* Ok, ready */
return
0
;
return
0
;
}
}
...
@@ -201,11 +210,7 @@ int acct_db_init(void)
...
@@ -201,11 +210,7 @@ int acct_db_init(void)
/* Terminate the connection to the DB */
/* Terminate the connection to the DB */
void
acct_db_free
(
void
)
void
acct_db_free
(
void
)
{
{
if
(
conn
)
{
CHECK_POSIX_DO
(
pthread_key_delete
(
connk
)
,
);
/* Note: the prepared statement is automatically freed when the session terminates */
PQfinish
(
conn
);
conn
=
NULL
;
}
}
}
/* When a new message has been received, insert the content of the parsed mapping into the DB (using prepared statement) */
/* When a new message has been received, insert the content of the parsed mapping into the DB (using prepared statement) */
...
@@ -218,9 +223,16 @@ int acct_db_insert(struct acct_record_list * records)
...
@@ -218,9 +223,16 @@ int acct_db_insert(struct acct_record_list * records)
int
size
=
0
;
int
size
=
0
;
PGresult
*
res
;
PGresult
*
res
;
struct
fd_list
*
li
;
struct
fd_list
*
li
;
PGconn
*
conn
;
TRACE_ENTRY
(
"%p"
,
records
);
TRACE_ENTRY
(
"%p"
,
records
);
CHECK_PARAMS
(
conn
&&
records
);
CHECK_PARAMS
(
records
);
conn
=
pthread_getspecific
(
connk
);
if
(
!
conn
)
{
conn
=
PQconnectdb
(
acct_config
->
conninfo
);
CHECK_POSIX
(
pthread_setspecific
(
connk
,
conn
)
);
}
/* First, check if the connection with the DB has not staled, and eventually try to fix it */
/* First, check if the connection with the DB has not staled, and eventually try to fix it */
if
(
PQstatus
(
conn
)
!=
CONNECTION_OK
)
{
if
(
PQstatus
(
conn
)
!=
CONNECTION_OK
)
{
...
...
tests/testappacct.c
View file @
68ea7fb2
...
@@ -90,7 +90,8 @@ static int add_avp_in_conf(char * avpname, int multi)
...
@@ -90,7 +90,8 @@ static int add_avp_in_conf(char * avpname, int multi)
/* Main test routine */
/* Main test routine */
int
main
(
int
argc
,
char
*
argv
[])
int
main
(
int
argc
,
char
*
argv
[])
{
{
extern
PGconn
*
conn
;
/* in acct_db.c */
extern
pthread_key_t
connk
;
/* in acct_db.c */
PGconn
*
conn
;
extern
int
fd_ext_init
(
int
major
,
int
minor
,
char
*
conffile
);
/* defined in include's extension.h */
extern
int
fd_ext_init
(
int
major
,
int
minor
,
char
*
conffile
);
/* defined in include's extension.h */
extern
void
fd_ext_fini
(
void
);
/* defined in the extension itself */
extern
void
fd_ext_fini
(
void
);
/* defined in the extension itself */
struct
msg
*
msg
;
struct
msg
*
msg
;
...
@@ -121,6 +122,7 @@ int main(int argc, char *argv[])
...
@@ -121,6 +122,7 @@ int main(int argc, char *argv[])
/* Now, call the one of the extension */
/* Now, call the one of the extension */
CHECK
(
0
,
fd_ext_init
(
FD_PROJECT_VERSION_MAJOR
,
FD_PROJECT_VERSION_MINOR
,
NULL
)
);
CHECK
(
0
,
fd_ext_init
(
FD_PROJECT_VERSION_MAJOR
,
FD_PROJECT_VERSION_MINOR
,
NULL
)
);
conn
=
pthread_getspecific
(
connk
);
}
}
/* Drop and recreate the table for the test */
/* Drop and recreate the table for the test */
...
...
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