annotate extensions/app_acct/acct_db.c @ 772:c6969f1af9f3

Fix app_acct and associated test
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 01 Nov 2011 10:12:18 +0100
parents eac79a449c06
children d38c8ce61e4e
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 * *
741
d59decafe9c0 Updated copyright information
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 740
diff changeset
5 * Copyright (c) 2011, 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
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
80 /* 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
81 conn = PQconnectdb(acct_config->conninfo);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
82
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
83 /* 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
84 if (PQstatus(conn) != CONNECTION_OK) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
85 fd_log_debug("Connection to database failed: %s\n", PQerrorMessage(conn));
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
86 acct_db_free();
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
87 return EINVAL;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
88 }
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
89 if (PQprotocolVersion(conn) < 3) {
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
90 fd_log_debug("Database protocol version is too old, version 3 is required for prepared statements.\n");
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
91 acct_db_free();
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
92 return EINVAL;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
93 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
94
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
95 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
96
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
97 /* Now, prepare the request object */
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
98
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
99 /* 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
100 CHECK_FCT( acct_rec_prepare(&emptyrecords) );
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 text of the request */
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
103 CHECK_MALLOC(sql = malloc(REALLOC_SIZE));
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
104 sql_allocd = REALLOC_SIZE;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
105
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
106 /* 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
107 #define ADD_EXTEND(args...) { \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
108 size_t p; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
109 int loop = 0; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
110 do { \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
111 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
112 if (p >= sql_allocd - sql_offset) { \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
113 /* 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
114 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
115 sql_allocd += REALLOC_SIZE; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
116 loop++; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
117 ASSERT(loop < 100); /* detect infinite loops */ \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
118 continue; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
119 } \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
120 sql_offset += p; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
121 break; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
122 } while (1); \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
123 }
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 /* 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
126 #define ADD_ESCAPE(str) { \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
127 char * __s = (char *)str; \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
128 /* 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
129 size_t p = strlen(__s); \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
130 \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
131 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
132 /* Too short, extend the buffer */ \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
133 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
134 sql_allocd += REALLOC_SIZE; \
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 \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
137 /* Now add the escaped string */ \
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
138 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
139 sql_offset += p; \
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 /* 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
143 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
144
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
145 if (acct_config->tsfield) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
146 ADD_EXTEND("\"");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
147 ADD_ESCAPE(acct_config->tsfield);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
148 ADD_EXTEND("\", ");
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
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
151 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
152 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
153 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
154 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
155 }
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
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
157 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
158 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
159 ADD_EXTEND("\"");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
160 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
161 if (i->index) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
162 ADD_EXTEND("%d", i->index);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
163 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
164 if (li->next != &emptyrecords.all) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
165 ADD_EXTEND("\", ");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
166 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
167 }
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 ADD_EXTEND("\") VALUES (");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
170
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
171 if (acct_config->tsfield) {
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
172 ADD_EXTEND("$%d, ", ++idx);
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
173 }
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
174 if (acct_config->srvnfield) {
534
6af365b6f955 Fix wrong separator in SQL query.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 528
diff changeset
175 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
176 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
177 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
178 }
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
179
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
180 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
181 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
182 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
183
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
184 if (li->next != &emptyrecords.all) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
185 ADD_EXTEND(", ");
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
186 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
187 }
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 ADD_EXTEND(");");
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 TRACE_DEBUG(FULL, "Preparing the following SQL statement:\n%s\n", sql);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
192 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
193 if (PQresultStatus(res) != PGRES_COMMAND_OK) {
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
194 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
195 sql, PQerrorMessage(conn));
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
196 PQclear(res);
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
197 return EINVAL;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
198 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
199 PQclear(res);
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
200 nbrecords = emptyrecords.nball;
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
201
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
202 acct_rec_empty(&emptyrecords);
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
203
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
204 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
205 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
206
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
207 /* Ok, ready */
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
208 return 0;
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
209 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
210
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
211 /* Terminate the connection to the DB */
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
212 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
213 {
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
214 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
215 free(sql);
284
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 /* 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
219 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
220 {
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
221 char **val;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
222 int *val_len;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
223 int *val_isbin;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
224 int idx = 0;
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
225 int size = 0;
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
226 PGresult *res;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
227 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
228 PGconn *conn;
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
229 int new = 0;
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
230
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
231 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
232 CHECK_PARAMS( records );
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
233
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
234 conn = pthread_getspecific(connk);
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
235 if (!conn) {
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
236 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
237 CHECK_POSIX( pthread_setspecific(connk, conn) );
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
238
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
239 new = 1;
771
eac79a449c06 Making app_acct thread_safe for PGsql. NOT TESTED.
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 741
diff changeset
240 }
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
241
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
242 /* 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
243 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
244 /* Attempt a reset */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
245 PQreset(conn);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
246 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
247 TRACE_DEBUG(INFO, "Lost connection to the database server, and attempt to reestablish it failed");
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
248 TODO("Terminate the freeDiameter instance completly?");
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
249 return ENOTCONN;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
250 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
251 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
252
772
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
253 if (new) {
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
254 /* 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
255 res = PQprepare(conn, stmt, sql, nbrecords, NULL);
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
256 if (PQresultStatus(res) != PGRES_COMMAND_OK) {
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
257 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
258 sql, PQerrorMessage(conn));
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
259 PQclear(res);
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
260 return EINVAL;
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
261 }
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
262 PQclear(res);
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
263 }
c6969f1af9f3 Fix app_acct and associated test
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 771
diff changeset
264
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
265 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
266
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
267 /* Alloc the arrays of parameters */
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
268 CHECK_MALLOC( val = calloc(size, sizeof(const char *)) );
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
269 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
270 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
271
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
272 if (acct_config->tsfield) {
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
273 val[idx] = "now";
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
274 val_len[idx] = 3;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
275 val_isbin[idx] = 0;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
276 idx++;
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
277 }
285
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
278
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
279 /* 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
280 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
281 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
282 if (r->value) {
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
283 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
284 switch (r->param->avptype) {
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
285 case AVP_TYPE_OCTETSTRING:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
286 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
287 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
288 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
289
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
290 case AVP_TYPE_INTEGER32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
291 case AVP_TYPE_UNSIGNED32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
292 case AVP_TYPE_FLOAT32:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
293 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
294 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
295 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
296 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
297
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
298 case AVP_TYPE_INTEGER64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
299 case AVP_TYPE_UNSIGNED64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
300 case AVP_TYPE_FLOAT64:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
301 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
302 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
303 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
304 break;
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
305
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
306 default:
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
307 ASSERT(0); /* detect bugs */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
308 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
309 }
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 idx++;
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
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
314 /* OK, now execute the SQL statement */
292
a77ed0e30ac9 Fix non-working timestamp field
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 285
diff changeset
315 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
316
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
317 /* Done with the parameters */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
318 free(val);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
319 free(val_len);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
320 free(val_isbin);
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 /* 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
323 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
324 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
325 PQclear(res);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
326 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
327 }
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
328 PQclear(res);
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
329
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
330 /* Ok, we are done */
0daf6fc2b751 Added a test case for the app_acct extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 284
diff changeset
331 return 0;
284
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
332 }
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
333
397cdcd41f53 New app_acct in progress, backup only
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
334
"Welcome to our mercurial repository"