lib/paperbin/handler.rb in paperbin-0.1.0 vs lib/paperbin/handler.rb in paperbin-0.2.0
- old
+ new
@@ -1,21 +1,25 @@
class Paperbin::Handler < Struct.new(:id, :type)
-
require 'zlib'
require 'tempfile'
def formatted_id
"%012d" % id
end
- def split_id
+ def split
formatted_id.scan(/.{4}/)
end
- def current_path
+ def dir_split_id
+ split[0...-1]
end
+ def archive_split_id
+ split.last
+ end
+
def options
Paperbin::Config.default_options
end
def item
@@ -27,75 +31,117 @@
def directory_path
dirs = []
dirs << options[:path]
dirs << item.send(options[:base_scope])
dirs << type
- dirs += split_id
+ dirs += dir_split_id
File.join(dirs.map(&:to_s))
end
+ def old_directory_path
+ File.join(directory_path, archive_split_id)
+ end
+
+ def archive_path
+ File.join(directory_path, "#{archive_split_id}.zip")
+ end
+
+ def create_archive_file
+ unless File.exists?(archive_path)
+ Zippy.create archive_path do |z|
+ z["created_at.txt"] = Date.today.to_s
+ handle_old_files(z)
+ end
+ end
+ end
+
+ def handle_old_files(z)
+ if File.directory?(old_directory_path)
+ Dir.new(old_directory_path).each do |file|
+ if file =~ /\.gz/
+ name = file.split(".").first
+ z["#{name}.json"] = Zlib::GzipReader.open(File.join(old_directory_path, file)) {|gz| gz.read }
+ end
+ end
+ FileUtils.remove_dir(old_directory_path)
+ end
+ end
+
def versions
Version.where(item_type: type, item_id: id)
end
def save_versions
return true unless item
create_directory
+ create_archive_file
generate_files
Paperbin::CheckWorker.perform_async(id, type)
end
def create_directory
FileUtils.mkdir_p(directory_path) unless Dir.exists?(directory_path)
end
def md5_file(version)
- File.join(directory_path, "#{version.id}.md5")
+ "#{version.id}.md5"
end
- def gz_file(version, checked = false)
- File.join(directory_path, "#{version.id}.gz#{checked ? '' : '.unchecked'}")
+ def md5_file_path(version)
+ File.join(directory_path, "#{md5_file(version)}")
end
+ def json_file(version)
+ "#{version.id}.json"
+ end
+
+ def json_file_path(version, checked = false)
+ File.join(directory_path, "#{json_file(version)}#{checked ? '' : '.unchecked'}")
+ end
+
def files_exist?(*args)
Array(args).map{|file| File.exist?(file)}.all?
end
def md5_valid?(version)
- record_md5 = File.read(md5_file(version))
- data = Zlib::GzipReader.open(gz_file(version)) {|gz| gz.read }
+ record_md5 = File.read(md5_file_path(version))
+ data = File.open(json_file_path(version), "r") { |f| f.read }
check_md5 = Digest::MD5.hexdigest(data)
record_md5 == check_md5
end
def process_valid_records(version, last_item)
# remove records from db expcet the lastest one
version.delete unless version == last_item
# rename file extension
- File.rename(gz_file(version), gz_file(version, true))
- options[:callback].call(gz_file(version, true)) if options[:callback]
+ File.rename(json_file_path(version), json_file_path(version, true))
+ Zippy.open(archive_path) do |z|
+ z["#{json_file(version).to_s}"] = File.open(json_file_path(version, true)) { |f| f.read }
+ end
+ File.delete(md5_file_path(version))
+ File.delete(json_file_path(version, true))
+ options[:callback].call(json_file_path(version, true)) if options[:callback]
end
def generate_files
versions.each do |version|
- write_gz_file version
+ write_json_file version
write_md5_file version
end
end
- def write_gz_file(version)
- path = gz_file version
+ def write_json_file(version)
+ path = json_file_path version
unless files_exist?(path)
- Zlib::GzipWriter.open(path) { |gz| gz.write string_data(version) }
-
+ File.open(path, "w") { |f| f.write(string_data(version)) }
timestamp = version.created_at.to_time
File.utime timestamp, timestamp, path
end
end
def write_md5_file(version)
- File.open(md5_file(version), "w") do |file|
+ File.open(md5_file_path(version), "w") do |file|
md5 = Digest::MD5.hexdigest(string_data(version))
file.write md5
end
end
@@ -103,21 +149,21 @@
version.to_json
end
def check_versions
versions.each_with_index do |version, index|
- # check both file exist or not
- next unless files_exist?(md5_file(version), gz_file(version))
+ # check both file exist or not
+ next unless files_exist?(md5_file_path(version), json_file_path(version))
- if md5_valid?(version)
- process_valid_records(version, versions.last)
- else
- # remove both files
- [gz_file(version), md5_file(version)].each do |f|
- File.delete(f)
- end
- raise Errno::ENOENT
+ if md5_valid?(version)
+ process_valid_records(version, versions.last)
+ else
+ # remove both files
+ [json_file_path(version), md5_file_path(version)].each do |f|
+ File.delete(f)
end
+ raise Errno::ENOENT
+ end
end
rescue Errno::ENOENT
# lodge worker unless valid
Paperbin::WriteWorker.perform_async(id, type)
end