module Logidze::Utils::FunctionDefinitions

Public Class Methods

from_db() click to toggle source
# File lib/logidze/utils/function_definitions.rb, line 23
        def from_db
          query = <<~SQL
            SELECT pp.proname, pg_get_functiondef(pp.oid) AS definition
            FROM pg_proc pp
            WHERE pp.proname like 'logidze_%'
            ORDER BY pp.oid;
          SQL
          ActiveRecord::Base.connection.execute(query).map do |row|
            version = parse_version(row["definition"])
            FuncDef.new(row["proname"], version, nil)
          end
        end
from_fs() click to toggle source
# File lib/logidze/utils/function_definitions.rb, line 9
def from_fs
  function_paths = Dir.glob(File.join(__dir__, "..", "..", "generators", "logidze", "install", "functions", "*.sql"))
  function_paths.map do |path|
    name = path.match(/([^\/]+)\.sql/)[1]

    file = File.open(path)
    header, version_comment = file.readline, file.readline

    signature = parse_signature(header)
    version = parse_version(version_comment)
    FuncDef.new(name, version, signature)
  end
end

Private Class Methods

parse_signature(line) click to toggle source
# File lib/logidze/utils/function_definitions.rb, line 42
def parse_signature(line)
  parameters = line.match(/CREATE OR REPLACE FUNCTION\s+[\w_]+\((.*)\)/)[1]
  parameters.split(/\s*,\s*/).map { |param| param.split(/\s+/, 2).last.sub(/\s+DEFAULT .*$/, "") }.join(", ")
end
parse_version(line) click to toggle source
# File lib/logidze/utils/function_definitions.rb, line 38
def parse_version(line)
  line.match(/version:\s+(\d+)/)&.[](1).to_i
end