diff options
author | Jeffrey Burdges <burdges@gnunet.org> | 2017-06-03 22:01:28 +0200 |
---|---|---|
committer | Jeffrey Burdges <burdges@gnunet.org> | 2017-06-03 22:01:28 +0200 |
commit | dc230e1772729e9edda1aa2325d6904a13f68dd4 (patch) | |
tree | 712ca3e27a29f90248abcb7c99e1918958134567 /src/psycstore | |
parent | 646c1428a2750c5c4620677eec353788f838c5f8 (diff) | |
download | gnunet-dc230e1772729e9edda1aa2325d6904a13f68dd4.tar.gz gnunet-dc230e1772729e9edda1aa2325d6904a13f68dd4.zip |
Jeff in sed mode
Diffstat (limited to 'src/psycstore')
-rw-r--r-- | src/psycstore/plugin_psycstore_postgres.c | 406 |
1 files changed, 184 insertions, 222 deletions
diff --git a/src/psycstore/plugin_psycstore_postgres.c b/src/psycstore/plugin_psycstore_postgres.c index f410e2737..f20a8c151 100644 --- a/src/psycstore/plugin_psycstore_postgres.c +++ b/src/psycstore/plugin_psycstore_postgres.c | |||
@@ -175,230 +175,192 @@ database_setup (struct Plugin *plugin) | |||
175 | } | 175 | } |
176 | 176 | ||
177 | /* Prepare statements */ | 177 | /* Prepare statements */ |
178 | if ((GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 178 | { |
179 | "transaction_begin", | 179 | struct GNUNET_PQ_PreparedStatement ps[] = { |
180 | "BEGIN", 0)) || | 180 | GNUNET_PQ_make_prepare ("transaction_begin", |
181 | 181 | "BEGIN", 0), | |
182 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 182 | GNUNET_PQ_make_prepare ("transaction_commit", |
183 | "transaction_commit", | 183 | "COMMIT", 0), |
184 | "COMMIT", 0)) || | 184 | GNUNET_PQ_make_prepare ("transaction_rollback", |
185 | 185 | "ROLLBACK", 0), | |
186 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 186 | GNUNET_PQ_make_prepare ("insert_channel_key", |
187 | "transaction_rollback", | 187 | "INSERT INTO channels (pub_key) VALUES ($1)" |
188 | "ROLLBACK", 0)) || | 188 | " ON CONFLICT DO NOTHING", 1), |
189 | 189 | GNUNET_PQ_make_prepare ("insert_slave_key", | |
190 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 190 | "INSERT INTO slaves (pub_key) VALUES ($1)" |
191 | "insert_channel_key", | 191 | " ON CONFLICT DO NOTHING", 1), |
192 | "INSERT INTO channels (pub_key) VALUES ($1)" | 192 | GNUNET_PQ_make_prepare ("insert_membership", |
193 | " ON CONFLICT DO NOTHING", 1)) || | 193 | "INSERT INTO membership\n" |
194 | 194 | " (channel_id, slave_id, did_join, announced_at,\n" | |
195 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 195 | " effective_since, group_generation)\n" |
196 | "insert_slave_key", | 196 | "VALUES (get_chan_id($1),\n" |
197 | "INSERT INTO slaves (pub_key) VALUES ($1)" | 197 | " get_slave_id($2),\n" |
198 | " ON CONFLICT DO NOTHING", 1)) || | 198 | " $3, $4, $5, $6)", 6), |
199 | 199 | GNUNET_PQ_make_prepare ("insert_membership", | |
200 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 200 | "INSERT INTO membership\n" |
201 | "insert_membership", | 201 | " (channel_id, slave_id, did_join, announced_at,\n" |
202 | "INSERT INTO membership\n" | 202 | " effective_since, group_generation)\n" |
203 | " (channel_id, slave_id, did_join, announced_at,\n" | 203 | "VALUES (get_chan_id($1),\n" |
204 | " effective_since, group_generation)\n" | 204 | " get_slave_id($2),\n" |
205 | "VALUES (get_chan_id($1),\n" | 205 | " $3, $4, $5, $6)", 6), |
206 | " get_slave_id($2),\n" | 206 | GNUNET_PQ_make_prepare ("select_membership", |
207 | " $3, $4, $5, $6)", 6)) || | 207 | "SELECT did_join FROM membership\n" |
208 | 208 | "WHERE channel_id = get_chan_id($1)\n" | |
209 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 209 | " AND slave_id = get_slave_id($2)\n" |
210 | "select_membership", | 210 | " AND effective_since <= $3 AND did_join = 1\n" |
211 | "SELECT did_join FROM membership\n" | 211 | "ORDER BY announced_at DESC LIMIT 1", 3), |
212 | "WHERE channel_id = get_chan_id($1)\n" | 212 | GNUNET_PQ_make_prepare ("insert_fragment", |
213 | " AND slave_id = get_slave_id($2)\n" | 213 | "INSERT INTO messages\n" |
214 | " AND effective_since <= $3 AND did_join = 1\n" | 214 | " (channel_id, hop_counter, signature, purpose,\n" |
215 | "ORDER BY announced_at DESC LIMIT 1", 3)) || | 215 | " fragment_id, fragment_offset, message_id,\n" |
216 | 216 | " group_generation, multicast_flags, psycstore_flags, data)\n" | |
217 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 217 | "VALUES (get_chan_id($1),\n" |
218 | "insert_fragment", | 218 | " $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)" |
219 | "INSERT INTO messages\n" | 219 | "ON CONFLICT DO NOTHING", 11), |
220 | " (channel_id, hop_counter, signature, purpose,\n" | 220 | GNUNET_PQ_make_prepare ("update_message_flags", |
221 | " fragment_id, fragment_offset, message_id,\n" | 221 | "UPDATE messages\n" |
222 | " group_generation, multicast_flags, psycstore_flags, data)\n" | 222 | "SET psycstore_flags = psycstore_flags | $1\n" |
223 | "VALUES (get_chan_id($1),\n" | 223 | "WHERE channel_id = get_chan_id($2) \n" |
224 | " $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)" | 224 | " AND message_id = $3 AND fragment_offset = 0", 3), |
225 | "ON CONFLICT DO NOTHING", 11)) || | 225 | GNUNET_PQ_make_prepare ("select_fragments", |
226 | 226 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | |
227 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 227 | " fragment_offset, message_id, group_generation,\n" |
228 | "update_message_flags", | 228 | " multicast_flags, psycstore_flags, data\n" |
229 | "UPDATE messages\n" | 229 | "FROM messages\n" |
230 | "SET psycstore_flags = psycstore_flags | $1\n" | 230 | "WHERE channel_id = get_chan_id($1) \n" |
231 | "WHERE channel_id = get_chan_id($2) \n" | 231 | " AND $2 <= fragment_id AND fragment_id <= $3", 3), |
232 | " AND message_id = $3 AND fragment_offset = 0", 3)) || | ||
233 | |||
234 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | ||
235 | "select_fragments", | ||
236 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | ||
237 | " fragment_offset, message_id, group_generation,\n" | ||
238 | " multicast_flags, psycstore_flags, data\n" | ||
239 | "FROM messages\n" | ||
240 | "WHERE channel_id = get_chan_id($1) \n" | ||
241 | " AND $2 <= fragment_id AND fragment_id <= $3", 3)) || | ||
242 | |||
243 | /** @todo select_messages: add method_prefix filter */ | 232 | /** @todo select_messages: add method_prefix filter */ |
244 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 233 | GNUNET_PQ_make_prepare ("select_messages", |
245 | "select_messages", | 234 | "SELECT hop_counter, signature, purpose, fragment_id,\n" |
246 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 235 | " fragment_offset, message_id, group_generation,\n" |
247 | " fragment_offset, message_id, group_generation,\n" | 236 | " multicast_flags, psycstore_flags, data\n" |
248 | " multicast_flags, psycstore_flags, data\n" | 237 | "FROM messages\n" |
249 | "FROM messages\n" | 238 | "WHERE channel_id = get_chan_id($1) \n" |
250 | "WHERE channel_id = get_chan_id($1) \n" | 239 | " AND $2 <= message_id AND message_id <= $3\n" |
251 | " AND $2 <= message_id AND message_id <= $3\n" | 240 | "LIMIT $4;", 4), |
252 | "LIMIT $4;", 4)) || | ||
253 | |||
254 | /** @todo select_latest_messages: add method_prefix filter */ | 241 | /** @todo select_latest_messages: add method_prefix filter */ |
255 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 242 | GNUNET_PQ_make_prepare ("select_latest_fragments", |
256 | "select_latest_fragments", | 243 | "SELECT rev.hop_counter AS hop_counter,\n" |
257 | "SELECT rev.hop_counter AS hop_counter,\n" | 244 | " rev.signature AS signature,\n" |
258 | " rev.signature AS signature,\n" | 245 | " rev.purpose AS purpose,\n" |
259 | " rev.purpose AS purpose,\n" | 246 | " rev.fragment_id AS fragment_id,\n" |
260 | " rev.fragment_id AS fragment_id,\n" | 247 | " rev.fragment_offset AS fragment_offset,\n" |
261 | " rev.fragment_offset AS fragment_offset,\n" | 248 | " rev.message_id AS message_id,\n" |
262 | " rev.message_id AS message_id,\n" | 249 | " rev.group_generation AS group_generation,\n" |
263 | " rev.group_generation AS group_generation,\n" | 250 | " rev.multicast_flags AS multicast_flags,\n" |
264 | " rev.multicast_flags AS multicast_flags,\n" | 251 | " rev.psycstore_flags AS psycstore_flags,\n" |
265 | " rev.psycstore_flags AS psycstore_flags,\n" | 252 | " rev.data AS data\n" |
266 | " rev.data AS data\n" | 253 | " FROM\n" |
267 | " FROM\n" | 254 | " (SELECT hop_counter, signature, purpose, fragment_id,\n" |
268 | " (SELECT hop_counter, signature, purpose, fragment_id,\n" | 255 | " fragment_offset, message_id, group_generation,\n" |
269 | " fragment_offset, message_id, group_generation,\n" | 256 | " multicast_flags, psycstore_flags, data \n" |
270 | " multicast_flags, psycstore_flags, data \n" | 257 | " FROM messages\n" |
271 | " FROM messages\n" | 258 | " WHERE channel_id = get_chan_id($1) \n" |
272 | " WHERE channel_id = get_chan_id($1) \n" | 259 | " ORDER BY fragment_id DESC\n" |
273 | " ORDER BY fragment_id DESC\n" | 260 | " LIMIT $2) AS rev\n" |
274 | " LIMIT $2) AS rev\n" | 261 | " ORDER BY rev.fragment_id;", 2), |
275 | " ORDER BY rev.fragment_id;", 2)) || | 262 | GNUNET_PQ_make_prepare ("select_latest_messages", |
276 | 263 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | |
277 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 264 | " fragment_offset, message_id, group_generation,\n" |
278 | "select_latest_messages", | 265 | " multicast_flags, psycstore_flags, data\n" |
279 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 266 | "FROM messages\n" |
280 | " fragment_offset, message_id, group_generation,\n" | 267 | "WHERE channel_id = get_chan_id($1)\n" |
281 | " multicast_flags, psycstore_flags, data\n" | 268 | " AND message_id IN\n" |
282 | "FROM messages\n" | 269 | " (SELECT message_id\n" |
283 | "WHERE channel_id = get_chan_id($1)\n" | 270 | " FROM messages\n" |
284 | " AND message_id IN\n" | 271 | " WHERE channel_id = get_chan_id($2) \n" |
285 | " (SELECT message_id\n" | 272 | " GROUP BY message_id\n" |
286 | " FROM messages\n" | 273 | " ORDER BY message_id\n" |
287 | " WHERE channel_id = get_chan_id($2) \n" | 274 | " DESC LIMIT $3)\n" |
288 | " GROUP BY message_id\n" | 275 | "ORDER BY fragment_id", 3), |
289 | " ORDER BY message_id\n" | 276 | GNUNET_PQ_make_prepare ("select_message_fragment", |
290 | " DESC LIMIT $3)\n" | 277 | "SELECT hop_counter, signature, purpose, fragment_id,\n" |
291 | "ORDER BY fragment_id", 3)) || | 278 | " fragment_offset, message_id, group_generation,\n" |
292 | 279 | " multicast_flags, psycstore_flags, data\n" | |
293 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 280 | "FROM messages\n" |
294 | "select_message_fragment", | 281 | "WHERE channel_id = get_chan_id($1) \n" |
295 | "SELECT hop_counter, signature, purpose, fragment_id,\n" | 282 | " AND message_id = $2 AND fragment_offset = $3", 3), |
296 | " fragment_offset, message_id, group_generation,\n" | 283 | GNUNET_PQ_make_prepare ("select_counters_message", |
297 | " multicast_flags, psycstore_flags, data\n" | 284 | "SELECT fragment_id, message_id, group_generation\n" |
298 | "FROM messages\n" | 285 | "FROM messages\n" |
299 | "WHERE channel_id = get_chan_id($1) \n" | 286 | "WHERE channel_id = get_chan_id($1)\n" |
300 | " AND message_id = $2 AND fragment_offset = $3", 3)) || | 287 | "ORDER BY fragment_id DESC LIMIT 1", 1), |
301 | 288 | GNUNET_PQ_make_prepare ("select_counters_state", | |
302 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 289 | "SELECT max_state_message_id\n" |
303 | "select_counters_message", | 290 | "FROM channels\n" |
304 | "SELECT fragment_id, message_id, group_generation\n" | 291 | "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1), |
305 | "FROM messages\n" | 292 | GNUNET_PQ_make_prepare ("update_max_state_message_id", |
306 | "WHERE channel_id = get_chan_id($1)\n" | 293 | "UPDATE channels\n" |
307 | "ORDER BY fragment_id DESC LIMIT 1", 1)) || | 294 | "SET max_state_message_id = $1\n" |
308 | 295 | "WHERE pub_key = $2", 2), | |
309 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 296 | |
310 | "select_counters_state", | 297 | GNUNET_PQ_make_prepare ("update_state_hash_message_id", |
311 | "SELECT max_state_message_id\n" | 298 | "UPDATE channels\n" |
312 | "FROM channels\n" | 299 | "SET state_hash_message_id = $1\n" |
313 | "WHERE pub_key = $1 AND max_state_message_id IS NOT NULL", 1)) || | 300 | "WHERE pub_key = $2", 2), |
314 | 301 | GNUNET_PQ_make_prepare ("insert_state_current", | |
315 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 302 | "INSERT INTO state\n" |
316 | "update_max_state_message_id", | 303 | " (channel_id, name, value_current, value_signed)\n" |
317 | "UPDATE channels\n" | 304 | "SELECT new.channel_id, new.name,\n" |
318 | "SET max_state_message_id = $1\n" | 305 | " new.value_current, old.value_signed\n" |
319 | "WHERE pub_key = $2", 2)) || | 306 | "FROM (SELECT get_chan_id($1) AS channel_id,\n" |
320 | 307 | " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n" | |
321 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 308 | "LEFT JOIN (SELECT channel_id, name, value_signed\n" |
322 | "update_state_hash_message_id", | 309 | " FROM state) AS old\n" |
323 | "UPDATE channels\n" | 310 | "ON new.channel_id = old.channel_id AND new.name = old.name\n" |
324 | "SET state_hash_message_id = $1\n" | 311 | "ON CONFLICT (channel_id, name)\n" |
325 | "WHERE pub_key = $2", 2)) || | 312 | " DO UPDATE SET value_current = EXCLUDED.value_current,\n" |
326 | 313 | " value_signed = EXCLUDED.value_signed", 3), | |
327 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 314 | GNUNET_PQ_make_prepare ("delete_state_empty", |
328 | "insert_state_current", | 315 | "DELETE FROM state\n" |
329 | "INSERT INTO state\n" | 316 | "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n" |
330 | " (channel_id, name, value_current, value_signed)\n" | 317 | " AND (value_current IS NULL OR length(value_current) = 0)\n" |
331 | "SELECT new.channel_id, new.name,\n" | 318 | " AND (value_signed IS NULL OR length(value_signed) = 0)", 1), |
332 | " new.value_current, old.value_signed\n" | 319 | GNUNET_PQ_make_prepare ("update_state_signed", |
333 | "FROM (SELECT get_chan_id($1) AS channel_id,\n" | 320 | "UPDATE state\n" |
334 | " $2::TEXT AS name, $3::BYTEA AS value_current) AS new\n" | 321 | "SET value_signed = value_current\n" |
335 | "LEFT JOIN (SELECT channel_id, name, value_signed\n" | 322 | "WHERE channel_id = get_chan_id($1) ", 1), |
336 | " FROM state) AS old\n" | 323 | GNUNET_PQ_make_prepare ("delete_state", |
337 | "ON new.channel_id = old.channel_id AND new.name = old.name\n" | 324 | "DELETE FROM state\n" |
338 | "ON CONFLICT (channel_id, name)\n" | 325 | "WHERE channel_id = get_chan_id($1) ", 1), |
339 | " DO UPDATE SET value_current = EXCLUDED.value_current,\n" | 326 | GNUNET_PQ_make_prepare ("insert_state_sync", |
340 | " value_signed = EXCLUDED.value_signed", 3)) || | 327 | "INSERT INTO state_sync (channel_id, name, value)\n" |
341 | 328 | "VALUES (get_chan_id($1), $2, $3)", 3), | |
342 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 329 | GNUNET_PQ_make_prepare ("insert_state_from_sync", |
343 | "delete_state_empty", | 330 | "INSERT INTO state\n" |
344 | "DELETE FROM state\n" | 331 | " (channel_id, name, value_current, value_signed)\n" |
345 | "WHERE channel_id = (SELECT id FROM channels WHERE pub_key = $1)\n" | 332 | "SELECT channel_id, name, value, value\n" |
346 | " AND (value_current IS NULL OR length(value_current) = 0)\n" | 333 | "FROM state_sync\n" |
347 | " AND (value_signed IS NULL OR length(value_signed) = 0)", 1)) || | 334 | "WHERE channel_id = get_chan_id($1)", 1), |
348 | 335 | GNUNET_PQ_make_prepare ("delete_state_sync", | |
349 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 336 | "DELETE FROM state_sync\n" |
350 | "update_state_signed", | 337 | "WHERE channel_id = get_chan_id($1)", 1), |
351 | "UPDATE state\n" | 338 | GNUNET_PQ_make_prepare ("select_state_one", |
352 | "SET value_signed = value_current\n" | 339 | "SELECT value_current\n" |
353 | "WHERE channel_id = get_chan_id($1) ", 1)) || | 340 | "FROM state\n" |
354 | 341 | "WHERE channel_id = get_chan_id($1)\n" | |
355 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 342 | " AND name = $2", 2), |
356 | "delete_state", | 343 | GNUNET_PQ_make_prepare ("select_state_prefix", |
357 | "DELETE FROM state\n" | 344 | "SELECT name, value_current\n" |
358 | "WHERE channel_id = get_chan_id($1) ", 1)) || | 345 | "FROM state\n" |
359 | 346 | "WHERE channel_id = get_chan_id($1)\n" | |
360 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 347 | " AND (name = $2 OR substr(name, 1, $3) = $4)", 4), |
361 | "insert_state_sync", | 348 | GNUNET_PQ_make_prepare ("select_state_signed", |
362 | "INSERT INTO state_sync (channel_id, name, value)\n" | 349 | "SELECT name, value_signed\n" |
363 | "VALUES (get_chan_id($1), $2, $3)", 3)) || | 350 | "FROM state\n" |
364 | 351 | "WHERE channel_id = get_chan_id($1)\n" | |
365 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 352 | " AND value_signed IS NOT NULL", 1), |
366 | "insert_state_from_sync", | 353 | GNUNET_PQ_PREPARED_STATEMENT_END |
367 | "INSERT INTO state\n" | 354 | }; |
368 | " (channel_id, name, value_current, value_signed)\n" | 355 | |
369 | "SELECT channel_id, name, value, value\n" | 356 | if (GNUNET_OK != |
370 | "FROM state_sync\n" | 357 | GNUNET_PQ_prepare_statements (plugin->dbh, |
371 | "WHERE channel_id = get_chan_id($1)", 1)) || | 358 | ps)) |
372 | 359 | { | |
373 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | 360 | PQfinish (plugin->dbh); |
374 | "delete_state_sync", | 361 | plugin->dbh = NULL; |
375 | "DELETE FROM state_sync\n" | 362 | return GNUNET_SYSERR; |
376 | "WHERE channel_id = get_chan_id($1)", 1)) || | 363 | } |
377 | |||
378 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | ||
379 | "select_state_one", | ||
380 | "SELECT value_current\n" | ||
381 | "FROM state\n" | ||
382 | "WHERE channel_id = get_chan_id($1)\n" | ||
383 | " AND name = $2", 2)) || | ||
384 | |||
385 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | ||
386 | "select_state_prefix", | ||
387 | "SELECT name, value_current\n" | ||
388 | "FROM state\n" | ||
389 | "WHERE channel_id = get_chan_id($1)\n" | ||
390 | " AND (name = $2 OR substr(name, 1, $3) = $4)", 4)) || | ||
391 | |||
392 | (GNUNET_OK != GNUNET_POSTGRES_prepare (plugin->dbh, | ||
393 | "select_state_signed", | ||
394 | "SELECT name, value_signed\n" | ||
395 | "FROM state\n" | ||
396 | "WHERE channel_id = get_chan_id($1)\n" | ||
397 | " AND value_signed IS NOT NULL", 1))) | ||
398 | { | ||
399 | PQfinish (plugin->dbh); | ||
400 | plugin->dbh = NULL; | ||
401 | return GNUNET_SYSERR; | ||
402 | } | 364 | } |
403 | 365 | ||
404 | return GNUNET_OK; | 366 | return GNUNET_OK; |