annotate extensions/app_acct/acct_db.c @ 974:2091bf698fb1

Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR (as far as sed could find them) with manual fixing afterwards.
author Thomas Klausner <tk@giga.or.at>
date Thu, 14 Mar 2013 18:14:35 +0100
parents 254d81d21d0b
children 1af09cc156d6
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 * *
837
1d2721778c7a Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 826
diff changeset
5 * Copyright (c) 2012, 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) {
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
177 ADD_EXTEND("$%d, ", ++idx);
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
178 }
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
179 if (acct_config->srvnfield) {
534
6af365b6f955 Fix wrong separator in SQL query.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 528
diff changeset
180 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
181 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
182 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
183 }
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
184
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
185 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
186 struct acct_record_item * i = (struct acct_record_item *)(li->o);
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
187 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
188
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
189 if (li->next != &emptyrecords.all) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
190 ADD_EXTEND(", ");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
191 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
192 }
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 ADD_EXTEND(");");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
195
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
196 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
197 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
198 if (PQresultStatus(res) != PGRES_COMMAND_OK) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
199 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
200 sql, PQerrorMessage(conn));
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
201 PQclear(res);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
202 return EINVAL;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
203 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
204 PQclear(res);
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
205 nbrecords = emptyrecords.nball;
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
206
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
207 acct_rec_empty(&emptyrecords);
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
208
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
209 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
210 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
211
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
212 /* Ok, ready */
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
213 return 0;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
214 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
215
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
216 /* Terminate the connection to the DB */
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
217 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
218 {
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
219 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
220 free(sql);
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
221 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
222
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
223 /* 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
224 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
225 {
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
226 char **val;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
227 int *val_len;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
228 int *val_isbin;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
229 int idx = 0;
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
230 int size = 0;
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
231 PGresult *res;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
232 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
233 PGconn *conn;
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
234 int new = 0;
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
235
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
236 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
237 CHECK_PARAMS( records );
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
238
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
239 conn = pthread_getspecific(connk);
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
240 if (!conn) {
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
241 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
242 CHECK_POSIX( pthread_setspecific(connk, conn) );
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
243
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
244 new = 1;
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
245 }
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
246
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
247 /* 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
248 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
249 /* Attempt a reset */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
250 PQreset(conn);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
251 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
252 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
253 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
254 return ENOTCONN;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
255 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
256 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
257
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
258 if (new) {
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
259 /* 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
260 res = PQprepare(conn, stmt, sql, nbrecords, NULL);
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
261 if (PQresultStatus(res) != PGRES_COMMAND_OK) {
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
262 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
263 sql, PQerrorMessage(conn));
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
264 PQclear(res);
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
265 return EINVAL;
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
266 }
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
267 PQclear(res);
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
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
270 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
271
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
272 /* Alloc the arrays of parameters */
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
273 CHECK_MALLOC( val = calloc(size, sizeof(const char *)) );
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
274 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
275 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
276
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
277 if (acct_config->tsfield) {
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
278 val[idx] = "now";
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
279 val_len[idx] = 3;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
280 val_isbin[idx] = 0;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
281 idx++;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
282 }
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
283
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
284 /* 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
285 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
286 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
287 if (r->value) {
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
288 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
289 switch (r->param->avptype) {
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
290 case AVP_TYPE_OCTETSTRING:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
291 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
292 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
293 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
294
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
295 case AVP_TYPE_INTEGER32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
296 case AVP_TYPE_UNSIGNED32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
297 case AVP_TYPE_FLOAT32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
298 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
299 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
300 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
301 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
302
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
303 case AVP_TYPE_INTEGER64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
304 case AVP_TYPE_UNSIGNED64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
305 case AVP_TYPE_FLOAT64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
306 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
307 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
308 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
309 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
310
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
311 default:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
312 ASSERT(0); /* detect bugs */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
313 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
314 }
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 idx++;
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
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
319 /* OK, now execute the SQL statement */
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
320 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
321
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
322 /* Done with the parameters */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
323 free(val);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
324 free(val_len);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
325 free(val_isbin);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
326
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
327 /* 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
328 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
329 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
330 PQclear(res);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
331 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
332 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
333 PQclear(res);
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 /* Ok, we are done */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
336 return 0;
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
337 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
338
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
339
"Welcome to our mercurial repository"