Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/badges/code_issues.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion .github/badges/tests.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_documents, options)
function [success, message] = uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_documents, options)
% uploadFilesForDatasetDocuments - Upload a set of files belonging to a set of dataset documents
arguments
cloudDatasetId (1,1) string
Expand All @@ -7,13 +7,44 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
options.Verbose (1,1) logical = true
options.FileUploadStrategy (1,1) string ...
{mustBeMember(options.FileUploadStrategy, ["serial", "batch"])} = "batch"
options.updateMissing (1,1) logical = true
end

success = true;
message = '';

file_manifest = ...
ndi.database.internal.list_binary_files(...
ndiDataset, dataset_documents, options.Verbose);
[file_manifest(:).is_uploaded] = deal(false);

if options.updateMissing
[b, answer] = ndi.cloud.api.datasets.getDataset(cloudDatasetId);
if b && isfield(answer, 'files')
remote_files = containers.Map();
for i=1:numel(answer.files)
remote_files(answer.files(i).uid) = 1;
end

files_to_upload = struct('uid',{},'bytes',{},'file_path',{},'is_uploaded',{});
for i=1:numel(file_manifest)
if ~isKey(remote_files, file_manifest(i).uid)
files_to_upload(end+1) = file_manifest(i);

Check notice

Code scanning / Code Analyzer

Variable appears to change size on every loop iteration. Consider preallocating for speed. Note

Variable appears to change size on every loop iteration. Consider preallocating for speed.
end
end
file_manifest = files_to_upload;
else
success = false;
message = 'Could not retrieve remote dataset file list.';
return;
end
end

if isempty(file_manifest)
message = 'All files are already on the remote.';
return;
end

totalSizeKb = sum([file_manifest.bytes]) / 1e3;

switch options.FileUploadStrategy
Expand All @@ -23,13 +54,30 @@ function uploadFilesForDatasetDocuments(cloudDatasetId, ndiDataset, dataset_docu
app.addBar('Label','Uploading document-associated binary files','tag',uuid,'Auto',true);
for i=1:numel(file_manifest)
if file_manifest(i).is_uploaded==false
[success,uploadURL]=ndi.cloud.api.files.getFileUploadURL(cloudDatasetId,file_manifest(i).uid);
if ~success, warning('Failed to get upload URL'); continue; end
[~] = ndi.cloud.api.files.putFiles(uploadURL,file_manifest(i).file_path);
[url_success,uploadURL]=ndi.cloud.api.files.getFileUploadURL(cloudDatasetId,file_manifest(i).uid);
if ~url_success
warning('Failed to get upload URL');
if success
message = ['Failed to get upload URL for ' file_manifest(i).uid];
end
success = false;
continue;
end
[put_success] = ndi.cloud.api.files.putFiles(uploadURL,file_manifest(i).file_path);
if ~put_success
if success
message = ['Failed to upload file ' file_manifest(i).uid];
end
success = false;
end
end
app.updateBar(uuid,i/numel(file_manifest));
end
case "batch"
[~, ~] = ndi.cloud.upload.zipForUpload(ndiDataset, file_manifest, totalSizeKb, cloudDatasetId);
[batch_success, batch_message] = ndi.cloud.upload.zipForUpload(ndiDataset, file_manifest, totalSizeKb, cloudDatasetId);
if ~batch_success
success = false;
message = batch_message;
end
end
end