You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

migrate.rb 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. require 'pg'
  2. require 'sequel'
  3. require_relative 'connect'
  4. def migrate
  5. db = DB
  6. db.create_table? :threads do
  7. primary_key :id
  8. String :title
  9. String :creator, index: true
  10. Integer :remote_id, index: true, unique: true
  11. String :last_post_creator
  12. DateTime :last_post_created_at
  13. DateTime :created_at, index: true
  14. end
  15. db.create_table? :posts do
  16. primary_key :id
  17. String :body
  18. String :creator, index: true
  19. Integer :remote_id, index: true, unique: true
  20. foreign_key :thread_id, :threads
  21. DateTime :created_at, index: true
  22. column :tsv, 'tsvector'
  23. end
  24. db.run('CREATE INDEX IF NOT EXISTS tsv_idx ON posts USING gin(tsv);')
  25. begin
  26. db.create_function(:update_last_post, <<-SQL, language: :plpgsql, returns: :trigger)
  27. BEGIN
  28. UPDATE threads
  29. SET
  30. last_post_created_at = NEW.created_at,
  31. last_post_creator = NEW.creator
  32. WHERE
  33. threads.id = NEW.thread_id;
  34. RETURN NEW;
  35. END
  36. SQL
  37. rescue Sequel::DatabaseError => e
  38. raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
  39. end
  40. begin
  41. db.create_function(:set_posts_tsv, <<-SQL, language: :plpgsql, returns: :trigger)
  42. BEGIN
  43. NEW.tsv = to_tsvector(new.body);
  44. RETURN NEW;
  45. END
  46. SQL
  47. rescue Sequel::DatabaseError => e
  48. raise e unless e.wrapped_exception.is_a?(PG::DuplicateFunction)
  49. end
  50. begin
  51. db.run(<<-SQL)
  52. CREATE TRIGGER update_last_post
  53. AFTER INSERT ON posts
  54. FOR EACH ROW
  55. EXECUTE PROCEDURE update_last_post();
  56. SQL
  57. rescue Sequel::DatabaseError => e
  58. raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
  59. end
  60. begin
  61. db.run(<<-SQL)
  62. CREATE TRIGGER set_posts_tsv
  63. BEFORE INSERT OR UPDATE ON posts
  64. FOR EACH ROW
  65. EXECUTE PROCEDURE set_posts_tsv();
  66. SQL
  67. rescue Sequel::DatabaseError => e
  68. raise e unless e.wrapped_exception.is_a?(PG::DuplicateObject)
  69. end
  70. end