Class: Arxutils_Sqlite3::Migrate

Inherits:
Object
  • Object
show all
Defined in:
lib/arxutils_sqlite3/migrate.rb

Overview

migrateに必要なファイルをテンプレートから作成し、migarteを実行する

Constant Summary collapse

FILENAME_COUNTER_STEP =

migrate用スクリプトファイル名の先頭の番号の間隔

10

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, dbconfig_dest_path, dbconfig_src_fname, db_scheme_ary, acrecord_config, migrate_dir) ⇒ Migrate

migrate用のスクリプトの生成、migrateの実行を行うmigratexの生成



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/arxutils_sqlite3/migrate.rb', line 24

def initialize(
  config,
  dbconfig_dest_path,
  dbconfig_src_fname,
  db_scheme_ary,
  acrecord_config,
  migrate_dir
)
  # アプリ構成情報
  @config = config
  # DB格納ディレクトリ名
  @db_dir = config.db_dir
  # DB構成ファイルの出力先ディレクトリ
  @dest_config_dir = config.config_dir
  # 生成するDB構成情報ファイルパス
  @dbconfig_dest_path = dbconfig_dest_path
  # 参照用DB構成情報ファイル名
  @dbconfig_src_fname = dbconfig_src_fname

  # テンプレートファイル格納ディレクトリ名
  @src_path = config.template_acrecord_dir
  # 構成ファイル格納ディレクトリ
  @src_config_path = config.template_config_dir
  #      @src_config_path = Arxutils_Sqlite3::TEMPLATE_CONFIG_DIR
  # データベーススキーマ定義配列
  @db_scheme_ary = db_scheme_ary
  # リレーション指定
  @acrecord_config = acrecord_config
  @migrate_dir = migrate_dir

  FileUtils.mkdir_p(@db_dir) if @db_dir
  FileUtils.mkdir_p(@migrate_dir) if @migrate_dir
  FileUtils.mkdir_p(@dest_config_dir)
end

Instance Attribute Details

#migrate_dirObject (readonly)

Returns the value of attribute migrate_dir.



16
17
18
# File 'lib/arxutils_sqlite3/migrate.rb', line 16

def migrate_dir
  @migrate_dir
end

Instance Method Details

#convert(data, src_dir, src_fname) ⇒ Object

テンプレートファイルからスクリプトの内容に変換



148
149
150
151
152
# File 'lib/arxutils_sqlite3/migrate.rb', line 148

def convert(data, src_dir, src_fname)
  arx = Arx.new(data, File.join(src_dir, src_fname))
  # 指定テンプレートファイルからスクリプトの内容に作成
  arx.create
end

#convert_count_class_acrecord(data, src_fname) ⇒ Object

Countクラス用のacrecordのスクリプトの内容に変換



143
144
145
# File 'lib/arxutils_sqlite3/migrate.rb', line 143

def convert_count_class_acrecord(data, src_fname)
  convert(data, @src_path, src_fname)
end

#delete_dbObject

DBファイルの削除



88
89
90
91
92
# File 'lib/arxutils_sqlite3/migrate.rb', line 88

def delete_db
  Dir.glob(File.join(@db_dir, "*")).each do |x|
    FileUtils.rm(x) if File.file?(x)
  end
end

#delete_migrateObject

マイグレート用スクリプトの削除



79
80
81
82
83
84
85
# File 'lib/arxutils_sqlite3/migrate.rb', line 79

def delete_migrate
  return unless @migrate_dir

  Dir.glob(File.join(@migrate_dir, "*")).each do |x|
    FileUtils.rm(x) if File.file?(x)
  end
end

#delete_migrate_and_config_and_dbObject

マイグレート用スクリプト、DB構成情報ファイル、DBファイルの削除



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/arxutils_sqlite3/migrate.rb', line 60

def delete_migrate_and_config_and_db
  #    def delete_migrate_and_config
  delete_migrate
  Dir.glob(File.join(@dest_config_dir, "*")).each do |x|
    basename = File.basename(x)
    ret = !@config.exclude_file?(basename)
    ret_file = File.file?(x)
    FileUtils.rm(x) if ret_file && ret
  end
  delete_db
end

#delete_migrate_and_dbObject

マイグレート用スクリプト、DBファイルの削除



73
74
75
76
# File 'lib/arxutils_sqlite3/migrate.rb', line 73

def delete_migrate_and_db
  delete_migrate
  delete_db
end

#make_acrecord(data, count_classname_downcase) ⇒ Object

英子文字で表現したクラス名が、countを表していなければ、acrecordを 英子文字で表現したクラス名が、countを表していれが、空のハッシュを返す スキーマでbase, noitem以外のフィールドが指定されていれば、そのフィールドに対するacrecordの設定の内容を返す



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/arxutils_sqlite3/migrate.rb', line 167

def make_acrecord(data, count_classname_downcase)
  if data[:classname_downcase] == count_classname_downcase
    {}
  else
    # 指定フィールドのフィールド名に対応したテンプレートファイルを用いて、acrecord設定を作成
    data[:flist].each_with_object({ content: [], need_count_class: nil }) do |field_name, s|
      case field_name
      when "base", "noitem"
        name_base = "acrecord"
        # data[:acrecord]がnilに設定されていたら改めて空の配列を設定
        data[:acrecord] = [] unless data[:acrecord]
      else
        data[:count_classname_downcase] = count_classname_downcase
        name_base = "acrecord_#{field_name}"
        s[:need_count_class_plural] ||= data[:plural]
      end
      # テンプレートファイルからスクリプトの内容を作成
      content = convert(data, @src_path, "#{name_base}.tmpl")
      s[:content] << content
    end
  end
end

#make_content_arrayObject

acrecordを表すクラス定義のファイルの内容を生成



134
135
136
137
138
139
140
# File 'lib/arxutils_sqlite3/migrate.rb', line 134

def make_content_array
  # スキーマ設定配列から、acrecordのmigrate用のスクリプトの内容(ハッシュ形式)の配列を作成する
  acrecords = @db_scheme_ary.map do |x|
    make_acrecord(x, "count")
  end
  acrecords.select { |x| x.size.positive? }
end

#make_dbconfig(data) ⇒ Object

データベース構成ファイルをテンプレートから生成する



155
156
157
158
159
160
161
162
# File 'lib/arxutils_sqlite3/migrate.rb', line 155

def make_dbconfig(data)
  content = convert(data, @src_config_path, @dbconfig_src_fname)
  File.open(
    @dbconfig_dest_path, "w:utf-8"
  ) do |f|
    f.puts(content)
  end
end

#make_script_group(data) ⇒ Object

スキーマ設定からmigarte用スクリプトの内容を生成



191
192
193
194
195
196
197
198
# File 'lib/arxutils_sqlite3/migrate.rb', line 191

def make_script_group(data)
  # p data
  data[:flist].map do |kind|
    [kind,
     convert(data, @src_path, "#{kind}.tmpl"),
     data[:classname_downcase]]
  end
end

#outputObject

マイグレーション用スクリプトの生成、acrecordのクラス定義ファイルの生成



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/arxutils_sqlite3/migrate.rb', line 95

def output
  # migrationのスクリプトをファイル出力する
  output_all_script

  # acrecordを表すクラス定義のファイルの内容を生成
  content_array = make_content_array
  # p "content_array=#{content_array}"
  # 複数形のクラス名を集める
  count_class_plurals = content_array.reject do |x|
    x[:need_count_class_plural].nil?
  end
  need_count_class_plural = count_class_plurals.map { |x| x[:need_count_class_plural] }
  # acrecordのmigrateが必要であれば、それをテンプレートファイルから作成して、スクリプトの内容として追加する
  if content_array.find { |x| !x.nil? }
    # p "####### 1"
    data_count = {
      count_classname: "Count",
      need_count_class_plural: need_count_class_plural,
    }
    # p "data_count=#{data_count}"
    ary = content_array.collect { |x| x[:content] }.flatten
    count_content = convert_count_class_acrecord(data_count, "acrecord_count.tmpl")
    ary.unshift(count_content)
    content_array = ary
  end
  # acrecordのスクリプトを作成
  output_acrecord_script(content_array, @acrecord_config)
end

#output_acrecord_script(content_array, acrecord_config) ⇒ Object

acrecordのスクリプトをファイル出力する



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/arxutils_sqlite3/migrate.rb', line 215

def output_acrecord_script(content_array, acrecord_config)
  dir = acrecord_config[:dir]
  fname = acrecord_config[:filename]
  fpath = File.join(dir, fname)
  ret = :SUCCESS
  begin
    File.open(fpath, "w") do |file|
      acrecord_config[:module].map { |mod| file.puts("module #{mod}") }
      content_array.map do |x|
        file.puts x
        file.puts ""
      end
      acrecord_config[:module].map { |_mod| file.puts("end") }
    end
  rescue StandardError
    ret = :StandardError
  end

  ret
end

#output_all_scriptObject

migrationのスクリプトをファイル出力する



125
126
127
128
129
130
131
# File 'lib/arxutils_sqlite3/migrate.rb', line 125

def output_all_script
  # スキーマ設定配列から、migrate用のスクリプトを作成する
  @db_scheme_ary.map { |x| make_script_group(x) }.flatten(1).each_with_index do |data, index|
    idy = (index + 1) * FILENAME_COUNTER_STEP
    output_script(idy, *data)
  end
end

#output_script(idy, kind, content, classname_downcase) ⇒ Object

migrationのスクリプトをファイル出力する



201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/arxutils_sqlite3/migrate.rb', line 201

def output_script(idy, kind, content, classname_downcase)
  additional = case kind
    when "base", "noitem"
      ""
    else
      kind
    end
  fname = File.join(@migrate_dir, format("%03d_create_%s%s.rb", idy, additional, classname_downcase))
  File.open(fname, "w", **{ encoding: Encoding::UTF_8 }) do |f|
    f.puts(content)
  end
end