Class: Upload
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Upload
- Includes:
- Checksummable, EachBatch
- Defined in:
- app/models/upload.rb
Constant Summary collapse
- CHECKSUM_THRESHOLD =
Upper limit for foreground checksum processing
100.megabytes
Constants inherited from ApplicationRecord
Constants included from HasCheckConstraints
HasCheckConstraints::NOT_NULL_CHECK_PATTERN
Constants included from ResetOnColumnErrors
ResetOnColumnErrors::MAX_RESET_PERIOD
Class Method Summary collapse
-
.begin_fast_destroy ⇒ Object
FastDestroyAll concerns.
-
.finalize_fast_destroy(items_to_remove) ⇒ Object
FastDestroyAll concerns.
- .inner_join_local_uploads_projects ⇒ Object
Instance Method Summary collapse
- #absolute_path ⇒ Object
-
#build_uploader(mounted_as = nil) ⇒ GitlabUploader
Initialize the associated Uploader class with current model.
- #calculate_checksum! ⇒ Object
-
#exist? ⇒ Boolean
This checks for existence of the upload on storage.
- #filename ⇒ Object
- #local? ⇒ Boolean
-
#needs_checksum? ⇒ Boolean
Returns whether generating checksum is needed.
- #relative_path ⇒ Object
-
#retrieve_uploader(mounted_as = nil) ⇒ GitlabUploader
Initialize the associated Uploader class with current model and retrieve existing file from the store to a local cache.
- #uploader_context ⇒ Object
Methods inherited from ApplicationRecord
===, cached_column_list, #create_or_load_association, declarative_enum, default_select_columns, id_in, id_not_in, iid_in, nullable_column?, pluck_primary_key, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, #to_ability_name, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order
Methods included from ResetOnColumnErrors
#reset_on_union_error, #reset_on_unknown_attribute_error
Methods included from Gitlab::SensitiveSerializableHash
Class Method Details
.begin_fast_destroy ⇒ Object
FastDestroyAll concerns
52 53 54 55 56 57 |
# File 'app/models/upload.rb', line 52 def begin_fast_destroy { Uploads::Local => Uploads::Local.new.keys(with_files_stored_locally), Uploads::Fog => Uploads::Fog.new.keys(with_files_stored_remotely) } end |
.finalize_fast_destroy(items_to_remove) ⇒ Object
FastDestroyAll concerns
61 62 63 64 65 |
# File 'app/models/upload.rb', line 61 def finalize_fast_destroy(items_to_remove) items_to_remove.each do |store_class, keys| store_class.new.delete_keys_async(keys) end end |
.inner_join_local_uploads_projects ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'app/models/upload.rb', line 35 def inner_join_local_uploads_projects upload_table = Upload.arel_table project_table = Project.arel_table join_statement = upload_table.project(upload_table[Arel.star]) .join(project_table) .on( upload_table[:model_type].eq('Project') .and(upload_table[:model_id].eq(project_table[:id])) .and(upload_table[:store].eq(ObjectStorage::Store::LOCAL)) ) joins(join_statement.join_sources) end |
Instance Method Details
#absolute_path ⇒ Object
68 69 70 71 72 73 |
# File 'app/models/upload.rb', line 68 def absolute_path raise ObjectStorage::RemoteStoreError, _("Remote object has no absolute path.") unless local? return path unless relative_path? uploader_class.absolute_path(self) end |
#build_uploader(mounted_as = nil) ⇒ GitlabUploader
Initialize the associated Uploader class with current model
90 91 92 93 94 |
# File 'app/models/upload.rb', line 90 def build_uploader(mounted_as = nil) uploader_class.new(model, mounted_as || mount_point).tap do |uploader| uploader.upload = self end end |
#calculate_checksum! ⇒ Object
79 80 81 82 83 84 |
# File 'app/models/upload.rb', line 79 def calculate_checksum! self.checksum = nil return unless needs_checksum? self.checksum = self.class.sha256_hexdigest(absolute_path) end |
#exist? ⇒ Boolean
This checks for existence of the upload on storage
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'app/models/upload.rb', line 110 def exist? exist = if local? File.exist?(absolute_path) else retrieve_uploader.exists? end # Help sysadmins find missing upload files if persisted? && !exist exception = RuntimeError.new("Uploaded file does not exist") Gitlab::ErrorTracking.track_exception(exception, self.attributes) Gitlab::Metrics.counter(:upload_file_does_not_exist_total, _('The number of times an upload record could not find its file')).increment end exist end |
#filename ⇒ Object
149 150 151 |
# File 'app/models/upload.rb', line 149 def filename File.basename(path) end |
#local? ⇒ Boolean
135 136 137 |
# File 'app/models/upload.rb', line 135 def local? store == ObjectStorage::Store::LOCAL end |
#needs_checksum? ⇒ Boolean
Returns whether generating checksum is needed
This takes into account whether file exists, if any checksum exists or if the storage has checksum generation code implemented
145 146 147 |
# File 'app/models/upload.rb', line 145 def needs_checksum? checksum.nil? && local? && exist? end |
#relative_path ⇒ Object
75 76 77 |
# File 'app/models/upload.rb', line 75 def relative_path uploader_class.relative_path(self) end |
#retrieve_uploader(mounted_as = nil) ⇒ GitlabUploader
Initialize the associated Uploader class with current model and retrieve existing file from the store to a local cache
101 102 103 104 105 |
# File 'app/models/upload.rb', line 101 def retrieve_uploader(mounted_as = nil) build_uploader(mounted_as).tap do |uploader| uploader.retrieve_from_store!(filename) end end |
#uploader_context ⇒ Object
127 128 129 130 131 132 133 |
# File 'app/models/upload.rb', line 127 def uploader_context { identifier: filename, secret: secret, uploaded_by_user_id: uploaded_by_user_id }.compact end |