2014-05-03 12:34:36 +00:00
|
|
|
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
class Store
|
|
|
|
class File < ApplicationModel
|
|
|
|
include ApplicationLib
|
|
|
|
after_destroy :destroy_provider
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# add new file
|
|
|
|
def self.add(data)
|
|
|
|
sha = Digest::SHA256.hexdigest( data )
|
2014-05-03 14:52:37 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
file = Store::File.where( sha: sha ).first
|
|
|
|
if file == nil
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# load backend based on config
|
|
|
|
adapter_name = Setting.get('storage_provider') || 'DB'
|
|
|
|
if !adapter_name
|
|
|
|
raise 'Missing storage_provider setting option'
|
|
|
|
end
|
|
|
|
adapter = self.load_adapter( "Store::Provider::#{ adapter_name }" )
|
|
|
|
adapter.add( data, sha )
|
|
|
|
file = Store::File.create(
|
|
|
|
provider: adapter_name,
|
|
|
|
sha: sha,
|
|
|
|
)
|
2014-05-03 12:34:36 +00:00
|
|
|
end
|
2015-04-27 21:44:41 +00:00
|
|
|
file
|
2014-05-03 12:34:36 +00:00
|
|
|
end
|
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# read content
|
|
|
|
def content
|
|
|
|
adapter = self.class.load_adapter("Store::Provider::#{ self.provider }")
|
|
|
|
if self.sha
|
|
|
|
c = adapter.get( self.sha )
|
|
|
|
else
|
|
|
|
# fallback until migration is done
|
|
|
|
c = Store::Provider::DB.where( md5: self.md5 ).first.data
|
|
|
|
end
|
|
|
|
c
|
2014-05-03 19:02:38 +00:00
|
|
|
end
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# check data and sha, in case fix it
|
|
|
|
def self.verify(fix_it = nil)
|
|
|
|
success = true
|
|
|
|
Store::File.all.each {|item|
|
|
|
|
content = item.content
|
|
|
|
sha = Digest::SHA256.hexdigest( content )
|
2015-05-04 18:58:28 +00:00
|
|
|
logger.info "CHECK: Store::File.find(#{item.id}) "
|
2015-05-07 09:04:40 +00:00
|
|
|
|
|
|
|
next if sha == item.sha
|
|
|
|
|
|
|
|
success = false
|
|
|
|
logger.error "DIFF: sha diff of Store::File.find(#{item.id}) "
|
|
|
|
if fix_it
|
|
|
|
item.update_attribute( :sha, sha )
|
2014-05-03 12:34:36 +00:00
|
|
|
end
|
2015-04-27 21:44:41 +00:00
|
|
|
}
|
|
|
|
success
|
|
|
|
end
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# move file from one to other provider
|
|
|
|
# e. g. Store::File.move('File', 'DB')
|
|
|
|
# e. g. Store::File.move('DB', 'File')
|
|
|
|
def self.move(source, target)
|
|
|
|
adapter_source = load_adapter("Store::Provider::#{ source }")
|
|
|
|
adapter_target = load_adapter("Store::Provider::#{ target }")
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
Store::File.all.each {|item|
|
|
|
|
next if item.provider == target
|
|
|
|
content = item.content
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# add to new provider
|
|
|
|
adapter_target.add( content, item.sha )
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# update meta data
|
|
|
|
item.update_attribute( :provider, target )
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
# remove from old provider
|
|
|
|
adapter_source.delete( item.sha )
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-05-05 08:11:31 +00:00
|
|
|
logger.info "Moved file #{item.sha} from #{source} to #{target}"
|
2015-04-27 21:44:41 +00:00
|
|
|
}
|
|
|
|
true
|
|
|
|
end
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
private
|
2014-05-03 12:34:36 +00:00
|
|
|
|
2015-04-27 21:44:41 +00:00
|
|
|
def destroy_provider
|
|
|
|
adapter = self.class.load_adapter("Store::Provider::#{ self.provider }")
|
|
|
|
adapter.delete( self.sha )
|
|
|
|
end
|
2014-05-03 12:34:36 +00:00
|
|
|
end
|
2015-04-27 14:15:29 +00:00
|
|
|
end
|