Mercurial > hg > freeDiameter
annotate extensions/app_acct/acct_db.c @ 1233:0b4abb03bcaf
Fix double increment when realloc resulting in invalid SQL query
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Wed, 04 Sep 2013 02:14:31 +0200 |
parents | 1af09cc156d6 |
children |
rev | line source |
---|---|
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
2 * Software License Agreement (BSD License) * |
740
4a9f08d6b6ba
Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
534
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
1127
1af09cc156d6
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
5 * Copyright (c) 2013, WIDE Project and NICT * |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 /* Database interface module */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
38 /* There is one connection to the db per thread. |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
39 The connection is stored in the pthread_key_t variable */ |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
40 |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
41 |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 #include "app_acct.h" |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
43 #include <libpq-fe.h> |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
44 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 const char * diam2db_types_mapping[AVP_TYPE_MAX + 1] = { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
46 "" /* AVP_TYPE_GROUPED */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
47 "bytea" /* AVP_TYPE_OCTETSTRING */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 "integer" /* AVP_TYPE_INTEGER32 */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
49 "bigint" /* AVP_TYPE_INTEGER64 */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
50 "integer" /* AVP_TYPE_UNSIGNED32 + cast */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
51 "bigint" /* AVP_TYPE_UNSIGNED64 + cast */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
52 "real" /* AVP_TYPE_FLOAT32 */, |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
53 "double precision" /* AVP_TYPE_FLOAT64 */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
54 }; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
55 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
56 static const char * stmt = "acct_db_stmt"; |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
57 #ifndef TEST_DEBUG |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
58 static |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
59 #endif /* TEST_DEBUG */ |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
60 pthread_key_t connk; |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
61 static char * sql = NULL; /* The buffer that will contain the SQL query */ |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
62 static int nbrecords = 0; |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
63 |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
64 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
65 /* Initialize the database context: connection to the DB, prepared statement to insert new records */ |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
66 int acct_db_init(void) |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
67 { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
68 struct acct_record_list emptyrecords; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
69 struct fd_list * li; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
70 size_t sql_allocd = 0; /* The malloc'd size of the buffer */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
71 size_t sql_offset = 0; /* The actual data already written in this buffer */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
72 int idx = 0; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
73 PGresult * res; |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
74 PGconn *conn; |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
75 #define REALLOC_SIZE 1024 /* We extend the buffer by this amount */ |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
76 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
77 TRACE_ENTRY(); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
78 CHECK_PARAMS( acct_config && acct_config->conninfo && acct_config->tablename ); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
79 |
826
d38c8ce61e4e
Add check for pthread-safety of lib pgsql
Sebastien Decugis <sdecugis@freediameter.net>
parents:
772
diff
changeset
|
80 CHECK_PARAMS_DO( PQisthreadsafe() == 1, { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
871
diff
changeset
|
81 fd_log_debug("You PostGreSQL installation is not thread-safe!"); |
826
d38c8ce61e4e
Add check for pthread-safety of lib pgsql
Sebastien Decugis <sdecugis@freediameter.net>
parents:
772
diff
changeset
|
82 return EINVAL; |
d38c8ce61e4e
Add check for pthread-safety of lib pgsql
Sebastien Decugis <sdecugis@freediameter.net>
parents:
772
diff
changeset
|
83 } ); |
d38c8ce61e4e
Add check for pthread-safety of lib pgsql
Sebastien Decugis <sdecugis@freediameter.net>
parents:
772
diff
changeset
|
84 |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
85 /* Use the information from acct_config to create the connection and prepare the query */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
86 conn = PQconnectdb(acct_config->conninfo); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
87 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
88 /* Check to see that the backend connection was successfully made */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
89 if (PQstatus(conn) != CONNECTION_OK) { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
871
diff
changeset
|
90 fd_log_debug("Connection to database failed: %s", PQerrorMessage(conn)); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
91 acct_db_free(); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
92 return EINVAL; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
93 } |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
94 if (PQprotocolVersion(conn) < 3) { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
871
diff
changeset
|
95 fd_log_debug("Database protocol version is too old, version 3 is required for prepared statements."); |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
96 acct_db_free(); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
97 return EINVAL; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
98 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
99 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
100 TRACE_DEBUG(FULL, "Connection to database successful, server version %d.", PQserverVersion(conn)); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
101 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
102 /* Now, prepare the request object */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
103 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
104 /* First, we build the list of AVP we will insert in the database */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
105 CHECK_FCT( acct_rec_prepare(&emptyrecords) ); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
106 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
107 /* Now, prepare the text of the request */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
108 CHECK_MALLOC(sql = malloc(REALLOC_SIZE)); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
109 sql_allocd = REALLOC_SIZE; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
110 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
111 /* This macro hides the details of extending the buffer on each sprintf... */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
112 #define ADD_EXTEND(args...) { \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
113 size_t p; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
114 int loop = 0; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
115 do { \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
116 p = snprintf(sql + sql_offset, sql_allocd - sql_offset, ##args); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
117 if (p >= sql_allocd - sql_offset) { \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
118 /* Too short, extend the buffer and start again */ \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
119 CHECK_MALLOC( sql = realloc(sql, sql_allocd + REALLOC_SIZE) ); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
120 sql_allocd += REALLOC_SIZE; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
121 loop++; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
122 ASSERT(loop < 100); /* detect infinite loops */ \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
123 continue; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
124 } \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
125 sql_offset += p; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
126 break; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
127 } while (1); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
128 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
129 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
130 /* This macro allows to add a value in the SQL buffer while escaping in properly */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
131 #define ADD_ESCAPE(str) { \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
132 char * __s = (char *)str; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
133 /* Check we have at least twice the size available +1 */ \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
134 size_t p = strlen(__s); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
135 \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
136 while (sql_allocd - sql_offset < 2 * p + 1) { \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
137 /* Too short, extend the buffer */ \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
138 CHECK_MALLOC( sql = realloc(sql, sql_allocd + REALLOC_SIZE) ); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
139 sql_allocd += REALLOC_SIZE; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
140 } \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
141 \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
142 /* Now add the escaped string */ \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
143 p = PQescapeStringConn(conn, sql+sql_offset, __s, p, NULL); \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
144 sql_offset += p; \ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
145 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
146 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
147 /* INSERT INTO table (tsfield, field1, field2, ...) VALUES (now, $1::bytea, $2::integer, ...) */ |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
148 ADD_EXTEND("INSERT INTO %s (", acct_config->tablename); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
149 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
150 if (acct_config->tsfield) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
151 ADD_EXTEND("\""); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
152 ADD_ESCAPE(acct_config->tsfield); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
153 ADD_EXTEND("\", "); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
154 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
155 |
528
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
156 if (acct_config->srvnfield) { |
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
157 ADD_EXTEND("\""); |
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
158 ADD_ESCAPE(acct_config->srvnfield); |
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
159 ADD_EXTEND("\", "); |
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
160 } |
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
161 |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
162 for (li = emptyrecords.all.next; li != &emptyrecords.all; li = li->next) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
163 struct acct_record_item * i = (struct acct_record_item *)(li->o); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
164 ADD_EXTEND("\""); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
165 ADD_ESCAPE(i->param->field?:i->param->avpname); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
166 if (i->index) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
167 ADD_EXTEND("%d", i->index); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
168 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
169 if (li->next != &emptyrecords.all) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
170 ADD_EXTEND("\", "); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
171 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
172 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
173 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
174 ADD_EXTEND("\") VALUES ("); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
175 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
176 if (acct_config->tsfield) { |
1233
0b4abb03bcaf
Fix double increment when realloc resulting in invalid SQL query
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
177 ++idx; |
0b4abb03bcaf
Fix double increment when realloc resulting in invalid SQL query
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
178 ADD_EXTEND("$%d, ", idx); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
179 } |
528
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
180 if (acct_config->srvnfield) { |
534
6af365b6f955
Fix wrong separator in SQL query.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
528
diff
changeset
|
181 ADD_EXTEND("'"); |
528
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
182 ADD_ESCAPE(fd_g_config->cnf_diamid); |
534
6af365b6f955
Fix wrong separator in SQL query.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
528
diff
changeset
|
183 ADD_EXTEND("', "); |
528
1b3b9790e7cb
Add a new field in the app_acct.fdx database to receive the name of the local server.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
184 } |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
185 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
186 for (li = emptyrecords.all.next; li != &emptyrecords.all; li = li->next) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
187 struct acct_record_item * i = (struct acct_record_item *)(li->o); |
1233
0b4abb03bcaf
Fix double increment when realloc resulting in invalid SQL query
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
188 ++idx; |
0b4abb03bcaf
Fix double increment when realloc resulting in invalid SQL query
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
189 ADD_EXTEND("$%d::%s", idx, diam2db_types_mapping[i->param->avptype]); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
190 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
191 if (li->next != &emptyrecords.all) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
192 ADD_EXTEND(", "); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
193 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
194 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
195 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
196 ADD_EXTEND(");"); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
197 |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
871
diff
changeset
|
198 TRACE_DEBUG(FULL, "Preparing the following SQL statement: '%s'", sql); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
199 res = PQprepare(conn, stmt, sql, emptyrecords.nball, NULL); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
200 if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
201 TRACE_DEBUG(INFO, "Preparing statement '%s' failed: %s", |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
202 sql, PQerrorMessage(conn)); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
203 PQclear(res); |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
204 return EINVAL; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
205 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
206 PQclear(res); |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
207 nbrecords = emptyrecords.nball; |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
208 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
209 acct_rec_empty(&emptyrecords); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
210 |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
211 CHECK_POSIX( pthread_key_create(&connk, (void (*)(void*))PQfinish) ); |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
212 CHECK_POSIX( pthread_setspecific(connk, conn) ); |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
213 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
214 /* Ok, ready */ |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
215 return 0; |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
216 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
217 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
218 /* Terminate the connection to the DB */ |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
219 void acct_db_free(void) |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
220 { |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
221 CHECK_POSIX_DO(pthread_key_delete(connk) , ); |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
222 free(sql); |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
223 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
224 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
225 /* When a new message has been received, insert the content of the parsed mapping into the DB (using prepared statement) */ |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
226 int acct_db_insert(struct acct_record_list * records) |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
227 { |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
228 char **val; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
229 int *val_len; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
230 int *val_isbin; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
231 int idx = 0; |
292
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
232 int size = 0; |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
233 PGresult *res; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
234 struct fd_list *li; |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
235 PGconn *conn; |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
236 int new = 0; |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
237 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
238 TRACE_ENTRY("%p", records); |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
239 CHECK_PARAMS( records ); |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
240 |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
241 conn = pthread_getspecific(connk); |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
242 if (!conn) { |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
243 conn = PQconnectdb(acct_config->conninfo); |
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
244 CHECK_POSIX( pthread_setspecific(connk, conn) ); |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
245 |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
246 new = 1; |
771
eac79a449c06
Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
741
diff
changeset
|
247 } |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
248 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
249 /* First, check if the connection with the DB has not staled, and eventually try to fix it */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
250 if (PQstatus(conn) != CONNECTION_OK) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
251 /* Attempt a reset */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
252 PQreset(conn); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
253 if (PQstatus(conn) != CONNECTION_OK) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
254 TRACE_DEBUG(INFO, "Lost connection to the database server, and attempt to reestablish it failed"); |
871 | 255 TODO("Terminate the freeDiameter instance completely?"); |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
256 return ENOTCONN; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
257 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
258 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
259 |
772
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
260 if (new) { |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
261 /* Create the prepared statement for this ocnnection, it is not shared */ |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
262 res = PQprepare(conn, stmt, sql, nbrecords, NULL); |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
263 if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
264 TRACE_DEBUG(INFO, "Preparing statement '%s' failed: %s", |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
265 sql, PQerrorMessage(conn)); |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
266 PQclear(res); |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
267 return EINVAL; |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
268 } |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
269 PQclear(res); |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
270 } |
c6969f1af9f3
Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
771
diff
changeset
|
271 |
292
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
272 size = acct_config->tsfield ? records->nball + 1 : records->nball; |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
273 |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
274 /* Alloc the arrays of parameters */ |
292
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
275 CHECK_MALLOC( val = calloc(size, sizeof(const char *)) ); |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
276 CHECK_MALLOC( val_len = calloc(size, sizeof(const int)) ); |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
277 CHECK_MALLOC( val_isbin = calloc(size, sizeof(const int)) ); |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
278 |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
279 if (acct_config->tsfield) { |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
280 val[idx] = "now"; |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
281 val_len[idx] = 3; |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
282 val_isbin[idx] = 0; |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
283 idx++; |
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
284 } |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
285 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
286 /* Now write all the map'd records in these arrays */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
287 for (li = records->all.next; li != &records->all; li = li->next) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
288 struct acct_record_item * r = (struct acct_record_item *)(li->o); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
289 if (r->value) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
290 val_isbin[idx] = 1; /* We always pass binary parameters */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
291 switch (r->param->avptype) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
292 case AVP_TYPE_OCTETSTRING: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
293 val[idx] = (void *)(r->value->os.data); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
294 val_len[idx] = r->value->os.len; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
295 break; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
296 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
297 case AVP_TYPE_INTEGER32: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
298 case AVP_TYPE_UNSIGNED32: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
299 case AVP_TYPE_FLOAT32: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
300 r->scalar.v32 = htonl(r->value->u32); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
301 val[idx] = &r->scalar.c; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
302 val_len[idx] = sizeof(uint32_t); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
303 break; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
304 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
305 case AVP_TYPE_INTEGER64: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
306 case AVP_TYPE_UNSIGNED64: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
307 case AVP_TYPE_FLOAT64: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
308 r->scalar.v64 = htonll(r->value->u64); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
309 val[idx] = &r->scalar.c; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
310 val_len[idx] = sizeof(uint64_t); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
311 break; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
312 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
313 default: |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
314 ASSERT(0); /* detect bugs */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
315 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
316 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
317 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
318 idx++; |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
319 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
320 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
321 /* OK, now execute the SQL statement */ |
292
a77ed0e30ac9
Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
285
diff
changeset
|
322 res = PQexecPrepared(conn, stmt, size, (const char * const *)val, val_len, val_isbin, 1 /* We actually don't care here */); |
285
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
323 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
324 /* Done with the parameters */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
325 free(val); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
326 free(val_len); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
327 free(val_isbin); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
328 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
329 /* Now check the result code */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
330 if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
331 TRACE_DEBUG(INFO, "An error occurred while INSERTing in the database: %s", PQerrorMessage(conn)); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
332 PQclear(res); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
333 return EINVAL; /* It was probably a mistake in configuration file... */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
334 } |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
335 PQclear(res); |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
336 |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
337 /* Ok, we are done */ |
0daf6fc2b751
Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
284
diff
changeset
|
338 return 0; |
284
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
339 } |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
340 |
397cdcd41f53
New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
341 |