CPTYTXRNWA6PKPAHPPDCGEBJMTKVX4PDQBCQOUZH35BFWBNV3BMQC PNSLB3HLQELG4BZJYQB2T2R4ZFYQVPZHQZXAEOBCR4ZVMJ36LYNAC RXCY7LD6ZRIOIKZEYKLMCYPMQPXF4DOEEFBDLVR2B22BXLZJFFBQC A3TVGLVHSVLMEHLHB3TPBSD3QGNVGX3DIK6BEBDTTHWBNW4ALMRAC EY6TDTQF76OHSGWR572JUJP2DENLLKJ7TWM5VVIBOXWTPJ6B6MMAC 5PUTZ65VCZROT54SY5B4SZM47G5C4M5MFTS6NVBLEOXBNU4UXU2QC NVJWAMWTWQS2QYOD6FBARW7YBPMDWTOAPSPQORXWMWTUTBAAGEUAC #+fw.dump(eval-when (:compile-toplevel :load-toplevel :execute)(load "~/quicklisp/setup.lisp")(require :asdf))#+fw.dump(progn(asdf:load-asd(asdf:system-relative-pathname :net.didierverna.clon "termio/net.didierverna.clon.termio.asd"))(require :uiop))#+fw.dump(ql:quickload '(:net.didierverna.clon :ironclad :sqlite))(defpackage :fwoar.file-indexer(:use :cl)(:export ))(in-package :fwoar.file-indexer)(defvar *synopsis*(net.didierverna.clon:defsynopsis (:postfix "DB FILES..." :make-default nil)(flag :short-name "h" :long-name "help")))(defun main ()(let* ((context (net.didierverna.clon:make-context :synopsis *synopsis*))(net.didierverna.clon:*context* context)(hashes '(:sha256)))(cond ((net.didierverna.clon:getopt :context context:long-name "help")(net.didierverna.clon:help))(t(destructuring-bind (db-fn . files)(net.didierverna.clon:remainder :context context)(sqlite:with-open-database (db db-fn)(sqlite:execute-non-querydb"create table if not exists files (name text)")(sqlite:execute-non-querydb"create table if not exists shasums (sum text)")(sqlite:execute-non-querydb"create unique index if not exists files_unique_name on files(name)")(sqlite:execute-non-querydb"create unique index if not exists shasums_unique_sum on shasums(sum)")(sqlite:execute-non-querydb"create table if not existsfiles_shasums (file integer,shasum integer,foreign key (file) references files(rowid),foreign key (shasum) references shasums(rowid))")(sqlite:execute-non-querydb"create unique index if not exists shasums_files_unique_assuc on files_shasums(file,shasum)")(loop for file in filesdo(format t "Processing file ~s~%" file)(sqlite:with-transaction db(let* ((sum (ironclad:byte-array-to-hex-string(ironclad:digest-file :sha256 file)))(file-id(progn(sqlite:execute-singledb "insert into files (name) values (?) on conflict do nothing" file)(sqlite:execute-single db "select rowid from files where name = ?" file)))(sum-id(progn(sqlite:execute-singledb "insert into shasums (sum) values (?) on conflict do nothing" sum)(sqlite:execute-single db "select rowid from shasums where sum = ?" sum))))(sqlite:execute-single db"insert into files_shasums (file,shasum) values (?,?)on conflict do nothing"file-idsum-id)(format t "Done with file ~s, sum: ~s~%" file sum))))))(terpri)))))(defun dump ()(setf net.didierverna.clon:*context* nil*features* (remove :fw.dump *features*))(net.didierverna.clon:dump "file-indexer" main))
#+fw.dump(eval-when (:compile-toplevel :load-toplevel :execute)(load "~/quicklisp/setup.lisp")(require :asdf))#+fw.dump(progn(asdf:load-asd(asdf:system-relative-pathname :net.didierverna.clon "termio/net.didierverna.clon.termio.asd"))(require :uiop))#+fw.dump(ql:quickload '(:net.didierverna.clon :ironclad :sqlite))(defpackage :fwoar.file-indexer(:use :cl)(:export ))(in-package :fwoar.file-indexer)(defvar *synopsis*(net.didierverna.clon:defsynopsis (:postfix "DB FILES..." :make-default nil)(flag :short-name "h" :long-name "help")))(defun main ()(let* ((context (net.didierverna.clon:make-context :synopsis *synopsis*))(net.didierverna.clon:*context* context)(hashes '(:sha256)))(cond ((net.didierverna.clon:getopt :context context:long-name "help")(net.didierverna.clon:help))(t(destructuring-bind (db-fn . files)(net.didierverna.clon:remainder :context context)(sqlite:with-open-database (db db-fn)(sqlite:execute-non-querydb"create table if not exists files (name text)")(sqlite:execute-non-querydb"create table if not exists shasums (sum text)")(sqlite:execute-non-querydb"create unique index if not exists files_unique_name on files(name)")(sqlite:execute-non-querydb"create unique index if not exists shasums_unique_sum on shasums(sum)")(sqlite:execute-non-querydb"create table if not existsfiles_shasums (file integer,shasum integer,foreign key (file) references files(rowid),foreign key (shasum) references shasums(rowid))")(sqlite:execute-non-querydb"create unique index if not exists shasums_files_unique_assuc on files_shasums(file,shasum)")(loop for file in filesdo(format t "Processing file ~s~%" file)(sqlite:with-transaction db(let* ((sum (ironclad:byte-array-to-hex-string(ironclad:digest-file :sha256 file)))(file-id(progn(sqlite:execute-singledb "insert into files (name) values (?) on conflict do nothing" file)(sqlite:execute-single db "select rowid from files where name = ?" file)))(sum-id(progn(sqlite:execute-singledb "insert into shasums (sum) values (?) on conflict do nothing" sum)(sqlite:execute-single db "select rowid from shasums where sum = ?" sum))))(sqlite:execute-single db"insert into files_shasums (file,shasum) values (?,?)on conflict do nothing"file-idsum-id)(format t "Done with file ~s, sum: ~s~%" file sum))))))(terpri)))))(defun dump ()(setf net.didierverna.clon:*context* nil*features* (remove :fw.dump *features*))(net.didierverna.clon:dump "file-indexer" main))