File: expiration_time_sql_math.rb

package info (click to toggle)
ruby-doorkeeper 5.8.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 992 kB
  • sloc: ruby: 4,644; makefile: 4
file content (88 lines) | stat: -rw-r--r-- 2,773 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# frozen_string_literal: true

module Doorkeeper
  module Models
    module ExpirationTimeSqlMath
      extend ::ActiveSupport::Concern

      class ExpirationTimeSqlGenerator
        attr_reader :model

        delegate :table_name, to: :@model

        def initialize(model)
          @model = model
        end

        def generate_sql
          raise "`generate_sql` should be overridden for a #{self.class.name}!"
        end
      end

      class MySqlExpirationTimeSqlGenerator < ExpirationTimeSqlGenerator
        def generate_sql
          Arel.sql("DATE_ADD(#{table_name}.created_at, INTERVAL #{table_name}.expires_in SECOND)")
        end
      end

      class SqlLiteExpirationTimeSqlGenerator < ExpirationTimeSqlGenerator
        def generate_sql
          Arel.sql("DATETIME(#{table_name}.created_at, '+' || #{table_name}.expires_in || ' SECONDS')")
        end
      end

      class SqlServerExpirationTimeSqlGenerator < ExpirationTimeSqlGenerator
        def generate_sql
          Arel.sql("DATEADD(second, #{table_name}.expires_in, #{table_name}.created_at) AT TIME ZONE 'UTC'")
        end
      end

      class OracleExpirationTimeSqlGenerator < ExpirationTimeSqlGenerator
        def generate_sql
          Arel.sql("#{table_name}.created_at + INTERVAL to_char(#{table_name}.expires_in) second")
        end
      end

      class PostgresExpirationTimeSqlGenerator < ExpirationTimeSqlGenerator
        def generate_sql
          Arel.sql("#{table_name}.created_at + #{table_name}.expires_in * INTERVAL '1 SECOND'")
        end
      end

      ADAPTERS_MAPPING = {
        "sqlite" => SqlLiteExpirationTimeSqlGenerator,
        "sqlite3" => SqlLiteExpirationTimeSqlGenerator,
        "postgis" => PostgresExpirationTimeSqlGenerator,
        "postgresql" => PostgresExpirationTimeSqlGenerator,
        "mysql" => MySqlExpirationTimeSqlGenerator,
        "mysql2" => MySqlExpirationTimeSqlGenerator,
        "trilogy" => MySqlExpirationTimeSqlGenerator,
        "sqlserver" => SqlServerExpirationTimeSqlGenerator,
        "oracleenhanced" => OracleExpirationTimeSqlGenerator,
      }.freeze

      module ClassMethods
        def supports_expiration_time_math?
          ADAPTERS_MAPPING.key?(adapter_name.downcase) ||
            respond_to?(:custom_expiration_time_sql)
        end

        def expiration_time_sql
          if respond_to?(:custom_expiration_time_sql)
            custom_expiration_time_sql
          else
            expiration_time_sql_expression
          end
        end

        def expiration_time_sql_expression
          ADAPTERS_MAPPING.fetch(adapter_name.downcase).new(self).generate_sql
        end

        def adapter_name
          ActiveRecord::Base.connection.adapter_name
        end
      end
    end
  end
end