git.fiddlerwoaroof.com
Raw Blame History
(defpackage :cl-nntp.archive-lispworks
  (:use :cl )
  (:export ))
(in-package :cl-nntp.archive-lispworks)

(defun archive-article (client message group target)
  (let* ((target (parse-namestring target))
         (group-path (merge-pathnames (make-pathname :directory (list :relative group))
                                      target))
         (article-path (merge-pathnames (make-pathname :name (princ-to-string message)
                                                       :type "eml")
                                        group-path)))
    (ensure-directories-exist article-path)
    (unless (probe-file article-path)
      (with-open-file (s article-path
                         :direction :output :if-exists :supersede :if-does-not-exist :create)
        (princ (cl-nntp:article client :article-number message)
               s)))))

(defun archiver (server group target)
  (let ((client  (cl-nntp::make-client)))
    (cl-nntp:connect server 119 client)
    (cl-nntp:group group client)
    (loop for message-num = (mp:process-wait-for-event)
          until (eql message-num :quit)
          do
          (archive-article client message-num group target))))

(defun start-workers (count &rest args)
  (coerce (loop repeat count
                for x from 0
                collect (apply 'mp:process-run-function
                               (format nil "archiver ~d" x)
                               ()
                               'archiver
                               args))
          'vector))


(defmacro comment (&body body)
  (declare (ignore body))
  nil)

(comment ;; example-usage
 (defparameter *workers* (start-workers 16 "news.gmane.io" "gmane.lisp.lispworks.general" "/tmp/gmane-archive/"))

 (loop for x = 0 then (mod (1+ x) (length *workers*))
       for msg in (cl-nntp:listgroup "gmane.lisp.lispworks.general" *client*)
       collect (mp:process-send (elt *workers* x) msg)))