Class: Ronin::Code::SQL::Dialect

Inherits:
Object
  • Object
show all
Defined in:
lib/ronin/code/sql/dialect.rb

Direct Known Subclasses

CommonDialect

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(symbols = {}) ⇒ Dialect

Creates a new Dialect object connected to the specified program.



44
45
46
47
# File 'lib/ronin/code/sql/dialect.rb', line 44

def initialize(symbols={})
  @symbols = SymbolTable.new(symbols)
  @statements = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *arguments, &block) ⇒ Object (protected)

Raises:

  • (NoMethodError)


271
272
273
274
275
276
277
# File 'lib/ronin/code/sql/dialect.rb', line 271

def method_missing(name,*arguments,&block)
  if (arguments.empty? && block.nil?)
    return field(name)
  end

  raise(NoMethodError,name.id2name)
end

Instance Attribute Details

#statementsObject (readonly)

Statements used within the dialect



38
39
40
# File 'lib/ronin/code/sql/dialect.rb', line 38

def statements
  @statements
end

#symbolsObject (readonly)

Symbol Table for the dialect



35
36
37
# File 'lib/ronin/code/sql/dialect.rb', line 35

def symbols
  @symbols
end

Class Method Details

.clausesObject



90
91
92
93
94
95
96
97
98
# File 'lib/ronin/code/sql/dialect.rb', line 90

def self.clauses
  all_clauses = {}

  self.statements.each do |stmt|
    all_clauses.merge!(stmt.clauses)
  end

  return all_clauses
end

.dialectsObject

Returns the Hash of defined SQL dialects.



52
53
54
# File 'lib/ronin/code/sql/dialect.rb', line 52

def Dialect.dialects
  @@dialects ||= {}
end

.get(name) ⇒ Object

Returns the SQL Dialect defined with the specified name. If no such SQL Dialect exists, an UnknownDialect exception will be raised.



69
70
71
72
73
74
75
76
77
# File 'lib/ronin/code/sql/dialect.rb', line 69

def Dialect.get(name)
  name = name.to_sym

  unless Dialect.has_dialect?(name)
    raise(UnknownDialect,"unknown dialect #{name}",caller)
  end

  return Dialect.dialects[name]
end

.has_clause?(name) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
103
104
105
106
# File 'lib/ronin/code/sql/dialect.rb', line 100

def self.has_clause?(name)
  self.statements.each_value do |stmt|
    return true if stmt.has_clause?(name)
  end

  return false
end

.has_dialect?(name) ⇒ Boolean

Returns true if there is a SQL Dialect defined with the specified name, returns false otherwise.

Returns:

  • (Boolean)


60
61
62
# File 'lib/ronin/code/sql/dialect.rb', line 60

def Dialect.has_dialect?(name)
  Dialect.dialects.has_key?(name.to_sym)
end

.has_statement?(name) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/ronin/code/sql/dialect.rb', line 86

def self.has_statement?(name)
  self.statements.has_key?(name.to_sym)
end

.statementsObject

Returns the Hash of defined Statements within the Dialect.



82
83
84
# File 'lib/ronin/code/sql/dialect.rb', line 82

def self.statements
  @@statements ||= {}
end

Instance Method Details

#allObject



159
160
161
# File 'lib/ronin/code/sql/dialect.rb', line 159

def all
  Token.new('*')
end

#clause(name, *arguments) ⇒ Object

Raises:



133
134
135
136
137
138
139
140
141
142
143
# File 'lib/ronin/code/sql/dialect.rb', line 133

def clause(name,*arguments)
  name = name.to_sym

  self.class.statements.each do |stmt|
    if stmt.has_cluase?(name)
      return stmt.clauses[name].new(*arguments)
    end
  end

  raise(UnknownClause,"unknown clause #{name}",caller)
end

#each_token(&block) ⇒ Object



167
168
169
170
171
172
173
174
175
# File 'lib/ronin/code/sql/dialect.rb', line 167

def each_token(&block)
  @statements.each do |stmt|
    stmt.emit.each(&block)

    block.call(Token.separator)
  end

  return self
end

#enqueue_statement(name, *arguments, &block) ⇒ Object



122
123
124
125
126
127
# File 'lib/ronin/code/sql/dialect.rb', line 122

def enqueue_statement(name,*arguments,&block)
  stmt = statement(name,*arguments,&block)

  @statements << stmt
  return stmt
end

#field(name) ⇒ Object



152
153
154
155
156
157
# File 'lib/ronin/code/sql/dialect.rb', line 152

def field(name)
  sym = @symbols.symbol(name)
  sym.value ||= Field.new(@symbols,name)

  return sym
end

#has_clause?(name) ⇒ Boolean

Returns:

  • (Boolean)


129
130
131
# File 'lib/ronin/code/sql/dialect.rb', line 129

def has_clause?(name)
  self.class.has_clause?(name)
end

#has_statement?(name) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/ronin/code/sql/dialect.rb', line 108

def has_statement?(name)
  self.class.has_statement?(name)
end

#idObject



163
164
165
# File 'lib/ronin/code/sql/dialect.rb', line 163

def id
  field('id')
end

#statement(name, *arguments, &block) ⇒ Object



112
113
114
115
116
117
118
119
120
# File 'lib/ronin/code/sql/dialect.rb', line 112

def statement(name,*arguments,&block)
  name = name.to_sym

  unless has_statement?(name)
    raise(UnknownStatement,"unknown statement #{name} in #{dialect} dialect",caller)
  end

  return self.class.statements[name].new(self,*arguments,&block)
end

#symbol(name) ⇒ Object



145
146
147
148
149
150
# File 'lib/ronin/code/sql/dialect.rb', line 145

def symbol(name)
  sym = @symbols.symbol(name)
  sym.value ||= name

  return sym
end