2023032600-online_log_per_user-ip.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. declare(strict_types=1);
  3. use App\Interfaces\MigrationInterface;
  4. use App\Services\DB;
  5. return new class() implements MigrationInterface {
  6. public function up(): int
  7. {
  8. $pdo = DB::getPdo();
  9. $pdo->exec('
  10. CREATE TABLE online_log (
  11. id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  12. user_id INT UNSIGNED NOT NULL,
  13. ip INET6 NOT NULL,
  14. node_id INT UNSIGNED NOT NULL,
  15. first_time INT UNSIGNED NOT NULL,
  16. last_time INT UNSIGNED NOT NULL,
  17. PRIMARY KEY (id),
  18. UNIQUE KEY (user_id, ip)
  19. )
  20. ');
  21. $pdo->exec('
  22. INSERT INTO online_log (user_id, ip, node_id, first_time, last_time)
  23. SELECT
  24. userid,
  25. CASE
  26. WHEN IS_IPV4(ip) = 1 THEN CONCAT("::ffff:", ip)
  27. WHEN IS_IPV6(ip) = 1 THEN ip
  28. ELSE NULL
  29. END AS new_ip,
  30. nodeid,
  31. MIN(datetime) AS first_time,
  32. MAX(datetime) AS last_time
  33. FROM
  34. alive_ip
  35. WHERE
  36. userid IS NOT NULL
  37. AND nodeid IS NOT NULL
  38. AND datetime IS NOT NULL
  39. GROUP BY
  40. userid, ip
  41. HAVING
  42. new_ip IS NOT NULL
  43. ');
  44. $pdo->exec('DROP TABLE alive_ip');
  45. return 2023032500;
  46. }
  47. public function down(): int
  48. {
  49. $pdo = DB::getPdo();
  50. $pdo->exec('
  51. CREATE TABLE alive_ip (
  52. id BIGINT(20) NOT NULL AUTO_INCREMENT,
  53. nodeid INT(11) DEFAULT NULL,
  54. userid INT(11) DEFAULT NULL,
  55. ip VARCHAR(255) DEFAULT NULL,
  56. datetime BIGINT(20) DEFAULT NULL,
  57. PRIMARY KEY (id)
  58. ) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  59. ');
  60. $pdo->exec('
  61. INSERT INTO alive_ip (nodeid, userid, ip, datetime)
  62. SELECT node_id, user_id, ip, first_time AS datetime FROM online_log
  63. UNION
  64. SELECT node_id, user_id, ip, last_time AS datetime FROM online_log
  65. ');
  66. $pdo->exec('DROP TABLE online_log');
  67. return 2023031701;
  68. }
  69. };