From 3907dcc699c93db2e47e7a87405cc46def339ebf Mon Sep 17 00:00:00 2001 From: Craig Oates Date: Mon, 10 Jan 2022 05:17:17 +0000 Subject: [PATCH] fix rails-to-caveman.storage function calls (Ch 13). I was not using the full name for the 'storage' package and was getting errors -- most notably when trying to rebuild the database after applying the new features from Chapter 13. --- src/model.lisp | 4 +-- src/storage.lisp | 15 ++++++----- src/web.lisp | 24 +++++++++--------- ...gicHJvZmlsZS5wbmciIE5JTCAiaW1hZ2UvcG5nIik= | Bin 0 -> 14297 bytes 4 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 storage/1/account/IygicHJvZmlsZS5wbmciIE5JTCAiaW1hZ2UvcG5nIik= diff --git a/src/model.lisp b/src/model.lisp index 2d2482e..d8c4655 100644 --- a/src/model.lisp +++ b/src/model.lisp @@ -572,9 +572,9 @@ reference for future projects. This is a learning project after all. (file-length s) :element-type '(unsigned-byte 8)))) (read-sequence vector s) - (storage::write + (rails-to-caveman.storage::write (make-instance 'flex::vector-input-stream :vector vector) 1 "account" - (storage::make-file :name "profile.png" :content-type "image/png")) + (rails-to-caveman.storage::make-file :name "profile.png" :content-type "image/png")) ;; PROBLEM IS IN HERE.... )))))) diff --git a/src/storage.lisp b/src/storage.lisp index 987ad4b..95a5101 100644 --- a/src/storage.lisp +++ b/src/storage.lisp @@ -28,18 +28,19 @@ rails-to-caveman.config::*application-root*)) (defun write (stream id subdirectory file) - ;; (let ((path (ensure-directories-exist - ;; (make-storage-pathname id subdirectory file)))) - (let ((path "/home/craig/Desktop/test.png")) + (let ((path (ensure-directories-exist + (make-storage-pathname id subdirectory file)))) + ;; (let ((path "/home/craig/Desktop/test.png")) (with-open-file (s path :direction :output :if-does-not-exist :create :element-type '(unsigned-byte 8) :if-exists nil) - (write-sequence (slot-value stream 'vector) s :start 0)))) - ;; (if s - ;; (write-sequence (slot-value stream 'vector) s) - ;; (warn "File already exists ~S~&Ignored." path)))) + ;; (write-sequence (slot-value stream 'vector) s :start 0)))) + (format t "[INFO] The Stream is: " s) + (if s + (write-sequence (slot-value stream 'vector) s) + (warn "File already exists ~S~&Ignored." path))))) (defun read (id subdirectory file) (with-open-file (s (make-storage-pathname id subdirectory file) diff --git a/src/web.lisp b/src/web.lisp index 41156ab..ead7c72 100644 --- a/src/web.lisp +++ b/src/web.lisp @@ -692,7 +692,7 @@ nil "/users/~D"(mito:object-id user)))))))) (rails-to-caveman.model::filename-of user)))) ((_ nil) ; when specify new one, always remove old one. (rails-to-caveman.model::purge user "account" image-file) - (storage::write (car image) + (rails-to-caveman.storage::write (car image) (mito:object-id user) "account" (make-image-file image))) ((nil _)) ; do not remove, no new one, so do nothing. @@ -707,12 +707,12 @@ nil "/users/~D"(mito:object-id user)))))))) (defun purge (user subdirectory filename) (let (deletedp (id (mito:object-id user))) (dolist (pathname (uiop:directory-files - (storage::make-storage-pathname id subdirectory)) + (rails-to-caveman.storage::make-storage-pathname id subdirectory)) deletedp) - (let ((file (storage::read-from-base64-string (pathname-name pathname)))) - (when (equal filename (storage::file-name file)) + (let ((file (rails-to-caveman.storage::read-from-base64-string (pathname-name pathname)))) + (when (equal filename (rails-to-caveman.storage::file-name file)) (setf deletedp t) - (storage::remove id subdirectory file)))))) + (rails-to-caveman.storage::remove id subdirectory file)))))) (defroute("/account" :method :put)() ) (defroute("/account" :method :delete)() ) @@ -764,7 +764,7 @@ nil "/users/~D"(mito:object-id user)))))))) :token ,(token) :news ,(articles 5) :blogs ,(entries :limit 5))))) - (progn (storage::write (car image) + (progn (rails-to-caveman.storage::write (car image) (mito:object-id user) (format nil "entry~A"entry-id) (make-image-file image)) @@ -832,7 +832,7 @@ nil "/users/~D"(mito:object-id user)))))))) (progn (unless (equal old (rails-to-caveman.model::filename-of entry-image)) (rails-to-caveman.model::purge user subdirectory old) - (storage::write (car image) + (rails-to-caveman.storage::write (car image) (mito:object-id user) subdirectory (make-image-file image))) (mito:save-dao entry-image) @@ -1184,17 +1184,17 @@ nil "/users/~D"(mito:object-id user)))))))) filename size content-type) - (let* ((original-file (storage::make-file :name filename + (let* ((original-file (rails-to-caveman.storage::make-file :name filename :content-type content-type)) (to-load original-file)) - (when size (let ((converted-file (storage::make-file :name filename + (when size (let ((converted-file (rails-to-caveman.storage::make-file :name filename :size size :content-type content-type))) - (unless (storage::probe-file id subdirectory converted-file) - (storage::convert id subdirectory original-file converted-file)) + (unless (rails-to-caveman.storage::probe-file id subdirectory converted-file) + (rails-to-caveman.storage::convert id subdirectory original-file converted-file)) (setf to-load converted-file))) (multiple-value-bind (content length) - (storage::read id subdirectory to-load) + (rails-to-caveman.storage::read id subdirectory to-load) `(,status-code:+ok+ (:content-type ,content-type :content-length ,length) ,content)))) diff --git a/storage/1/account/IygicHJvZmlsZS5wbmciIE5JTCAiaW1hZ2UvcG5nIik= b/storage/1/account/IygicHJvZmlsZS5wbmciIE5JTCAiaW1hZ2UvcG5nIik= new file mode 100644 index 0000000000000000000000000000000000000000..d41c9c9afcf446ec19fcd1a5e9595b453345e931 GIT binary patch literal 14297 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 literal 0 HcmV?d00001