lib/rails/crud/tools/crud_data.rb in rails-crud-tools-0.4.1 vs lib/rails/crud/tools/crud_data.rb in rails-crud-tools-0.4.2
- old
+ new
@@ -1,18 +1,20 @@
+require "zip"
require_relative "crud_logger"
require_relative "constants"
module Rails
module Crud
module Tools
# このクラスは、CRUDファイルからデータを読み込むためのクラスです。
class CrudData
include Singleton
- attr_accessor :crud_rows, :crud_cols, :workbook, :last_loaded_time
+ attr_accessor :process_id, :crud_rows, :crud_cols, :workbook, :last_loaded_time
def initialize
+ @process_id = nil
@crud_rows = {}
@crud_cols = {}
@last_loaded_time = nil
end
@@ -59,12 +61,33 @@
def reload_if_needed
config = CrudConfig.instance
return unless config.enabled
return unless @last_loaded_time.nil? || File.mtime(config.crud_file_path) > @last_loaded_time
+
+ last_modified_by = get_last_modified_by(config.crud_file_path)
+ CrudLogger.logger.debug "last modified by: #{last_modified_by}. process_id: #{process_id}"
+ return if process_id == last_modified_by
+
CrudLogger.logger.info "Reloading CRUD data due to file modification. last_loaded_time = #{@last_loaded_time}"
load_crud_data
+ end
+ # xlsxファイルの最終更新者を取得する
+ def get_last_modified_by(file_path)
+ last_modified_by = nil
+
+ Zip::File.open(file_path) do |zipfile|
+ doc_props = zipfile.find_entry("docProps/core.xml")
+ if doc_props
+ content = doc_props.get_input_stream.read
+ last_modified_by = content[/\<cp:lastModifiedBy\>(.*?)\<\/cp:lastModifiedBy\>/, 1]
+ else
+ CrudLogger.logger.warn "docProps/core.xml が見つかりませんでした。"
+ end
+ end
+
+ last_modified_by
end
# CRUDシートを取得する
def get_crud_sheet
sheet_name = CrudConfig.instance.sheet_name
\ No newline at end of file