file.rb 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. =begin
  7. add new file to store
  8. store_file_id = Store::File.add(binary_data)
  9. =end
  10. def self.add(data)
  11. sha = Digest::SHA256.hexdigest( data )
  12. file = Store::File.find_by( sha: sha )
  13. if file.nil?
  14. # load backend based on config
  15. adapter_name = Setting.get('storage_provider') || 'DB'
  16. if !adapter_name
  17. fail 'Missing storage_provider setting option'
  18. end
  19. adapter = load_adapter( "Store::Provider::#{adapter_name}" )
  20. adapter.add( data, sha )
  21. file = Store::File.create(
  22. provider: adapter_name,
  23. sha: sha,
  24. )
  25. end
  26. file
  27. end
  28. =begin
  29. read content of a file
  30. store = Store::File.find(123)
  31. store.content # returns binary
  32. =end
  33. def content
  34. adapter = self.class.load_adapter("Store::Provider::#{provider}")
  35. if sha
  36. c = adapter.get( sha )
  37. else
  38. # fallback until migration is done
  39. c = Store::Provider::DB.find_by( md5: md5 ).data
  40. end
  41. c
  42. end
  43. =begin
  44. file system check of store, check data and sha (in case fix it)
  45. Store::File.verify
  46. read each file which should be in backend and verify agsinst sha hash
  47. in case of fixing sha hash use:
  48. Store::File.verify(true)
  49. =end
  50. def self.verify(fix_it = nil)
  51. success = true
  52. Store::File.all.each {|item|
  53. content = item.content
  54. sha = Digest::SHA256.hexdigest( content )
  55. logger.info "CHECK: Store::File.find(#{item.id}) "
  56. next if sha == item.sha
  57. success = false
  58. logger.error "DIFF: sha diff of Store::File.find(#{item.id}) "
  59. if fix_it
  60. item.update_attribute( :sha, sha )
  61. end
  62. }
  63. success
  64. end
  65. =begin
  66. move file from one to other provider
  67. move files from file backend to db
  68. Store::File.move('File', 'DB')
  69. move files from db backend to fs
  70. Store::File.move('DB', 'File')
  71. =end
  72. def self.move(source, target)
  73. adapter_source = load_adapter("Store::Provider::#{source}")
  74. adapter_target = load_adapter("Store::Provider::#{target}")
  75. Store::File.all.each {|item|
  76. next if item.provider == target
  77. content = item.content
  78. # add to new provider
  79. adapter_target.add( content, item.sha )
  80. # update meta data
  81. item.update_attribute( :provider, target )
  82. # remove from old provider
  83. adapter_source.delete( item.sha )
  84. logger.info "Moved file #{item.sha} from #{source} to #{target}"
  85. }
  86. true
  87. end
  88. private
  89. def destroy_provider
  90. adapter = self.class.load_adapter("Store::Provider::#{provider}")
  91. adapter.delete( sha )
  92. end
  93. end
  94. end