ku_raw.php 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. class KuRaw
  3. {
  4. private static PDO $instance;
  5. public static PDOStatement $db;
  6. public static PDOStatement $fortune;
  7. public static PDOStatement $random;
  8. /**
  9. * @var []PDOStatement
  10. */
  11. private static $update;
  12. public static function init()
  13. {
  14. $pdo = new PDO(
  15. 'pgsql:host=tfb-database;dbname=hello_world',
  16. 'benchmarkdbuser',
  17. 'benchmarkdbpass',
  18. [
  19. PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  20. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  21. PDO::ATTR_EMULATE_PREPARES => false
  22. ]
  23. );
  24. self::$db = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
  25. self::$fortune = $pdo->prepare('SELECT id,message FROM Fortune');
  26. self::$random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
  27. self::$instance = $pdo;
  28. }
  29. /**
  30. * Postgres bulk update
  31. *
  32. * @param array $worlds
  33. * @return void
  34. */
  35. public static function update(array $worlds)
  36. {
  37. $rows = count($worlds);
  38. if (!isset(self::$update[$rows])) {
  39. $sql = 'UPDATE world SET randomNumber = CASE id'
  40. . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows) .
  41. 'END WHERE id IN ('
  42. . implode(', ', array_fill(0, $rows, '?::INTEGER')) . ')';
  43. self::$update[$rows] = self::$instance->prepare($sql);
  44. }
  45. $val = [];
  46. $keys = [];
  47. foreach ($worlds as $world) {
  48. $val[] = $keys[] = $world['id'];
  49. $val[] = $world['randomNumber'];
  50. }
  51. self::$update[$rows]->execute([...$val, ...$keys]);
  52. }
  53. /**
  54. * Alternative bulk update in Postgres
  55. *
  56. * @param array $worlds
  57. * @return void
  58. */
  59. public static function update2(array $worlds)
  60. {
  61. $rows = count($worlds);
  62. if (!isset(self::$update[$rows])) {
  63. $sql = 'UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES '
  64. . implode(', ', array_fill(0, $rows, '(?::INTEGER, ?::INTEGER)')) .
  65. ' ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id';
  66. self::$update[$rows] = self::$instance->prepare($sql);
  67. }
  68. $val = [];
  69. foreach ($worlds as $world) {
  70. $val[] = $world['id'];
  71. $val[] = $world['randomNumber'];
  72. //$update->bindParam(++$i, $world['id'], PDO::PARAM_INT);
  73. }
  74. self::$update[$rows]->execute($val);
  75. }
  76. }