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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
254d81d21d0b Fix some typos.
Thomas Klausner <tk@giga.or.at>
parents: 837
diff changeset
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
"Welcome to our mercurial repository"