PgsqlSwoole.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. use Swoole\Database\PDOConfig;
  3. use Swoole\Database\PDOPool;
  4. class PgsqlSwoole extends MysqlSwoole
  5. {
  6. protected Pool|PDOPool $pool;
  7. public function __construct($size)
  8. {
  9. $config = (new PDOConfig())
  10. ->withDriver('pgsql')
  11. ->withHost('tfb-database')
  12. ->withPort(5432)
  13. ->withDbName('hello_world')
  14. ->withUsername('benchmarkdbuser')
  15. ->withPassword('benchmarkdbpass');
  16. $this->pool = new PDOPool($config, $size);
  17. }
  18. function update($request): array
  19. {
  20. $count = min(max((int) $request->get('q'), 1), 500);
  21. $worlds = [];
  22. $pdo = $this->pool->get();
  23. $random = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
  24. while ($count--) {
  25. $random->execute([mt_rand(1, 10000)]);
  26. $world = $random->fetch(PDO::FETCH_ASSOC);
  27. $world['randomNumber'] = mt_rand(1, 10000);
  28. $worlds[] = $world;
  29. }
  30. $rows = count($worlds);
  31. $sql = 'UPDATE world SET randomNumber = CASE id'
  32. . str_repeat(' WHEN ?::INTEGER THEN ?::INTEGER ', $rows)
  33. . 'END WHERE id IN ('
  34. . str_repeat('?::INTEGER,', $rows - 1) . '?::INTEGER)';
  35. $update = $pdo->prepare($sql);
  36. $val = [];
  37. $keys = [];
  38. foreach ($worlds as $world) {
  39. $val[] = $keys[] = $world['id'];
  40. $val[] = $world['randomNumber'];
  41. }
  42. $update->execute([...$val, ...$keys]);
  43. $this->pool->put($pdo);
  44. return $worlds;
  45. }
  46. }