From 9d3d7abedcc4e106c069e1fde95372dff118eae7 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Mon, 25 Jan 2016 16:29:53 -0800 Subject: [PATCH] add support for read only post queries --- app/controllers/posts_controller.rb | 2 +- app/logical/post_sets/post.rb | 5 +++-- app/models/post.rb | 8 ++++++-- app/models/post_read_only.rb | 4 ++++ script/install/database.yml.templ | 17 +++++++++++++++++ 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 app/models/post_read_only.rb diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 84d3d0eeb..5bae722f0 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -15,7 +15,7 @@ class PostsController < ApplicationController else limit = params[:limit] || (params[:tags] =~ /(?:^|\s)limit:(\d+)(?:$|\s)/ && $1) || CurrentUser.user.per_page @random = params[:random] || params[:tags] =~ /(?:^|\s)order:random(?:$|\s)/ - @post_set = PostSets::Post.new(tag_query, params[:page], limit, raw: params[:raw], random: @random, format: params[:format]) + @post_set = PostSets::Post.new(tag_query, params[:page], limit, raw: params[:raw], random: @random, format: params[:format], read_only: params[:ro]) @posts = @post_set.posts respond_with(@posts) do |format| format.atom diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index f78ff8f60..85048aca5 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -1,6 +1,6 @@ module PostSets class Post < PostSets::Base - attr_reader :tag_array, :page, :per_page, :raw, :random, :post_count, :format + attr_reader :tag_array, :page, :per_page, :raw, :random, :post_count, :format, :read_only def initialize(tags, page = 1, per_page = nil, options = {}) @tag_array = Tag.scan_query(tags) @@ -10,6 +10,7 @@ module PostSets @raw = options[:raw].present? @random = options[:random].present? @format = options[:format] || "html" + @read_only = options[:read_only] end def tag_string @@ -128,7 +129,7 @@ module PostSets elsif raw temp = ::Post.raw_tag_match(tag_string).order("posts.id DESC").paginate(page, :count => post_count, :limit => per_page) else - temp = ::Post.tag_match(tag_string).paginate(page, :count => post_count, :limit => per_page) + temp = ::Post.tag_match(tag_string, read_only).paginate(page, :count => post_count, :limit => per_page) end temp.each # hack to force rails to eager load temp diff --git a/app/models/post.rb b/app/models/post.rb index d5ce0912b..8beec866b 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1513,8 +1513,12 @@ class Post < ActiveRecord::Base where("posts.tag_index @@ to_tsquery('danbooru', E?)", tag.to_escaped_for_tsquery) end - def tag_match(query) - PostQueryBuilder.new(query).build + def tag_match(query, read_only = false) + if read_only + PostQueryBuilder.new(query).build(PostReadOnly.where("true")) + else + PostQueryBuilder.new(query).build + end end def positive diff --git a/app/models/post_read_only.rb b/app/models/post_read_only.rb new file mode 100644 index 000000000..c70f75b63 --- /dev/null +++ b/app/models/post_read_only.rb @@ -0,0 +1,4 @@ +class PostReadOnly < Post + establish_connection "ro_#{Rails.env}".to_sym + attr_readonly *column_names +end diff --git a/script/install/database.yml.templ b/script/install/database.yml.templ index 3032947e7..aa9bfad30 100755 --- a/script/install/database.yml.templ +++ b/script/install/database.yml.templ @@ -20,3 +20,20 @@ production: database: danbooru2 pool: 5 timeout: 5000 + +# read only databases, just point to local copies if you have no need +ro_development: + adapter: postgresql + database: danbooru2 + +ro_test: + adapter: postgresql + database: danbooru2_test + +ro_production: + adapter: postgresql + database: danbooru2 + +ro_staging: + adapter: postgresql + database: danbooru2 \ No newline at end of file