From 25b2858452df8935fa8d6b80264236c7bcfe5c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Wed, 24 Oct 2018 16:55:19 +0200 Subject: Adding cache. --- parse.scm | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file 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 "#")) + (format port "#" + (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) -- cgit v1.2.3