From b293d99554cf50e43762fbaf7307b22dd4adc498 Mon Sep 17 00:00:00 2001 From: Sybil <sybil.deboin@gmail.com> Date: Wed, 14 Jan 2015 22:30:13 +0100 Subject: [PATCH] In progress : Sidekiq worker managing database update and migration. --- Gemfile | 5 ++ app/serializers/track_serializer.rb | 2 + app/workers/database_migration.rb | 33 +++++++++++++ app/workers/database_update.rb | 9 ++++ lib/database_migration.sql | 73 +++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 app/workers/database_migration.rb create mode 100644 app/workers/database_update.rb create mode 100644 lib/database_migration.sql diff --git a/Gemfile b/Gemfile index 5266eef..457e95c 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 30265c8..e3ef331 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 0000000..661eb80 --- /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 0000000..c32e3ed --- /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 0000000..3665cd1 --- /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; + -- GitLab