Module: Mkxms::Mssql::AccessObjectDefinition

Defined in:
lib/mkxms/mssql/access_object_definition.rb

Defined Under Namespace

Classes: Scanner

Class Method Summary collapse

Class Method Details

.replace_object_name(dfn, s) ⇒ Object



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
# File 'lib/mkxms/mssql/access_object_definition.rb', line 27

def self.replace_object_name(dfn, s)
  scan = Scanner.new(dfn)
  looking_for = :create
  name_start = name_end = nil
  while scan.remaining?
    case
    when scan.next_is(/\s+/) # whitespace
    when scan.next_is(/--.*?\n/) # one line comment
    when scan.next_is(%r{/\*.*?\*/}m) # delimited comment
      nil
    when looking_for.equal?(:create) && scan.next_is(/CREATE\s/i)
      looking_for = :object_type
    when looking_for.equal?(:object_type) && scan.next_is(/(VIEW|PROC(EDURE)?|FUNCTION)\s/i)
      looking_for = :object_name
    when looking_for.equal?(:object_name) && scan.next_is(/[a-z][a-z0-9_]*|\[([^\]]|\]\])+\]/i)
      name_start ||= scan.last_match.begin(0)
      name_end = scan.last_match.end(0)
      looking_for = :qualifier_mark
    when looking_for.equal?(:qualifier_mark) && scan.next_is(/\./)
      looking_for = :object_name
    when looking_for.equal?(:qualifier_mark) && scan.next_is(/[^.]/)
      break
    end
  end
  
  dfn.dup.tap do |result|
    result[name_start...name_end] = s
    
    # These two steps keep the SQL from being in double-quoted scalar format:
    result.gsub!(/\s+\n/, "\n")
    result.replace(Utils.expand_tabs(result, tab_width: 4))
  end
end