Guest User

Untitled

a guest
Jan 24th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #!/usr/local/bin/ruby
  2.  
  3. #
  4. # WWW SQL Designer を他の ER 図作成ツールと併用している場合に、
  5. # 変更された DB から再インポートする度にテーブルの座標を直すのが面倒で作成したスクリプト。
  6. # インポート後に実行すれば以前のバージョンで調整済みのダイアグラムの位置については同じになるので、
  7. # 後は追加で変更した部分の座標のみ手で調整してやれば OK。
  8. #
  9.  
  10. require 'rubygems'
  11. require 'mysql2'
  12. require 'rexml/document'
  13.  
  14. # db connection settings
  15. DB_HOST = '127.0.0.1'
  16. DB_USER = 'wwwsqldesigner'
  17. DB_PASSWORD = 'wwwsqldesigner'
  18. DB_DATABASE = 'wwwsqldesigner'
  19. DB_ENCODING = 'UTF8'
  20.  
  21. if ARGV.count < 2
  22. print "usage: ruby sync_sqldesigner_pos.rb before_keyword after_keyword"
  23. exit 1
  24. end
  25.  
  26. before_keyword = ARGV[0]
  27. after_keyword = ARGV[1]
  28.  
  29. # save file path
  30. before_filename = "/home/akishin/src/ruby/data/#{before_keyword}.xml"
  31. after_filename = "/home/akishin/src/ruby/data/#{after_keyword}.xml"
  32. merged_filename = "/home/akishin/src/ruby/data/#{before_keyword}_#{after_keyword}_merged.xml"
  33.  
  34. # load from db
  35. def load_data(client, keyword)
  36. results = client.query("SELECT * FROM wwwsqldesigner WHERE keyword = '#{keyword}'")
  37. data = ''
  38. results.each do |row|
  39. data = row[:data]
  40. end
  41. return data
  42. end
  43.  
  44. # save to db
  45. def save_data(client, keyword, data)
  46. escaped = client.escape(data)
  47. results = client.query("UPDATE wwwsqldesigner SET data = '#{escaped}' WHERE keyword = '#{keyword}'")
  48. end
  49.  
  50. # save to file
  51. def save_file(data, filename)
  52. begin
  53. f = open(filename, 'w+')
  54. f.puts data
  55. ensure
  56. f.close unless f.nil?
  57. end
  58. end
  59.  
  60. begin
  61. client = Mysql2::Client.new(:host => DB_HOST,
  62. :username => DB_USER,
  63. :password => DB_PASSWORD,
  64. :database => DB_DATABASE,
  65. :encoding => DB_ENCODING)
  66. client.query_options.merge!(:symbolize_keys => true)
  67.  
  68. before_xml = load_data(client, before_keyword)
  69. after_xml = load_data(client, after_keyword)
  70.  
  71. save_file(before_xml, before_filename)
  72. save_file(after_xml, after_filename)
  73.  
  74. xmldoc1 = REXML::Document.new(before_xml)
  75. xmldoc2 = REXML::Document.new(after_xml)
  76.  
  77. # sync table position
  78. xmldoc1.elements.each('sql/table') { |t1|
  79. xmldoc2.elements.each('sql/table') { |t2|
  80. if t1.attributes['name'] == t2.attributes['name']
  81. t2.attributes['x'] = t1.attributes['x']
  82. t2.attributes['y'] = t1.attributes['y']
  83. end
  84. }
  85. }
  86.  
  87. save_file(xmldoc2.to_s, merged_filename)
  88.  
  89. # update database
  90. save_data(client, after_keyword, xmldoc2.to_s)
  91.  
  92. print 'done.'
  93. ensure
  94. end
Add Comment
Please, Sign In to add comment