file.rb 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class Store
  3. class File < ApplicationModel
  4. include ApplicationLib
  5. after_destroy :destroy_provider
  6. # add new file
  7. def self.add(data)
  8. sha = Digest::SHA256.hexdigest( data )
  9. file = Store::File.where( sha: sha ).first
  10. if file == nil
  11. # load backend based on config
  12. adapter_name = Setting.get('storage_provider') || 'DB'
  13. if !adapter_name
  14. raise 'Missing storage_provider setting option'
  15. end
  16. adapter = self.load_adapter( "Store::Provider::#{ adapter_name }" )
  17. adapter.add( data, sha )
  18. file = Store::File.create(
  19. provider: adapter_name,
  20. sha: sha,
  21. )
  22. end
  23. file
  24. end
  25. # read content
  26. def content
  27. adapter = self.class.load_adapter("Store::Provider::#{ self.provider }")
  28. if self.sha
  29. c = adapter.get( self.sha )
  30. else
  31. # fallback until migration is done
  32. c = Store::Provider::DB.where( md5: self.md5 ).first.data
  33. end
  34. c
  35. end
  36. # check data and sha, in case fix it
  37. def self.verify(fix_it = nil)
  38. success = true
  39. Store::File.all.each {|item|
  40. content = item.content
  41. sha = Digest::SHA256.hexdigest( content )
  42. logger.info "CHECK: Store::File.find(#{item.id}) "
  43. next if sha == item.sha
  44. success = false
  45. logger.error "DIFF: sha diff of Store::File.find(#{item.id}) "
  46. if fix_it
  47. item.update_attribute( :sha, sha )
  48. end
  49. }
  50. success
  51. end
  52. # move file from one to other provider
  53. # e. g. Store::File.move('File', 'DB')
  54. # e. g. Store::File.move('DB', 'File')
  55. def self.move(source, target)
  56. adapter_source = load_adapter("Store::Provider::#{ source }")
  57. adapter_target = load_adapter("Store::Provider::#{ target }")
  58. Store::File.all.each {|item|
  59. next if item.provider == target
  60. content = item.content
  61. # add to new provider
  62. adapter_target.add( content, item.sha )
  63. # update meta data
  64. item.update_attribute( :provider, target )
  65. # remove from old provider
  66. adapter_source.delete( item.sha )
  67. logger.info "Moved file #{item.sha} from #{source} to #{target}"
  68. }
  69. true
  70. end
  71. private
  72. def destroy_provider
  73. adapter = self.class.load_adapter("Store::Provider::#{ self.provider }")
  74. adapter.delete( self.sha )
  75. end
  76. end
  77. end