database.pl 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. :- module(database, [find_random_numbers/3,
  2. update_random_numbers/3,
  3. find_fortunes/2]).
  4. :- use_module(library(odbc)).
  5. :- use_module(library(random)).
  6. % --------------------------------------------------
  7. find_random_numbers(_Connection, 0, []).
  8. find_random_numbers(Connection, N, Rows) :-
  9. with_statement(Connection, world_by_id, Statement, find_random_numbers_(Statement, N, Rows)).
  10. find_random_numbers_(_Statement, 0, []).
  11. find_random_numbers_(Statement, N, [Row|Rows]) :-
  12. N > 0,
  13. random_id(Id),
  14. odbc_execute(Statement, [Id], Row),
  15. N1 is N - 1,
  16. find_random_numbers_(Statement, N1, Rows).
  17. find_fortunes(Connection, Rows) :-
  18. with_statement(Connection, fortune, Statement, findall(Row, odbc_execute(Statement, [], Row), Rows)).
  19. update_random_numbers(_Connection, [], []).
  20. update_random_numbers(Connection, Rows0, Rows) :-
  21. with_statement(Connection, update_world, Statement, update_random_numbers_(Statement, Rows0, Rows)).
  22. update_random_numbers_(_Statement, [], []).
  23. update_random_numbers_(Statement, [row(Id0,_)|Rows0], [Row|Rows]) :-
  24. random_id(RandomNumber),
  25. Row = row(Id0, RandomNumber),
  26. odbc_execute(Statement, [RandomNumber, Id0]),
  27. update_random_numbers_(Statement, Rows0, Rows).
  28. % --------------------------------------------------
  29. query(world_by_id, 'SELECT id, randomNumber FROM World WHERE id = ?', [integer]).
  30. query(fortune, 'SELECT id, message FROM Fortune', []).
  31. query(update_world, 'UPDATE World SET randomNumber = ? WHERE id = ?', [integer, integer]).
  32. with_statement(Connection, Name, Statement, Goal) :-
  33. setup_call_cleanup(
  34. ( query(Name, Query, Params)
  35. , odbc_prepare(Connection, Query, Params, Statement)
  36. ),
  37. Goal,
  38. odbc_free_statement(Statement)
  39. ).
  40. random_id(N) :- random(1, 10001, N).