dbraw.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. class DbRaw
  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::$fortune = $pdo->prepare('SELECT id,message FROM Fortune');
  25. self::$random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
  26. self::$instance = $pdo;
  27. }
  28. /**
  29. * Postgres bulk update
  30. *
  31. * @param array $worlds
  32. * @return void
  33. */
  34. public static function update(array $worlds)
  35. {
  36. $rows = count($worlds);
  37. if (!isset(self::$update[$rows])) {
  38. $sql = 'UPDATE world SET randomNumber = CASE id'
  39. . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows)
  40. . 'END WHERE id IN ('
  41. . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)';
  42. self::$update[$rows] = self::$instance->prepare($sql);
  43. }
  44. $val = [];
  45. $keys = [];
  46. foreach ($worlds as $world) {
  47. $val[] = $keys[] = $world['id'];
  48. $val[] = $world['randomNumber'];
  49. }
  50. self::$update[$rows]->execute([...$val, ...$keys]);
  51. }
  52. /**
  53. * Alternative bulk update in Postgres
  54. *
  55. * @param array $worlds
  56. * @return void
  57. */
  58. public static function update2(array $worlds)
  59. {
  60. $rows = count($worlds);
  61. if (!isset(self::$update[$rows])) {
  62. $sql = 'UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES '
  63. . implode(', ', array_fill(0, $rows, '(?::INTEGER, ?::INTEGER)')) .
  64. ' ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id';
  65. self::$update[$rows] = self::$instance->prepare($sql);
  66. }
  67. $val = [];
  68. foreach ($worlds as $world) {
  69. $val[] = $world['id'];
  70. $val[] = $world['randomNumber'];
  71. //$update->bindParam(++$i, $world['id'], PDO::PARAM_INT);
  72. }
  73. self::$update[$rows]->execute($val);
  74. }
  75. }