Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lib/maskdump.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

module Maskdump
autoload :Command, "maskdump/command"
autoload :Runner, "maskdump/runner"
autoload :Parser, "maskdump/parser"
autoload :Setting, 'maskdump/setting'
autoload :Table, 'maskdump/table'
autoload :Mask, 'maskdump/mask'
autoload :BulkInsert, 'maskdump/bulk_insert'
autoload :Dump, 'maskdump/dump'
end
20 changes: 20 additions & 0 deletions lib/maskdump/dump.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require 'open3'

module Maskdump
class Dump
def initialize(db, output_filename)
@db = db.to_s
@output_filename = output_filename
end

def run
Open3.popen3("pg_dump -d #{@db} -f #{@output_filename}") do |stdin, stdout, stderr, thr|
stdin.close
stderr.each{ |line| puts line }
stdout.each{ |line| puts line }
thr.join
end
end
end
end

127 changes: 127 additions & 0 deletions lib/maskdump/parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
require 'parslet'

module Maskdump
class Parser
class << self
def parse(data)
parser.parse(data)
end

private

def parser
@parser ||= ParsletParser.new
end
end
end

class ParsletParser < Parslet::Parser

root(:statements)

rule(:statements) do
statement.repeat
end

rule(:statement) do
copy | newline | something | spaces
end

rule(:delimiter) do
str(";")
end

rule(:newline) do
str("\n") >> str("\r").maybe
end

#
# space except newline (tab may not be included)
#
rule(:space) do
match('[^\S\r\n]')
end

rule(:spaces) do
space.repeat(1)
end

rule(:space?) do
space.repeat
end

rule(:tab) do
match('\t')
end

#
# some word except newline and space. include special characters like '-'
#
rule(:something) do
match('\R').absent? >> space.absent? >> match('\S').repeat(1)
end

#
# some value except newline and tab. include special characters like '-', space
#
rule(:column_value) do
(
match('\R').absent? >> match('\t').absent? >>
(
match('\S') | match('\s')
)
).repeat(1)
end

#
# some word except special characters like '-'
#
rule(:word) do
match('\w').repeat(1)
end

rule(:table_name) do
word
end

rule(:column_definitions) do
parenthetical(comma_separated(word.as(:column_definition)))
end

rule(:column_values) do
tab_separated(column_value.as(:value))
end

rule(:copy) do
(
ignore_case_str('copy') >> spaces >> table_name.as(:table) >> spaces >> column_definitions >>
spaces >> ignore_case_str('from ') >> ignore_case_str('stdin') >> delimiter >> newline >>
(str('\.').absent? >> column_values >> newline).as(:values).repeat(1) >> str('\.')
).as(:copy)
end

def non(sequence)
(sequence.absent? >> any).repeat
end

def comma_separated(value)
value >> (str(",") >> space? >> value).repeat
end

def parenthetical(value)
str("(") >> space? >> value >> space? >> str(")")
end

def tab_separated(value)
value >> (tab >> value).repeat
end

def space_separated(value)
value >> (spaces >> value).repeat
end

def ignore_case_str(value)
str(value.downcase) | str(value.upcase)
end
end
end
20 changes: 20 additions & 0 deletions lib/maskdump/runner.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
module Maskdump
class Runner
def initialize
end

def run
output_filename = 'rfqcloud'
#dump = Maskdump::Dump.new('rfqcloud_development', output_filename)
#dump.run
dump_data = File.open(output_filename, 'r') do |f|
f.read
end
puts dump_data.class
parse = Maskdump::Parser.parse(dump_data)
puts "END: parse"
parse
end
end
end

2 changes: 2 additions & 0 deletions maskdump.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ Gem::Specification.new do |spec|
spec.add_dependency "thor"
spec.add_dependency "activerecord"
spec.add_dependency "mysql2"
spec.add_dependency "pg"
spec.add_dependency "parslet"

spec.add_development_dependency "bundler", "~> 1.16"
spec.add_development_dependency "rake", "~> 10.0"
Expand Down