Title: File attachments · Issue #480 · datajoint/datajoint-python · GitHub
Open Graph Title: File attachments · Issue #480 · datajoint/datajoint-python
X Title: File attachments · Issue #480 · datajoint/datajoint-python
Description: Purpose Enable storage of entire files intact, without having to read and serialize them, similar to attachments. Enable the use of these attachments through GUI drag-and-drop features. The attached files are not browsable outside DataJo...
Open Graph Description: Purpose Enable storage of entire files intact, without having to read and serialize them, similar to attachments. Enable the use of these attachments through GUI drag-and-drop features. The attache...
X Description: Purpose Enable storage of entire files intact, without having to read and serialize them, similar to attachments. Enable the use of these attachments through GUI drag-and-drop features. The attache...
Opengraph URL: https://github.com/datajoint/datajoint-python/issues/480
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"File attachments","articleBody":"# Purpose\r\n\r\nEnable storage of entire files intact, without having to read and serialize them, similar to attachments. Enable the use of these attachments through GUI drag-and-drop features. The attached files are not browsable outside DataJoint. DataJoint must maintain data integrity.\r\n\r\n# Operation\r\n\r\nAttachments use a mechanism similar to external storage using file hashes as the filenames in a storage repository. The datatype should be either attach or attach-suffix where the suffix can be up to eight character long. The storage protocol and location (filesystem, S3, globus) is specified similar to external storage. \r\n\r\nThe table `~attach` is created and maintained similar to how `~external` is used for external storage. The only difference is that it also stores the original filename of the stored file.\r\n\r\nJust as with external, this mechanism ensures that inserting the same file multiple times within the same schema does not result in duplicated storage.\r\n\r\n## Insert \r\nInsert works by inserting the full path to the file to be inserted. The insert is asynchronous and commits the insert into the table into ~attach.\r\nIn its initial implementation, the entire file will be first read into memory for hashing and writing into storage. \r\n\r\n## Fetch\r\nFetch downloads the attached files. The download will be implemented asynchronously in the initial implementation. While the file is being downloaded, it is given the extension .download. When the download is complete the file is renamed into its target name.\r\n\r\nThe destination folder can be specified in the configuration. That can be overridden by the optional argument download_path of fetch. If neither is identified the download is performed into the current directory. \r\n\r\nIn all cases, the full path to the downloaded file is returned in the fetch output as attribute values.\r\n\r\nSimilar to external storage, fetch can be configured to use local caching. \r\n\r\nIf the same file retrieved multiple time as part of the same fetch, the file is only retrieved once and the same path in returned for each requested attribute value.\r\n\r\nIf the file already exists, the downloaded file is given an incrementing suffix.\r\n\r\n## Delete\r\n\r\nSimilar to external, delete only operates on the host tables and does not remove entries from ~attach or from the file repository.\r\n\r\nCleanup of ~attach and of storage folder work identically to the corresponding mechanisms of external storage.\r\n\r\nCleanup commands:\r\n```python\r\nschema.attachment.delete_garbage() # transaction-safe\r\nschema.attachment.cleanup_store() # not transaction-safe\r\n```\r\n","author":{"url":"https://github.com/dimitri-yatsenko","@type":"Person","name":"dimitri-yatsenko"},"datePublished":"2018-08-06T18:20:05.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/480/datajoint-python/issues/480"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:ed007cbd-3111-b479-c377-6bb58fe35389 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | EC96:244C0:205B616:2CA02B9:6A4ED4DC |
| html-safe-nonce | 996fad0422a8d57466d61ad241298eec8299913821a5e1333ebd4708546731fe |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFQzk2OjI0NEMwOjIwNUI2MTY6MkNBMDJCOTo2QTRFRDREQyIsInZpc2l0b3JfaWQiOiI4NTc4MDI5NDY0MTMwMDgyMDEyIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | a0976e46bc4a418f0a7f21138230812d6ebabf6814f693f15eb60635ab63375c |
| hovercard-subject-tag | issue:348031238 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/datajoint/datajoint-python/480/issue_layout |
| twitter:image | https://opengraph.githubassets.com/51bb39dbc5315ecb3bfe5c732c03d95cf90505ca7ae21186f9ad24cfbbc37447/datajoint/datajoint-python/issues/480 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/51bb39dbc5315ecb3bfe5c732c03d95cf90505ca7ae21186f9ad24cfbbc37447/datajoint/datajoint-python/issues/480 |
| og:image:alt | Purpose Enable storage of entire files intact, without having to read and serialize them, similar to attachments. Enable the use of these attachments through GUI drag-and-drop features. The attache... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | dimitri-yatsenko |
| hostname | github.com |
| expected-hostname | github.com |
| None | 41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c |
| turbo-cache-control | no-preview |
| go-import | github.com/datajoint/datajoint-python git https://github.com/datajoint/datajoint-python.git |
| octolytics-dimension-user_id | 2375501 |
| octolytics-dimension-user_login | datajoint |
| octolytics-dimension-repository_id | 5866704 |
| octolytics-dimension-repository_nwo | datajoint/datajoint-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 5866704 |
| octolytics-dimension-repository_network_root_nwo | datajoint/datajoint-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | c37fe3e3f5f306900bd5b6bee97463f66c938b2c |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width