summaryrefslogtreecommitdiffstats
path: root/pg2rb.rb
diff options
context:
space:
mode:
Diffstat (limited to 'pg2rb.rb')
-rwxr-xr-xpg2rb.rb153
1 files changed, 153 insertions, 0 deletions
diff --git a/pg2rb.rb b/pg2rb.rb
new file mode 100755
index 0000000..764c94e
--- /dev/null
+++ b/pg2rb.rb
@@ -0,0 +1,153 @@
+#! /usr/bin/env ruby
+# -*- coding: UTF-8 -*-
+
+#----------------------------------------------------------------------------
+#
+# File : dia2pg.rb
+# Author : Jérémy Zurcher <jeremy@asynk.ch>
+# Date : 24/08/10
+# License :
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+#----------------------------------------------------------------------------
+#
+require 'ostruct'
+require 'optparse'
+#
+class OpenStruct
+ def to_h; @table end
+end
+#
+options = OpenStruct.new
+#
+options.verbose = false
+options.input = nil
+options.database = nil
+options.indent=4
+#
+opts = OptionParser.new do |opts|
+ opts.banner = "Usage: #{$0} [options]"
+ opts.on( "-i", "--input FILENAME", "input file" ) { |n| options.input = n }
+ opts.on( "-V", "--verbose", "produce verbose output" ) { options.verbose = true }
+ opts.on( "-d", "--database DATABASE", "set default database" ) { |n| options.database = n }
+ opts.on( "-n", "--indent N", "set number of indentation spaces" ) { |n| options.indent = n.to_i }
+end
+#
+options.tbl_prefix+='_' if not options.tbl_prefix.nil? and options.tbl_prefix[-1]!='_'
+#
+opts.parse!(ARGV)
+#
+if options.input.nil?
+ $stderr << "missing input file argument\n"
+ exit 1
+end
+#
+INDENT="\n"+" "*options.indent
+#
+class Table
+ #
+ def initialize n, t, a, d
+ @name = n
+ @tbl_prefix = t
+ @attr_prefix = a
+ @db = d
+ @ids = []
+ @bools = []
+ @floats = []
+ @integers = []
+ @texts = []
+ @times = []
+ end
+ attr_reader :ids, :bools, :floats, :integers, :texts, :times
+ #
+ def name
+ (@tbl_prefix.nil? ? @name : @name[@tbl_prefix.length..-1]).capitalize # TODO replace _(.) by $1.capitalize
+ end
+ #
+ def to_s
+ r="class #{name}"
+ r << INDENT+'#'
+ r << INDENT+'include Hmsa_lib::PgsqlModel'
+ r << INDENT+'#'
+ r << INDENT+"db '#{@db}'.freeze" unless @db.nil?
+ r << INDENT+"prefix '#{@attr_prefix}'.freeze" unless @attr_prefix.nil?
+ r << INDENT+'#' unless @db.nil? and @attr_prefix.nil?
+ r << INDENT+"ids " + @ids.collect { |i| ":#{i}" }.join(', ') unless @ids.empty?
+ [ :bools, :floats, :integers, :texts, :times].each do |sym|
+ attrs = send sym
+ next if attrs.empty?
+ r << INDENT+"#{sym} " + attrs.collect { |a| ":#{@attr_prefix.nil? ? a : a[@attr_prefix.length..-1]}" }.join(', ')
+ end
+ r << INDENT+'#'
+ r << INDENT+'sql_stmts( {'
+ r << INDENT+" # :exists => [ 'select count(*) from #{@name} where #{@ids[0]}=$1::int', :#{@ids[0]} ]," unless @ids.empty?
+ r << INDENT+'} )'
+ r << INDENT+'#'
+ r << "\nend"
+ end
+end
+#
+TABLES=[]
+#
+tbl=nil
+tbl_prefix=nil
+attr_prefix=nil
+File.open(options.input).readlines.each do |l|
+# puts l
+ if l=~/dia2pg/
+ l.split.each do |s|
+ k,v = s.split '='
+ if k=~/tbl_prefix/
+ tbl_prefix=v
+ elsif k=~/attr_prefix/
+ attr_prefix=v
+ end
+ end
+ elsif l=~/CREATE TABLE (\S+)/
+ tbl = Table.new $1, tbl_prefix, attr_prefix, options.database
+ tbl_prefix=nil
+ attr_prefix=nil
+ TABLES << tbl
+ elsif l=~/PRIMARY\s+KEY\s+\((\w*)\)/
+ $1.split(/,/).reverse.each do |i|
+ tbl.ids.insert 0, i
+ end
+ elsif l=~/(\w+)\s+integer\s+REFERENCES/
+ tbl.ids << $1
+ elsif l=~/(\w+)\s+boolean/
+ tbl.bools << $1
+ elsif l=~/(\w+)\s+double/
+ tbl.floats << $1
+ elsif l=~/(\w+)\s+integer/
+ tbl.integers << $1
+ elsif l=~/(\w+)\s+text/
+ tbl.texts << $1
+ elsif l=~/(\w+)\s+char/
+ tbl.texts << $1
+ elsif l=~/(\w+)\s+timestamp/
+ tbl.times << $1
+ end
+end
+#
+TABLES.each do |t|
+ puts "#"
+ puts t
+end