2 This file is part of GNUnet.
3 (C) 2006 - 2009 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file src/dht/plugin_dhtlog_mysql_dump.c
23 * @brief MySQL logging plugin to record DHT operations to MySQL server,
24 * but write all queries to file instead of the actual server
25 * so that they can be imported later. The idea is that connecting
26 * to the MySQL server X times can be really problematic, but hopefully
27 * writing to a single file is more reliable.
28 * @author Nathan Evans
34 #include "gnunet_util_lib.h"
38 #define DEBUG_DHTLOG GNUNET_YES
41 * Maximum number of supported parameters for a prepared
42 * statement. Increase if needed.
47 static unsigned long max_varchar_len;
50 * The configuration the DHT service is running with
52 static const struct GNUNET_CONFIGURATION_Handle *cfg;
54 #define INSERT_QUERIES_STMT "prepare insert_query from 'INSERT INTO queries (trialuid, querytype, hops, dhtkeyuid, dhtqueryid, succeeded, nodeuid, time) "\
55 "VALUES (@temp_trial, ?, ?, ?, ?, ?, ?, ?)'"
57 #define INSERT_ROUTES_STMT "prepare insert_route from 'INSERT INTO routes (trialuid, querytype, hops, dhtkeyuid, dhtqueryid, succeeded, nodeuid, from_node, to_node) "\
58 "VALUES (@temp_trial, ?, ?, ?, ?, ?, ?, ?, ?)'"
60 #define INSERT_NODES_STMT "prepare insert_node from 'INSERT ignore INTO nodes (trialuid, nodeid) "\
61 "VALUES (@temp_trial, ?)'"
63 #define INSERT_TOPOLOGY_STMT "prepare insert_topology from 'INSERT INTO topology (trialuid, date, connections) "\
64 "VALUES (@temp_trial, ?, ?)'"
66 #define INSERT_ROUND_STMT "prepare insert_round from 'INSERT INTO rounds (trialuid, round_type, round_count, starttime) VALUES (@temp_trial, @rtype, @rcount, @curr_time)'"
68 #define INSERT_ROUND_DETAILS_STMT "prepare insert_round_details from 'INSERT INTO processed_trial_rounds "\
69 "(trialuid, round_type, round_count, starttime, endtime, num_messages, num_messages_succeeded)"\
70 "VALUES (@temp_trial, @rtype, @rcount, @curr_time, @curr_time, @totalmsgs, @msgssucceeded)'"
72 #define EXTEND_TOPOLOGY_STMT "prepare extend_topology from 'INSERT INTO extended_topology (topology_uid, uid_first, uid_second) "\
73 "VALUES (@temp_topology, ?, ?)'"
75 #define UPDATE_TOPOLOGY_STMT "prepare update_topology from 'update topology set connections = ? where topology_uid = @temp_topology'"
77 #define SET_MALICIOUS_STMT "prepare set_malicious from 'update nodes set malicious_dropper = 1 where trialuid = @temp_trial and nodeid = @temp_node'"
79 #define INSERT_TRIALS_STMT "prepare insert_trial from 'INSERT INTO trials"\
80 "(starttime, other_trial_identifier, numnodes, topology,"\
81 "topology_percentage, topology_probability,"\
82 "blacklist_topology, connect_topology, connect_topology_option,"\
83 "connect_topology_option_modifier, puts, gets, "\
84 "concurrent, settle_time, num_rounds, malicious_getters,"\
85 "malicious_putters, malicious_droppers, malicious_get_frequency,"\
86 "malicious_put_frequency, stop_closest, stop_found, strict_kademlia, "\
87 "gets_succeeded, message) "\
88 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'"
90 #define INSERT_GENERIC_STAT_STMT "prepare insert_generic_stat from 'INSERT INTO generic_stats" \
91 "(trialuid, nodeuid, section, name, value)"\
92 "VALUES (@temp_trial, @temp_node, @temp_section, @temp_stat, @temp_value)'"
94 #define INSERT_STAT_STMT "prepare insert_stat from 'INSERT INTO node_statistics"\
95 "(trialuid, nodeuid, route_requests,"\
96 "route_forwards, result_requests,"\
97 "client_results, result_forwards, gets,"\
98 "puts, data_inserts, find_peer_requests, "\
99 "find_peers_started, gets_started, puts_started, find_peer_responses_received,"\
100 "get_responses_received, find_peer_responses_sent, get_responses_sent) "\
101 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'"
103 #define INSERT_DHTKEY_STMT "prepare insert_dhtkey from 'INSERT ignore INTO dhtkeys (dhtkey, trialuid) "\
104 "VALUES (?, @temp_trial)'"
106 #define UPDATE_TRIALS_STMT "prepare update_trial from 'UPDATE trials set endtime= ?, gets_succeeded = ? where trialuid = @temp_trial'"
108 #define UPDATE_CONNECTIONS_STMT "prepare update_conn from 'UPDATE trials set totalConnections = ? where trialuid = @temp_trial'"
110 #define GET_TRIAL_STMT "prepare select_trial from 'SELECT MAX( trialuid ) FROM trials into @temp_trial'"
112 #define GET_TOPOLOGY_STMT "prepare select_topology from 'SELECT MAX( topology_uid ) FROM topology into @temp_topology'"
114 #define GET_DHTKEYUID_STMT "prepare get_dhtkeyuid from 'SELECT dhtkeyuid FROM dhtkeys where dhtkey = ? and trialuid = @temp_trial'"
116 #define GET_NODEUID_STMT "prepare get_nodeuid from 'SELECT nodeuid FROM nodes where trialuid = @temp_trial and nodeid = ?'"
118 #define DATE_STR_SIZE 50
121 * File to dump all sql statements to.
129 static char date[DATE_STR_SIZE];
134 memset (date, 0, DATE_STR_SIZE);
135 tmptr = localtime (&timetmp);
137 strftime (date, DATE_STR_SIZE, "%Y-%m-%d %H:%M:%S", tmptr);
145 * Create a prepared statement.
147 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
150 prepared_statement_create (const char *statement)
152 if (fprintf(outfile, "%s;\n", statement) > 0)
155 return GNUNET_SYSERR;
159 * Initialize the prepared statements for use with dht test logging
164 #define PINIT(a) (GNUNET_OK != (prepared_statement_create(a)))
165 if (PINIT (INSERT_QUERIES_STMT) ||
166 PINIT (INSERT_ROUTES_STMT) ||
167 PINIT (INSERT_ROUND_STMT) ||
168 PINIT (INSERT_ROUND_DETAILS_STMT) ||
169 PINIT (INSERT_TRIALS_STMT) ||
170 PINIT (SET_MALICIOUS_STMT) ||
171 PINIT (INSERT_GENERIC_STAT_STMT) ||
172 PINIT (INSERT_STAT_STMT) ||
173 PINIT (INSERT_NODES_STMT) ||
174 PINIT (INSERT_DHTKEY_STMT) ||
175 PINIT (UPDATE_TRIALS_STMT) ||
176 PINIT (GET_DHTKEYUID_STMT) ||
177 PINIT (GET_NODEUID_STMT) ||
178 PINIT (UPDATE_CONNECTIONS_STMT) ||
179 PINIT (INSERT_TOPOLOGY_STMT) ||
180 PINIT (EXTEND_TOPOLOGY_STMT) ||
181 PINIT (UPDATE_TOPOLOGY_STMT) ||
182 PINIT (GET_TRIAL_STMT) ||
183 PINIT (GET_TOPOLOGY_STMT))
185 return GNUNET_SYSERR;
193 * Inserts the specified round into the dhttests.rounds table
195 * @param round_type the type of round that is being started
196 * @param round_count counter for the round (if applicable)
198 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
200 int add_round (unsigned int round_type, unsigned int round_count)
204 return GNUNET_SYSERR;
206 ret = fprintf(outfile, "set @curr_time = \"%s\", @rtype = \"%u\", @rcount = \"%u\";\n", get_sql_time(), round_type, round_count);
209 return GNUNET_SYSERR;
210 ret = fprintf(outfile, "execute insert_round;\n");
214 return GNUNET_SYSERR;
218 * Inserts the specified round results into the
219 * dhttests.processed_round_details table
221 * @param round_type the type of round that is being started
222 * @param round_count counter for the round (if applicable)
223 * @param num_messages the total number of messages initiated
224 * @param num_messages_succeeded the number of messages that succeeded
226 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
228 int add_round_details (unsigned int round_type, unsigned int round_count,
229 unsigned int num_messages, unsigned int num_messages_succeeded)
233 return GNUNET_SYSERR;
235 ret = fprintf(outfile, "set @curr_time = \"%s\", @rtype = \"%u\", @rcount = \"%u\", @totalmsgs = \"%u\", @msgssucceeded = \"%u\";\n",
236 get_sql_time(), round_type, round_count, num_messages, num_messages_succeeded);
239 return GNUNET_SYSERR;
240 ret = fprintf(outfile, "execute insert_round_details;\n");
244 return GNUNET_SYSERR;
248 * Records the current topology (number of connections, time, trial)
250 * @param num_connections how many connections are in the topology
252 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
255 add_topology (int num_connections)
259 return GNUNET_SYSERR;
261 ret = fprintf(outfile, "set @date = \"%s\", @num = %d;\n", get_sql_time(), num_connections);
264 return GNUNET_SYSERR;
265 ret = fprintf(outfile, "execute insert_topology using "
268 return GNUNET_SYSERR;
270 ret = fprintf(outfile, "execute select_topology;\n");
274 return GNUNET_SYSERR;
278 * Records a connection between two peers in the current topology
280 * @param first one side of the connection
281 * @param second other side of the connection
283 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
286 add_extended_topology (const struct GNUNET_PeerIdentity *first, const struct GNUNET_PeerIdentity *second)
290 return GNUNET_SYSERR;
293 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_first_node;\n", GNUNET_h2s_full(&first->hashPubKey));
295 ret = fprintf(outfile, "set @temp_first_node = 0;\n");
298 return GNUNET_SYSERR;
301 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_second_node;\n", GNUNET_h2s_full(&second->hashPubKey));
303 ret = fprintf(outfile, "set @temp_second_node = 0;\n");
306 return GNUNET_SYSERR;
308 ret = fprintf(outfile, "execute extend_topology using "
309 "@temp_first_node, @temp_second_node;\n");
313 return GNUNET_SYSERR;
318 * Inserts the specified trial into the dhttests.trials table
320 * @param trial_info struct containing the data to insert about this trial
322 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
324 int add_trial (struct GNUNET_DHTLOG_TrialInfo *trial_info)
329 return GNUNET_SYSERR;
331 ret = fprintf(outfile, "set @date = \"%s\", @oid = %u, @num = %u, @topology = %u, @bl = %u, "
332 "@connect = %u, @c_t_o = %u, @c_t_o_m = %f, @t_p = %f, "
333 "@t_pr = %f, @puts = %u, @gets = %u, "
334 "@concurrent = %u, @settle = %u, @rounds = %u, "
335 "@m_gets = %u, @m_puts = %u, @m_drops = %u, "
336 "@m_g_f = %u, @m_p_f = %u, @s_c = %u, @s_f = %u,"
337 "@s_k = %u, @g_s = %u, @message = \"%s\";\n",
338 get_sql_time(), trial_info->other_identifier, trial_info->num_nodes, trial_info->topology,
339 trial_info->blacklist_topology, trial_info->connect_topology,
340 trial_info->connect_topology_option, trial_info->connect_topology_option_modifier,
341 trial_info->topology_percentage, trial_info->topology_probability,
342 trial_info->puts, trial_info->gets, trial_info->concurrent, trial_info->settle_time,
343 trial_info->num_rounds, trial_info->malicious_getters, trial_info->malicious_putters,
344 trial_info->malicious_droppers, trial_info->malicious_get_frequency, trial_info->malicious_put_frequency,
345 trial_info->stop_closest, trial_info->stop_found, trial_info->strict_kademlia, trial_info->gets_succeeded, trial_info->message);
348 return GNUNET_SYSERR;
349 ret = fprintf(outfile, "execute insert_trial using "
350 "@date, @oid, @num, @topology, @t_p, @t_pr,"
351 " @bl, @connect, @c_t_o,"
352 "@c_t_o_m, @puts, @gets,"
353 "@concurrent, @settle, @rounds,"
354 "@m_gets, @m_puts, @m_drops,"
355 "@m_g_f, @m_p_f, @s_c, @s_f,"
356 "@s_k, @g_s, @message;\n");
358 return GNUNET_SYSERR;
359 ret = fprintf(outfile, "execute select_trial;\n");
363 return GNUNET_SYSERR;
368 * Inserts the specified stats into the dhttests.generic_stats table
370 * @param peer the peer inserting the statistic
371 * @param name the name of the statistic
372 * @param section the section of the statistic
373 * @param value the value of the statistic
375 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
378 add_generic_stat (const struct GNUNET_PeerIdentity *peer,
380 const char *section, uint64_t value)
384 return GNUNET_SYSERR;
387 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&peer->hashPubKey));
389 ret = fprintf(outfile, "set @temp_node = 0;\n");
392 return GNUNET_SYSERR;
394 ret = fprintf(outfile, "set @temp_section = \"%s\", @temp_stat = \"%s\", @temp_value = %llu;\n",
395 section, name, (unsigned long long)value);
398 return GNUNET_SYSERR;
400 ret = fprintf(outfile, "execute insert_generic_stat;\n");
403 return GNUNET_SYSERR;
409 * Inserts the specified stats into the dhttests.node_statistics table
411 * @param peer the peer inserting the statistic
412 * @param route_requests route requests seen
413 * @param route_forwards route requests forwarded
414 * @param result_requests route result requests seen
415 * @param client_requests client requests initiated
416 * @param result_forwards route results forwarded
417 * @param gets get requests handled
418 * @param puts put requests handle
419 * @param data_inserts data inserted at this node
420 * @param find_peer_requests find peer requests seen
421 * @param find_peers_started find peer requests initiated at this node
422 * @param gets_started get requests initiated at this node
423 * @param puts_started put requests initiated at this node
424 * @param find_peer_responses_received find peer responses received locally
425 * @param get_responses_received get responses received locally
426 * @param find_peer_responses_sent find peer responses sent from this node
427 * @param get_responses_sent get responses sent from this node
429 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
432 add_stat (const struct GNUNET_PeerIdentity *peer, unsigned int route_requests,
433 unsigned int route_forwards, unsigned int result_requests,
434 unsigned int client_requests, unsigned int result_forwards,
435 unsigned int gets, unsigned int puts,
436 unsigned int data_inserts, unsigned int find_peer_requests,
437 unsigned int find_peers_started, unsigned int gets_started,
438 unsigned int puts_started, unsigned int find_peer_responses_received,
439 unsigned int get_responses_received, unsigned int find_peer_responses_sent,
440 unsigned int get_responses_sent)
444 return GNUNET_SYSERR;
447 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&peer->hashPubKey));
449 ret = fprintf(outfile, "set @temp_node = 0;\n");
451 return GNUNET_SYSERR;
453 ret = fprintf(outfile, "set @r_r = %u, @r_f = %u, @res_r = %u, @c_r = %u, "
454 "@res_f = %u, @gets = %u, @puts = %u, @d_i = %u, "
455 "@f_p_r = %u, @f_p_s = %u, @g_s = %u, @p_s = %u, "
456 "@f_p_r_r = %u, @g_r_r = %u, @f_p_r_s = %u, @g_r_s = %u;\n",
457 route_requests, route_forwards, result_requests,
458 client_requests, result_forwards, gets, puts,
459 data_inserts, find_peer_requests, find_peers_started,
460 gets_started, puts_started, find_peer_responses_received,
461 get_responses_received, find_peer_responses_sent,
465 return GNUNET_SYSERR;
467 ret = fprintf(outfile, "execute insert_stat using "
468 "@temp_trial, @temp_node, @r_r, @r_f, @res_r, @c_r, "
469 "@res_f, @gets, @puts, @d_i, "
470 "@f_p_r, @f_p_s, @g_s, @p_s, "
471 "@f_p_r_r, @g_r_r, @f_p_r_s, @g_r_s;\n");
473 return GNUNET_SYSERR;
477 * Inserts the specified dhtkey into the dhttests.dhtkeys table,
478 * stores return value of dhttests.dhtkeys.dhtkeyuid into dhtkeyuid
480 * @param dhtkeyuid return value
481 * @param dhtkey hashcode of key to insert
483 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
486 add_dhtkey (unsigned long long *dhtkeyuid, const GNUNET_HashCode * dhtkey)
489 if (dhtkeyuid != NULL)
493 return GNUNET_SYSERR;
496 ret = fprintf(outfile, "set @dhtkey = \"%s\";\n", GNUNET_h2s_full(dhtkey));
498 ret = fprintf(outfile, "set @dhtkey = XXXXX;\n");
501 return GNUNET_SYSERR;
502 ret = fprintf(outfile, "execute insert_dhtkey using @dhtkey;\n");
506 return GNUNET_SYSERR;
510 * Inserts the specified node into the dhttests.nodes table
512 * @param nodeuid the inserted node uid
513 * @param node the node to insert
515 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
518 add_node (unsigned long long *nodeuid, struct GNUNET_PeerIdentity * node)
523 return GNUNET_SYSERR;
526 return GNUNET_SYSERR;
528 ret = fprintf(outfile, "set @node = \"%s\";\n", GNUNET_h2s_full(&node->hashPubKey));
531 return GNUNET_SYSERR;
533 ret = fprintf(outfile, "execute insert_node using @node;\n");
537 return GNUNET_SYSERR;
541 * Update dhttests.trials table with current server time as end time
543 * @param gets_succeeded how many gets did the testcase report as successful
545 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
548 update_trials (unsigned int gets_succeeded)
553 return GNUNET_SYSERR;
555 ret = fprintf(outfile, "set @date = \"%s\", @g_s = %u;\n", get_sql_time(), gets_succeeded);
558 return GNUNET_SYSERR;
560 ret = fprintf(outfile, "execute update_trial using @date, @g_s;\n");
565 return GNUNET_SYSERR;
570 * Update dhttests.nodes table setting the identified
571 * node as a malicious dropper.
573 * @param peer the peer that was set to be malicious
575 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
578 set_malicious (struct GNUNET_PeerIdentity *peer)
583 return GNUNET_SYSERR;
585 ret = fprintf(outfile, "set @temp_node = \"%s\";\n", GNUNET_h2s_full(&peer->hashPubKey));
588 return GNUNET_SYSERR;
590 ret = fprintf(outfile, "execute set_malicious;\n");
595 return GNUNET_SYSERR;
600 * Update dhttests.trials table with total connections information
602 * @param totalConnections the number of connections
604 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
607 add_connections (unsigned int totalConnections)
612 return GNUNET_SYSERR;
614 ret = fprintf(outfile, "set @conns = %u;\n", totalConnections);
617 return GNUNET_SYSERR;
619 ret = fprintf(outfile, "execute update_conn using @conns;\n");
624 return GNUNET_SYSERR;
629 * Update dhttests.topology table with total connections information
631 * @param totalConnections the number of connections
633 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
636 update_topology (unsigned int connections)
640 return GNUNET_SYSERR;
642 ret = fprintf(outfile, "set @temp_conns = %u;\n", connections);
645 return GNUNET_SYSERR;
647 ret = fprintf(outfile, "execute update_topology using @temp_conns;\n");
652 return GNUNET_SYSERR;
656 * Inserts the specified query into the dhttests.queries table
658 * @param sqlqueruid inserted query uid
659 * @param queryid dht query id
660 * @param type type of the query
661 * @param hops number of hops query traveled
662 * @param succeeded whether or not query was successful
663 * @param node the node the query hit
664 * @param key the key of the query
666 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
669 add_query (unsigned long long *sqlqueryuid, unsigned long long queryid,
670 unsigned int type, unsigned int hops, int succeeded,
671 const struct GNUNET_PeerIdentity * node, const GNUNET_HashCode * key)
676 return GNUNET_SYSERR;
678 if (sqlqueryuid != NULL)
682 ret = fprintf(outfile, "select dhtkeyuid from dhtkeys where trialuid = @temp_trial and dhtkey = \"%s\" into @temp_dhtkey;\n", GNUNET_h2s_full(key));
684 ret = fprintf(outfile, "set @temp_dhtkey = 0;\n");
687 return GNUNET_SYSERR;
690 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&node->hashPubKey));
692 ret = fprintf(outfile, "set @temp_node = 0;\n");
695 return GNUNET_SYSERR;
697 ret = fprintf(outfile, "set @qid = %llu, @type = %u, @hops = %u, @succ = %d, @time = \"%s\";\n", queryid, type, hops, succeeded, get_sql_time());
700 return GNUNET_SYSERR;
702 ret = fprintf(outfile, "execute insert_query using @type, @hops, @temp_dhtkey, @qid, @succ, @temp_node, @time;\n");
707 return GNUNET_SYSERR;
711 * Inserts the specified route information into the dhttests.routes table
713 * @param sqlqueruid inserted query uid
714 * @param queryid dht query id
715 * @param type type of the query
716 * @param hops number of hops query traveled
717 * @param succeeded whether or not query was successful
718 * @param node the node the query hit
719 * @param key the key of the query
720 * @param from_node the node that sent the message to node
721 * @param to_node next node to forward message to
723 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
726 add_route (unsigned long long *sqlqueryuid, unsigned long long queryid,
727 unsigned int type, unsigned int hops,
728 int succeeded, const struct GNUNET_PeerIdentity * node,
729 const GNUNET_HashCode * key, const struct GNUNET_PeerIdentity * from_node,
730 const struct GNUNET_PeerIdentity * to_node)
735 return GNUNET_SYSERR;
737 if (sqlqueryuid != NULL)
741 ret = fprintf(outfile, "select dhtkeyuid from dhtkeys where trialuid = @temp_trial and dhtkey = \"%s\" into @temp_dhtkey;\n", GNUNET_h2s_full(key));
743 ret = fprintf(outfile, "set @temp_dhtkey = 0;\n");
746 return GNUNET_SYSERR;
749 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&node->hashPubKey));
751 ret = fprintf(outfile, "set @temp_node = 0;\n");
754 return GNUNET_SYSERR;
756 if (from_node != NULL)
757 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_from_node;\n", GNUNET_h2s_full(&from_node->hashPubKey));
759 ret = fprintf(outfile, "set @temp_from_node = 0;\n");
762 return GNUNET_SYSERR;
765 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_to_node;\n", GNUNET_h2s_full(&to_node->hashPubKey));
767 ret = fprintf(outfile, "set @temp_to_node = 0;\n");
770 return GNUNET_SYSERR;
772 ret = fprintf(outfile, "set @qid = %llu, @type = %u, @hops = %u, @succ = %d;\n", queryid, type, hops, succeeded);
775 return GNUNET_SYSERR;
777 ret = fprintf(outfile, "execute insert_route using @type, @hops, @temp_dhtkey, @qid, @succ, @temp_node, @temp_from_node, @temp_to_node;\n");
782 return GNUNET_SYSERR;
786 * Provides the dhtlog api
788 * @param c the configuration to use to connect to a server
790 * @return the handle to the server, or NULL on error
793 libgnunet_plugin_dhtlog_mysql_dump_init (void * cls)
795 struct GNUNET_DHTLOG_Plugin *plugin = cls;
802 max_varchar_len = 255;
804 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MySQL (DUMP) DHT Logger: initializing\n");
806 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (plugin->cfg,
810 outfile_path = GNUNET_strdup("");
813 GNUNET_asprintf (&outfile_name,
819 fn = GNUNET_STRINGS_filename_expand (outfile_name);
823 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("Failed to get full path for `%s'\n"), outfile_name);
824 GNUNET_free(outfile_path);
825 GNUNET_free(outfile_name);
829 dirwarn = (GNUNET_OK != GNUNET_DISK_directory_create_for_file (fn));
830 outfile = FOPEN (fn, "w");
834 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "fopen", fn);
836 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
837 _("Failed to create or access directory for log file `%s'\n"),
839 GNUNET_free(outfile_path);
840 GNUNET_free(outfile_name);
845 GNUNET_free (outfile_path);
846 GNUNET_free (outfile_name);
849 if (iopen () != GNUNET_OK)
851 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
852 _("Failed to create file for dhtlog.\n"));
855 GNUNET_assert(plugin->dhtlog_api == NULL);
856 plugin->dhtlog_api = GNUNET_malloc(sizeof(struct GNUNET_DHTLOG_Handle));
857 plugin->dhtlog_api->insert_trial = &add_trial;
858 plugin->dhtlog_api->insert_round = &add_round;
859 plugin->dhtlog_api->insert_round_details = &add_round_details;
860 plugin->dhtlog_api->insert_stat = &add_stat;
861 plugin->dhtlog_api->insert_query = &add_query;
862 plugin->dhtlog_api->update_trial = &update_trials;
863 plugin->dhtlog_api->insert_route = &add_route;
864 plugin->dhtlog_api->insert_node = &add_node;
865 plugin->dhtlog_api->insert_dhtkey = &add_dhtkey;
866 plugin->dhtlog_api->update_connections = &add_connections;
867 plugin->dhtlog_api->insert_topology = &add_topology;
868 plugin->dhtlog_api->insert_extended_topology = &add_extended_topology;
869 plugin->dhtlog_api->update_topology = &update_topology;
870 plugin->dhtlog_api->set_malicious = &set_malicious;
871 plugin->dhtlog_api->add_generic_stat = &add_generic_stat;
877 * Shutdown the plugin.
880 libgnunet_plugin_dhtlog_mysql_dump_done (void * cls)
882 struct GNUNET_DHTLOG_Handle *dhtlog_api = cls;
883 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
884 "MySQL DHT Logger: database shutdown\n");
885 GNUNET_assert(dhtlog_api != NULL);
887 GNUNET_free(dhtlog_api);
891 /* end of plugin_dhtlog_mysql.c */