пятница, 28 августа 2009 г.

Лисперу cron не нужен!

Для возможности отображения перевода PCL на lisper.ru необходимо регулярно скачивать и распаковывать свежий snapshot. Обычный способ - поместить соответствующее задание в cron. Однако, если вы пишете на Common Lisp, то можете легко реализовать pure-лисп решение, и, при этом, получить чуть больший уровень гибкости.

Для решения этой задачи потребуются следующие пакеты (благо, они уже установленные на lisper.ru)
Код тривиален:
;;;; Некоторые настройки
(defparameter *pcl-snapshot-url* #u"http://pcl.catap.ru/snapshot.zip")
(defparameter *pcl-snapshot-dir* #P"/var/rulisp/pcl/")
(defparameter *pcl-load-snapshot-p* t)

;;;;; Функция для загрузки и разархивирования
(defun load-pcl-snapshot ()
(when *pcl-load-snapshot-p*
(let ((snapshot-path (ensure-directories-exist (merge-pathnames (car (last (puri:uri-parsed-path *pcl-snapshot-url*)))
*pcl-snapshot-dir*)))
(snapshot (drakma:http-request *pcl-snapshot-url*
:force-binary t)))
(when snapshot
(with-open-file (out
snapshot-path
:direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-sequence snapshot out))
(zip:unzip snapshot-path
*pcl-snapshot-dir*
:if-exists :supersede)
(setf *pcl-dir*
(merge-pathnames "var/www/pcl.catap.ru/htdocs/data/pages/pcl/"
*pcl-snapshot-dir*))
t))))

;;;; Выполняем (load-pcl-snapshot) по расписанию, скажем, один раз в час
(if *pcl-load-snapshot-p*
(clon:schedule-function 'load-pcl-snapshot
(clon:make-scheduler (clon:make-typed-cron-schedule :hour '*)
:allow-now-p t)
:thread t))

Комментариев нет:

Отправить комментарий