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 EXTEND_TOPOLOGY_STMT "prepare extend_topology from 'INSERT INTO extended_topology (topology_uid, uid_first, uid_second) "\
69 "VALUES (@temp_topology, ?, ?)'"
71 #define UPDATE_TOPOLOGY_STMT "prepare update_topology from 'update topology set connections = ? where topology_uid = @temp_topology'"
73 #define SET_MALICIOUS_STMT "prepare set_malicious from 'update nodes set malicious_dropper = 1 where trialuid = @temp_trial and nodeid = @temp_node'"
75 #define INSERT_TRIALS_STMT "prepare insert_trial from 'INSERT INTO trials"\
76 "(starttime, other_trial_identifier, numnodes, topology,"\
77 "topology_percentage, topology_probability,"\
78 "blacklist_topology, connect_topology, connect_topology_option,"\
79 "connect_topology_option_modifier, puts, gets, "\
80 "concurrent, settle_time, num_rounds, malicious_getters,"\
81 "malicious_putters, malicious_droppers, malicious_get_frequency,"\
82 "malicious_put_frequency, stop_closest, stop_found, strict_kademlia, "\
83 "gets_succeeded, message) "\
84 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'"
86 #define INSERT_GENERIC_STAT_STMT "prepare insert_generic_stat from 'INSERT INTO generic_stats" \
87 "(trialuid, nodeuid, section, name, value)"\
88 "VALUES (@temp_trial, @temp_node, @temp_section, @temp_stat, @temp_value)'"
90 #define INSERT_STAT_STMT "prepare insert_stat from 'INSERT INTO node_statistics"\
91 "(trialuid, nodeuid, route_requests,"\
92 "route_forwards, result_requests,"\
93 "client_results, result_forwards, gets,"\
94 "puts, data_inserts, find_peer_requests, "\
95 "find_peers_started, gets_started, puts_started, find_peer_responses_received,"\
96 "get_responses_received, find_peer_responses_sent, get_responses_sent) "\
97 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'"
99 #define INSERT_DHTKEY_STMT "prepare insert_dhtkey from 'INSERT ignore INTO dhtkeys (dhtkey, trialuid) "\
100 "VALUES (?, @temp_trial)'"
102 #define UPDATE_TRIALS_STMT "prepare update_trial from 'UPDATE trials set endtime= ?, gets_succeeded = ? where trialuid = @temp_trial'"
104 #define UPDATE_CONNECTIONS_STMT "prepare update_conn from 'UPDATE trials set totalConnections = ? where trialuid = @temp_trial'"
106 #define GET_TRIAL_STMT "prepare select_trial from 'SELECT MAX( trialuid ) FROM trials into @temp_trial'"
108 #define GET_TOPOLOGY_STMT "prepare select_topology from 'SELECT MAX( topology_uid ) FROM topology into @temp_topology'"
110 #define GET_DHTKEYUID_STMT "prepare get_dhtkeyuid from 'SELECT dhtkeyuid FROM dhtkeys where dhtkey = ? and trialuid = @temp_trial'"
112 #define GET_NODEUID_STMT "prepare get_nodeuid from 'SELECT nodeuid FROM nodes where trialuid = @temp_trial and nodeid = ?'"
114 #define DATE_STR_SIZE 50
117 * File to dump all sql statements to.
125 static char date[DATE_STR_SIZE];
130 memset (date, 0, DATE_STR_SIZE);
131 tmptr = localtime (&timetmp);
133 strftime (date, DATE_STR_SIZE, "%Y-%m-%d %H:%M:%S", tmptr);
141 * Create a prepared statement.
143 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
146 prepared_statement_create (const char *statement)
148 if (fprintf(outfile, "%s;\n", statement) > 0)
151 return GNUNET_SYSERR;
155 * Initialize the prepared statements for use with dht test logging
160 #define PINIT(a) (GNUNET_OK != (prepared_statement_create(a)))
161 if (PINIT (INSERT_QUERIES_STMT) ||
162 PINIT (INSERT_ROUTES_STMT) ||
163 PINIT (INSERT_ROUND_STMT) ||
164 PINIT (INSERT_TRIALS_STMT) ||
165 PINIT (SET_MALICIOUS_STMT) ||
166 PINIT (INSERT_GENERIC_STAT_STMT) ||
167 PINIT (INSERT_STAT_STMT) ||
168 PINIT (INSERT_NODES_STMT) ||
169 PINIT (INSERT_DHTKEY_STMT) ||
170 PINIT (UPDATE_TRIALS_STMT) ||
171 PINIT (GET_DHTKEYUID_STMT) ||
172 PINIT (GET_NODEUID_STMT) ||
173 PINIT (UPDATE_CONNECTIONS_STMT) ||
174 PINIT (INSERT_TOPOLOGY_STMT) ||
175 PINIT (EXTEND_TOPOLOGY_STMT) ||
176 PINIT (UPDATE_TOPOLOGY_STMT) ||
177 PINIT (GET_TRIAL_STMT) ||
178 PINIT (GET_TOPOLOGY_STMT))
180 return GNUNET_SYSERR;
188 * Inserts the specified round into the dhttests.rounds table
190 * @param round_type the type of round that is being started
191 * @param round_count counter for the round (if applicable)
193 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
195 int add_round (unsigned int round_type, unsigned int round_count)
199 return GNUNET_SYSERR;
201 ret = fprintf(outfile, "set @curr_time = \"%s\", @rtype = \"%u\", @rcount = \"%u\";\n", get_sql_time(), round_type, round_count);
204 return GNUNET_SYSERR;
205 ret = fprintf(outfile, "execute insert_round;\n");
209 return GNUNET_SYSERR;
213 * Records the current topology (number of connections, time, trial)
215 * @param num_connections how many connections are in the topology
217 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
220 add_topology (int num_connections)
224 return GNUNET_SYSERR;
226 ret = fprintf(outfile, "set @date = \"%s\", @num = %d;\n", get_sql_time(), num_connections);
229 return GNUNET_SYSERR;
230 ret = fprintf(outfile, "execute insert_topology using "
233 return GNUNET_SYSERR;
235 ret = fprintf(outfile, "execute select_topology;\n");
239 return GNUNET_SYSERR;
243 * Records a connection between two peers in the current topology
245 * @param first one side of the connection
246 * @param second other side of the connection
248 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
251 add_extended_topology (const struct GNUNET_PeerIdentity *first, const struct GNUNET_PeerIdentity *second)
255 return GNUNET_SYSERR;
258 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_first_node;\n", GNUNET_h2s_full(&first->hashPubKey));
260 ret = fprintf(outfile, "set @temp_first_node = 0;\n");
263 return GNUNET_SYSERR;
266 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_second_node;\n", GNUNET_h2s_full(&second->hashPubKey));
268 ret = fprintf(outfile, "set @temp_second_node = 0;\n");
271 return GNUNET_SYSERR;
273 ret = fprintf(outfile, "execute extend_topology using "
274 "@temp_first_node, @temp_second_node;\n");
278 return GNUNET_SYSERR;
283 * Inserts the specified trial into the dhttests.trials table
285 * @param trial_info struct containing the data to insert about this trial
287 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
289 int add_trial (struct GNUNET_DHTLOG_TrialInfo *trial_info)
292 trial_info->trialuid = 0;
294 return GNUNET_SYSERR;
296 ret = fprintf(outfile, "set @date = \"%s\", @oid = %u, @num = %u, @topology = %u, @bl = %u, "
297 "@connect = %u, @c_t_o = %u, @c_t_o_m = %f, @t_p = %f, "
298 "@t_pr = %f, @puts = %u, @gets = %u, "
299 "@concurrent = %u, @settle = %u, @rounds = %u, "
300 "@m_gets = %u, @m_puts = %u, @m_drops = %u, "
301 "@m_g_f = %u, @m_p_f = %u, @s_c = %u, @s_f = %u,"
302 "@s_k = %u, @g_s = %u, @message = \"%s\";\n",
303 get_sql_time(), trial_info->other_identifier, trial_info->num_nodes, trial_info->topology,
304 trial_info->blacklist_topology, trial_info->connect_topology,
305 trial_info->connect_topology_option, trial_info->connect_topology_option_modifier,
306 trial_info->topology_percentage, trial_info->topology_probability,
307 trial_info->puts, trial_info->gets, trial_info->concurrent, trial_info->settle_time,
308 trial_info->num_rounds, trial_info->malicious_getters, trial_info->malicious_putters,
309 trial_info->malicious_droppers, trial_info->malicious_get_frequency, trial_info->malicious_put_frequency,
310 trial_info->stop_closest, trial_info->stop_found, trial_info->strict_kademlia, trial_info->gets_succeeded, trial_info->message);
313 return GNUNET_SYSERR;
314 ret = fprintf(outfile, "execute insert_trial using "
315 "@date, @oid, @num, @topology, @t_p, @t_pr,"
316 " @bl, @connect, @c_t_o,"
317 "@c_t_o_m, @puts, @gets,"
318 "@concurrent, @settle, @rounds,"
319 "@m_gets, @m_puts, @m_drops,"
320 "@m_g_f, @m_p_f, @s_c, @s_f,"
321 "@s_k, @g_s, @message;\n");
323 return GNUNET_SYSERR;
324 ret = fprintf(outfile, "execute select_trial;\n");
328 return GNUNET_SYSERR;
333 * Inserts the specified stats into the dhttests.generic_stats table
335 * @param peer the peer inserting the statistic
336 * @param name the name of the statistic
337 * @param section the section of the statistic
338 * @param value the value of the statistic
340 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
343 add_generic_stat (const struct GNUNET_PeerIdentity *peer,
345 const char *section, uint64_t value)
349 return GNUNET_SYSERR;
352 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&peer->hashPubKey));
354 ret = fprintf(outfile, "set @temp_node = 0;\n");
357 return GNUNET_SYSERR;
359 ret = fprintf(outfile, "set @temp_section = \"%s\", @temp_stat = \"%s\", @temp_value = %llu;\n",
360 section, name, (unsigned long long)value);
363 return GNUNET_SYSERR;
365 ret = fprintf(outfile, "execute insert_generic_stat;\n");
368 return GNUNET_SYSERR;
374 * Inserts the specified stats into the dhttests.node_statistics table
376 * @param peer the peer inserting the statistic
377 * @param route_requests route requests seen
378 * @param route_forwards route requests forwarded
379 * @param result_requests route result requests seen
380 * @param client_requests client requests initiated
381 * @param result_forwards route results forwarded
382 * @param gets get requests handled
383 * @param puts put requests handle
384 * @param data_inserts data inserted at this node
385 * @param find_peer_requests find peer requests seen
386 * @param find_peers_started find peer requests initiated at this node
387 * @param gets_started get requests initiated at this node
388 * @param puts_started put requests initiated at this node
389 * @param find_peer_responses_received find peer responses received locally
390 * @param get_responses_received get responses received locally
391 * @param find_peer_responses_sent find peer responses sent from this node
392 * @param get_responses_sent get responses sent from this node
394 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
397 add_stat (const struct GNUNET_PeerIdentity *peer, unsigned int route_requests,
398 unsigned int route_forwards, unsigned int result_requests,
399 unsigned int client_requests, unsigned int result_forwards,
400 unsigned int gets, unsigned int puts,
401 unsigned int data_inserts, unsigned int find_peer_requests,
402 unsigned int find_peers_started, unsigned int gets_started,
403 unsigned int puts_started, unsigned int find_peer_responses_received,
404 unsigned int get_responses_received, unsigned int find_peer_responses_sent,
405 unsigned int get_responses_sent)
409 return GNUNET_SYSERR;
412 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&peer->hashPubKey));
414 ret = fprintf(outfile, "set @temp_node = 0;\n");
416 return GNUNET_SYSERR;
418 ret = fprintf(outfile, "set @r_r = %u, @r_f = %u, @res_r = %u, @c_r = %u, "
419 "@res_f = %u, @gets = %u, @puts = %u, @d_i = %u, "
420 "@f_p_r = %u, @f_p_s = %u, @g_s = %u, @p_s = %u, "
421 "@f_p_r_r = %u, @g_r_r = %u, @f_p_r_s = %u, @g_r_s = %u;\n",
422 route_requests, route_forwards, result_requests,
423 client_requests, result_forwards, gets, puts,
424 data_inserts, find_peer_requests, find_peers_started,
425 gets_started, puts_started, find_peer_responses_received,
426 get_responses_received, find_peer_responses_sent,
430 return GNUNET_SYSERR;
432 ret = fprintf(outfile, "execute insert_stat using "
433 "@temp_trial, @temp_node, @r_r, @r_f, @res_r, @c_r, "
434 "@res_f, @gets, @puts, @d_i, "
435 "@f_p_r, @f_p_s, @g_s, @p_s, "
436 "@f_p_r_r, @g_r_r, @f_p_r_s, @g_r_s;\n");
438 return GNUNET_SYSERR;
442 * Inserts the specified dhtkey into the dhttests.dhtkeys table,
443 * stores return value of dhttests.dhtkeys.dhtkeyuid into dhtkeyuid
445 * @param dhtkeyuid return value
446 * @param dhtkey hashcode of key to insert
448 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
451 add_dhtkey (unsigned long long *dhtkeyuid, const GNUNET_HashCode * dhtkey)
454 if (dhtkeyuid != NULL)
458 return GNUNET_SYSERR;
461 ret = fprintf(outfile, "set @dhtkey = \"%s\";\n", GNUNET_h2s_full(dhtkey));
463 ret = fprintf(outfile, "set @dhtkey = XXXXX;\n");
466 return GNUNET_SYSERR;
467 ret = fprintf(outfile, "execute insert_dhtkey using @dhtkey;\n");
471 return GNUNET_SYSERR;
475 * Inserts the specified node into the dhttests.nodes table
477 * @param nodeuid the inserted node uid
478 * @param node the node to insert
480 * @return GNUNET_OK on success, GNUNET_SYSERR on failure
483 add_node (unsigned long long *nodeuid, struct GNUNET_PeerIdentity * node)
488 return GNUNET_SYSERR;
491 return GNUNET_SYSERR;
494 ret = fprintf(outfile, "set @node = \"%s\";\n", GNUNET_h2s_full(&node->hashPubKey));
496 return GNUNET_SYSERR;
499 return GNUNET_SYSERR;
501 ret = fprintf(outfile, "execute insert_node using @node;\n");
505 return GNUNET_SYSERR;
509 * Update dhttests.trials table with current server time as end time
511 * @param trialuid trial to update
512 * @param gets_succeeded how many gets did the testcase report as successful
514 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
517 update_trials (unsigned long long trialuid,
518 unsigned int gets_succeeded)
522 /* if (trialuid != current_trial)
525 _("Trialuid to update is not equal to current_trial\n"));
530 return GNUNET_SYSERR;
532 ret = fprintf(outfile, "set @date = \"%s\", @g_s = %u;\n", get_sql_time(), gets_succeeded);
535 return GNUNET_SYSERR;
537 ret = fprintf(outfile, "execute update_trial using @date, @g_s;\n");
542 return GNUNET_SYSERR;
547 * Update dhttests.nodes table setting the identified
548 * node as a malicious dropper.
550 * @param peer the peer that was set to be malicious
552 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
555 set_malicious (struct GNUNET_PeerIdentity *peer)
560 return GNUNET_SYSERR;
562 ret = fprintf(outfile, "set @temp_node = \"%s\";\n", GNUNET_h2s_full(&peer->hashPubKey));
565 return GNUNET_SYSERR;
567 ret = fprintf(outfile, "execute set_malicious;\n");
572 return GNUNET_SYSERR;
577 * Update dhttests.trials table with total connections information
579 * @param trialuid the trialuid to update
580 * @param totalConnections the number of connections
582 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
585 add_connections (unsigned long long trialuid, unsigned int totalConnections)
589 /* if (trialuid != current_trial)
592 _("Trialuid to update is not equal to current_trial(!)(?)\n"));
596 return GNUNET_SYSERR;
598 ret = fprintf(outfile, "set @conns = %u;\n", totalConnections);
601 return GNUNET_SYSERR;
603 ret = fprintf(outfile, "execute update_conn using @conns;\n");
608 return GNUNET_SYSERR;
613 * Update dhttests.topology table with total connections information
615 * @param totalConnections the number of connections
617 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
620 update_topology (unsigned int connections)
624 return GNUNET_SYSERR;
626 ret = fprintf(outfile, "set @temp_conns = %u;\n", connections);
629 return GNUNET_SYSERR;
631 ret = fprintf(outfile, "execute update_topology using @temp_conns;\n");
636 return GNUNET_SYSERR;
640 * Inserts the specified query into the dhttests.queries table
642 * @param sqlqueruid inserted query uid
643 * @param queryid dht query id
644 * @param type type of the query
645 * @param hops number of hops query traveled
646 * @param succeeded whether or not query was successful
647 * @param node the node the query hit
648 * @param key the key of the query
650 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
653 add_query (unsigned long long *sqlqueryuid, unsigned long long queryid,
654 unsigned int type, unsigned int hops, int succeeded,
655 const struct GNUNET_PeerIdentity * node, const GNUNET_HashCode * key)
660 return GNUNET_SYSERR;
662 if (sqlqueryuid != NULL)
666 ret = fprintf(outfile, "select dhtkeyuid from dhtkeys where trialuid = @temp_trial and dhtkey = \"%s\" into @temp_dhtkey;\n", GNUNET_h2s_full(key));
668 ret = fprintf(outfile, "set @temp_dhtkey = 0;\n");
671 return GNUNET_SYSERR;
674 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&node->hashPubKey));
676 ret = fprintf(outfile, "set @temp_node = 0;\n");
679 return GNUNET_SYSERR;
681 ret = fprintf(outfile, "set @qid = %llu, @type = %u, @hops = %u, @succ = %d, @time = \"%s\";\n", queryid, type, hops, succeeded, get_sql_time());
684 return GNUNET_SYSERR;
686 ret = fprintf(outfile, "execute insert_query using @type, @hops, @temp_dhtkey, @qid, @succ, @temp_node, @time;\n");
691 return GNUNET_SYSERR;
695 * Inserts the specified route information into the dhttests.routes table
697 * @param sqlqueruid inserted query uid
698 * @param queryid dht query id
699 * @param type type of the query
700 * @param hops number of hops query traveled
701 * @param succeeded whether or not query was successful
702 * @param node the node the query hit
703 * @param key the key of the query
704 * @param from_node the node that sent the message to node
705 * @param to_node next node to forward message to
707 * @return GNUNET_OK on success, GNUNET_SYSERR on failure.
710 add_route (unsigned long long *sqlqueryuid, unsigned long long queryid,
711 unsigned int type, unsigned int hops,
712 int succeeded, const struct GNUNET_PeerIdentity * node,
713 const GNUNET_HashCode * key, const struct GNUNET_PeerIdentity * from_node,
714 const struct GNUNET_PeerIdentity * to_node)
719 return GNUNET_SYSERR;
721 if (sqlqueryuid != NULL)
725 ret = fprintf(outfile, "select dhtkeyuid from dhtkeys where trialuid = @temp_trial and dhtkey = \"%s\" into @temp_dhtkey;\n", GNUNET_h2s_full(key));
727 ret = fprintf(outfile, "set @temp_dhtkey = 0;\n");
730 return GNUNET_SYSERR;
733 ret = fprintf(outfile, "select nodeuid from nodes where trialuid = @temp_trial and nodeid = \"%s\" into @temp_node;\n", GNUNET_h2s_full(&node->hashPubKey));
735 ret = fprintf(outfile, "set @temp_node = 0;\n");
738 return GNUNET_SYSERR;
740 if (from_node != NULL)
741 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));
743 ret = fprintf(outfile, "set @temp_from_node = 0;\n");
746 return GNUNET_SYSERR;
749 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));
751 ret = fprintf(outfile, "set @temp_to_node = 0;\n");
754 return GNUNET_SYSERR;
756 ret = fprintf(outfile, "set @qid = %llu, @type = %u, @hops = %u, @succ = %d;\n", queryid, type, hops, succeeded);
759 return GNUNET_SYSERR;
761 ret = fprintf(outfile, "execute insert_route using @type, @hops, @temp_dhtkey, @qid, @succ, @temp_node, @temp_from_node, @temp_to_node;\n");
766 return GNUNET_SYSERR;
770 * Provides the dhtlog api
772 * @param c the configuration to use to connect to a server
774 * @return the handle to the server, or NULL on error
777 libgnunet_plugin_dhtlog_mysql_dump_init (void * cls)
779 struct GNUNET_DHTLOG_Plugin *plugin = cls;
786 max_varchar_len = 255;
788 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "MySQL (DUMP) DHT Logger: initializing\n");
790 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (plugin->cfg,
794 outfile_path = GNUNET_strdup("");
797 GNUNET_asprintf (&outfile_name,
803 fn = GNUNET_STRINGS_filename_expand (outfile_name);
807 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("Failed to get full path for `%s'\n"), outfile_name);
808 GNUNET_free(outfile_path);
809 GNUNET_free(outfile_name);
813 dirwarn = (GNUNET_OK != GNUNET_DISK_directory_create_for_file (fn));
814 outfile = FOPEN (fn, "w");
818 GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "fopen", fn);
820 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
821 _("Failed to create or access directory for log file `%s'\n"),
823 GNUNET_free(outfile_path);
824 GNUNET_free(outfile_name);
829 GNUNET_free (outfile_path);
830 GNUNET_free (outfile_name);
833 if (iopen () != GNUNET_OK)
835 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
836 _("Failed to create file for dhtlog.\n"));
839 GNUNET_assert(plugin->dhtlog_api == NULL);
840 plugin->dhtlog_api = GNUNET_malloc(sizeof(struct GNUNET_DHTLOG_Handle));
841 plugin->dhtlog_api->insert_trial = &add_trial;
842 plugin->dhtlog_api->insert_round = &add_round;
843 plugin->dhtlog_api->insert_stat = &add_stat;
844 plugin->dhtlog_api->insert_query = &add_query;
845 plugin->dhtlog_api->update_trial = &update_trials;
846 plugin->dhtlog_api->insert_route = &add_route;
847 plugin->dhtlog_api->insert_node = &add_node;
848 plugin->dhtlog_api->insert_dhtkey = &add_dhtkey;
849 plugin->dhtlog_api->update_connections = &add_connections;
850 plugin->dhtlog_api->insert_topology = &add_topology;
851 plugin->dhtlog_api->insert_extended_topology = &add_extended_topology;
852 plugin->dhtlog_api->update_topology = &update_topology;
853 plugin->dhtlog_api->set_malicious = &set_malicious;
854 plugin->dhtlog_api->add_generic_stat = &add_generic_stat;
860 * Shutdown the plugin.
863 libgnunet_plugin_dhtlog_mysql_dump_done (void * cls)
865 struct GNUNET_DHTLOG_Handle *dhtlog_api = cls;
866 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
867 "MySQL DHT Logger: database shutdown\n");
868 GNUNET_assert(dhtlog_api != NULL);
870 GNUNET_free(dhtlog_api);
874 /* end of plugin_dhtlog_mysql.c */