summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@hornquist.se>2018-10-24 16:55:19 +0200
committerHugo Hörnquist <hugo@hornquist.se>2018-10-24 16:55:19 +0200
commit25b2858452df8935fa8d6b80264236c7bcfe5c50 (patch)
tree84fb57087096fdcfd187dd6eb9fb58f4fc308806
parentReplace dynammic record type creation with csv-type. (diff)
downloadlyslib-25b2858452df8935fa8d6b80264236c7bcfe5c50.tar.gz
lyslib-25b2858452df8935fa8d6b80264236c7bcfe5c50.tar.xz
Adding cache.
-rwxr-xr-xparse.scm76
1 files changed, 67 insertions, 9 deletions
diff --git a/parse.scm b/parse.scm
index c17da40..33f0e72 100755
--- a/parse.scm
+++ b/parse.scm
@@ -9,14 +9,20 @@
(use-modules (srfi srfi-1)
(srfi srfi-8)
(srfi srfi-9)
+ (srfi srfi-9 gnu)
(srfi srfi-26)
(ice-9 rdelim)
(ice-9 peg)
+ (ice-9 popen)
(patterns)
(macros arrow))
+(define (md5-file file)
+ (-> (string-append "md5sum " file)
+ open-input-pipe
+ read))
;; var is the field to test
;; symb is the expected value
@@ -66,13 +72,19 @@ otherwise return the full list"
tree))
(define-record-type csv
- (make-csv data)
+ (make-csv data
+ input-file input-hash
+ cache-hash)
csv?
- (data get-data))
+ (data get-data)
+ (input-file get-file)
+ (input-hash get-hash)
+ (cache-hash get-cache-hash))
-(use-modules (srfi srfi-9 gnu))
(define (csv-printer record port)
- (format port "#<csv data ...>"))
+ (format port "#<csv file: ~s, hash ~s, data ...>"
+ (get-file record)
+ (symbol->string (get-hash record))))
(set-record-type-printer! csv csv-printer)
(define (tree->vector tree)
@@ -82,12 +94,58 @@ otherwise return the full list"
;; TODO this assoc list ought to be a hash map
(map (cut map cons fields <>) data))))
-;;; This creates some form of weird object
-(define (load-csv filename)
- (-> (call-with-input-file filename read-csv)
+;;; Primitive load csv
+(define (load-csv port)
+ (-> port
+ read-csv
clean-peg-tree
- tree->vector
- make-csv))
+ tree->vector))
+
+(define (get-cache-file csv-file)
+ (let ((path-word (string-join (string-split csv-file #\/)
+ "%")))
+ (string-append (getenv "HOME")
+ "/.cache/csv-cache/" path-word)))
+
+(define (write-cache csv-file csv-hash cache-hash)
+ (with-output-to-file (string-append (get-cache-file csv-file) ".status")
+ (lambda ()
+ (write (list csv-hash cache-hash)))))
+
+;;; TODO rewrite this
+(define (load-csv* filename)
+ "Loads the csv file from disk, or from cache"
+ (let* ((cache-file (get-cache-file filename))
+ (cache-status-file (string-append cache-file ".status"))
+ (cache-status (if (file-exists? cache-status-file)
+ (call-with-input-file cache-status-file read)
+ (list '#{0}# '#{0}#)))
+ (csv-sum-expected (list-ref cache-status 0))
+ (cache-sum-expected (list-ref cache-status 1))
+ (csv-sum (md5-file filename))
+ (cache-sum (md5-file cache-file)))
+ (cond ((not (eqv? csv-sum csv-sum-expected))
+ ;; file changed, rebuild cache
+ (display "file changed, rebuild cache\n")
+ (let ((data (call-with-input-file filename load-csv)))
+ (write data (open-output-file cache-file))
+ (write-cache filename csv-sum cache-sum)
+ (make-csv data filename csv-sum cache-sum))
+ )
+ ((eqv? cache-sum cache-sum-expected)
+ ;; use cache
+ (display "use cache\n")
+ (make-csv (call-with-input-file cache-file read)
+ filename
+ csv-sum cache-sum)
+ )
+ (else ; rebuild cache
+ (display "rebuild cache\n")
+ (let ((data (call-with-input-file filename load-csv)))
+ (write data (open-output-file cache-file))
+ (write-cache filename csv-sum cache-sum)
+ (make-csv data filename csv-sum cache-sum))
+ ))))
(define-syntax-rule (ensure-csv csv)
(unless (csv? csv)