diff --git a/Gemfile b/Gemfile index 5266eef5f997e9fdbf54a467d4457804e1be2fa7..457e95cadcc4551596cfd865ebb70918b4f72098 100644 --- a/Gemfile +++ b/Gemfile @@ -23,6 +23,11 @@ gem 'active_model_serializers' #Because we're using a shitty database designed by a fuckin' drug addict gem 'composite_primary_keys' +#Framework for background job processing : managing the database transformation between servers +gem 'sidekiq' +#Framework for distributed schedulinh +gem 'sidetiq' + # Use jquery as the JavaScript library #gem 'jquery-rails' diff --git a/app/serializers/track_serializer.rb b/app/serializers/track_serializer.rb index 30265c89b5f3a92fe6654b93b5642972831cbf1e..e3ef331c7ab29f3bc8854eff6691888e550b4556 100644 --- a/app/serializers/track_serializer.rb +++ b/app/serializers/track_serializer.rb @@ -1,6 +1,8 @@ class TrackSerializer < ActiveModel::Serializer attributes :id, :title, :url, :type + #embed :ids, include: true + has_one :channel has_many :tags diff --git a/app/workers/database_migration.rb b/app/workers/database_migration.rb new file mode 100644 index 0000000000000000000000000000000000000000..661eb80b3136d47a6ccfea21fb25f1d19d27eb61 --- /dev/null +++ b/app/workers/database_migration.rb @@ -0,0 +1,33 @@ +lass DatabaseMigration + include Sidekiq::Worker + include Sidetiq::Schedulable + recurrence { hourly } + + + def perform + local_dump_path = 'PlayBotAPI/playbot_database_dump.sql' + + create_distant_dump + import_dump local_dump_path + revamp_database local_dump_path + end + + def create_distant_dump + dump_file = '<distant_path_of_dump_file>' + dump_command = 'mysqldump --single-transaction -h <mysql_info> -u <user_name> -p<password> <table_name>' + + system("ssh <server_with_playbot_database> '#{dump_command} > #{dump_file}'") + end + + def import_dump( local_dump_path ) + distant_dump_path = '<distant_path_of_dump_file>' + + systen("scp <server_with_playbot_database>:#{distant_dump_path} #{local_dump_path}") + end + + def revamp_database( local_dump_path ) + ActiveRecord::Base.connection.execute(File.read(local_dump_path)) + ActiveRecord::Base.connection.execute(File.read("lib/database_migration.sql")) + end + +end diff --git a/app/workers/database_update.rb b/app/workers/database_update.rb new file mode 100644 index 0000000000000000000000000000000000000000..c32e3edcad79dc01595232cdd09908fddbf11b1b --- /dev/null +++ b/app/workers/database_update.rb @@ -0,0 +1,9 @@ +lass DatabaseUpdate + include Sidekiq::Worker + include Sidetiq::Schedulable + recurrence { hourly } + + def perform + #TODO : Optimize update in place of rewritting all database + end +end diff --git a/lib/database_migration.sql b/lib/database_migration.sql new file mode 100644 index 0000000000000000000000000000000000000000..3665cd1886f729d49a4e0a59390887f4923ef515 --- /dev/null +++ b/lib/database_migration.sql @@ -0,0 +1,73 @@ +drop table if exists tracks, tags, tag_assignation, channels, users, irc_posts; + +create table tracks ( + track_id INT NOT NULL UNIQUE, + name VARCHAR(255), + url VARCHAR(255), + provider VARCHAR(255), + PRIMARY KEY (track_id) +); + +create table tags ( + tag_id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) UNIQUE, + quantity INT, + PRIMARY KEY (tag_id) +); + +create table tag_assignation ( + track_id INT, + tag_id INT); + +create table channels ( + channel_id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) UNIQUE, + quantity INT, + PRIMARY KEY (channel_id) +); + +create table users ( + user_id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) UNIQUE, + quantity INT, + PRIMARY KEY (user_id) +); + +create table irc_posts ( + track_id INT, + channel_id INT, + user_id INT, + date TIMESTAMP); + +insert into tracks (track_id, name, provider, url) + SELECT id, title, type, url + FROM playbot; + +insert into users (name) + SELECT DISTINCT sender_irc + FROM playbot_chan; + +insert into channels (name) + SELECT DISTINCT chan + FROM playbot_chan; + +insert into tags (name) + SELECT DISTINCT tag + FROM playbot_tags; + +insert into tag_assignation (track_id, tag_id) + SELECT id, tag_id + FROM playbot_tags + LEFT JOIN tags + ON playbot_tags.tag = tags.name; + +alter table playbot_chan convert to character set utf8 collate utf8_general_ci; + +insert into irc_posts (track_id, channel_id, user_id, date) + SELECT content, channel_id, user_id, date + FROM playbot_chan + LEFT JOIN channels + ON playbot_chan.chan = channels.name + LEFT JOIN users + ON playbot_chan.sender_irc = users.name; +