class CapicuaGen::Melchior::SqlTableParse

Analizador de tabla SQL segun su archivo de creacio (DLL) en este caso se hace a traves de un script exportado directamente de SQL Server de momento no es posible parsear un script realizado a mano, solo los exportados por MS SQL Server

Public Class Methods

new() click to toggle source
# File lib/CapicuaGenMelchior/DataAccess/EntitySqlDataAccess/Source/sql_table_parser.rb, line 33
def initialize

end

Public Instance Methods

parse_file(*files) click to toggle source

Parsea s archivos recibidos

# File lib/CapicuaGenMelchior/DataAccess/EntitySqlDataAccess/Source/sql_table_parser.rb, line 80
def parse_file(*files)

  # Resultado
  tables_string= []

  files.each do |f|
    sql_string= File.open(f).read
    tables_string << sql_string
  end

  return parse_string(*tables_string)

end
parse_string(*sql_strings) click to toggle source

Parsea el string y devuelve las tablas encontradas

# File lib/CapicuaGenMelchior/DataAccess/EntitySqlDataAccess/Source/sql_table_parser.rb, line 38
def parse_string(*sql_strings)

  create_table= /(CREATE\s+TABLE[^\(]+)/mi

  tables= []

  sql_strings.each do |s|

    sql_string= s.clone

    while (sql_string.length>0) do

      # Busco la opcion de crear una tabla
      index= sql_string.index(create_table)

      # Salida
      break unless index

      # Elimino dentro lo que hay antes del CREATE TABLE
      sql_string = sql_string[index..sql_string.length]

      # Obtengo el create table completo
      table_found= find_create_table sql_string

      if table_found
        table= create_table table_found
        tables.push table
      end


      # Obtengo el resto de la cadena
      sql_string= sql_string[table_found.length..sql_string.length]
    end

    return tables


  end

end

Private Instance Methods

create_table(create_table) click to toggle source
# File lib/CapicuaGenMelchior/DataAccess/EntitySqlDataAccess/Source/sql_table_parser.rb, line 118
def create_table create_table


  #obtengo el nombre del campo
  expresion_tabla= /CREATE\s+TABLE([^\(]+)/mi
  expresion_tabla.match(create_table)
  # Nombre en crudo
  sql_name= $1
  sql_name.strip!.gsub!("\"", '')

  # Creo la tabla
  tabla= EntitySchema.new :sql_name => sql_name

  expresion_campo            = /\[?(\S+?)\]?\s+\[?(int|n?varchar|n?char|money|real|int|smallint|datetime|bit)\]?\s*(IDENTITY)?\s*(?:\(([^\)]+?)\))?\s*(NOT\s+NULL|NULL)\s*/mi
  expresion_contraint_primary= /CONSTRAINT\s+\S+\s+PRIMARY[^\(]+?\(([^\)]+)\)/mi


  expresion_contraint_primary.match(create_table)
  llaves_primarias= $1


  #obtengo todos los campos
  create_table.scan (expresion_campo) do |nombre, tipo, identity, longitud, nulo|

    nombre.gsub!('([', '')

    campo= EntityFieldSchema.new :sql_name => nombre, :sql_type => tipo

    case tipo.upcase
      when "VARCHAR", "CHAR", "NVARCHAR", "NCHAR"
        campo.size= longitud if longitud
    end

    campo.allow_null = true if /NULL/i.match(nulo)
    campo.allow_null = false if /NOT/i.match(nulo)

    #reviso a ver si es llave primaria
    campo.primary_key= true if llaves_primarias and llaves_primarias.index(campo.name)

    #Agrega información de indentidad.
    campo.identity   = true if identity

    #agrego el campo
    tabla.fields.push campo
  end


  return tabla

end
find_create_table(sql_string) click to toggle source
# File lib/CapicuaGenMelchior/DataAccess/EntitySqlDataAccess/Source/sql_table_parser.rb, line 98
def find_create_table sql_string
  resultado        = ''
  numero_parentesis= 1

  indexBajo= sql_string.index("(")+1
  resultado= sql_string[0..indexBajo]

  for n in indexBajo+1..sql_string.length-1 do
    caracter         = sql_string[n]
    numero_parentesis= numero_parentesis+1 if caracter=="("
    numero_parentesis= numero_parentesis-1 if caracter==")"
    resultado        = resultado+caracter
    break if numero_parentesis==0
  end

  return resultado

end