yppdb-bibimport.ss
(module yppdb-bibimport mzscheme
  ; I know it says 'bibimport', but it is really 'bib+plus some cleansing regexes' import.
  (require (lib "lex.ss" "parser-tools")
           (prefix : (lib "lex-sre.ss" "parser-tools"))
           (lib "yacc.ss" "parser-tools"))
  
  (define-tokens
   tokens
   (STRING))
  (define-empty-tokens
   empty-tokens
   (EOF
    BIBS BIBE))
  
  (define biblexer
    (lexer
     [(eof) (token-EOF)]
     [(:: (:+ (:or #\newline #\linefeed #\return)))
      (biblexer input-port)]
     ["BIBITEM" (token-BIBS)]
     ["BIBEND" (token-BIBE)]
     [(complement (:: any-string (:or "BIBITEM" "BIBEND" #\newline #\return) any-string))
      (token-STRING lexeme)]))
  
  (define (totally-lex lexer input-port)
    (let loop ([r (list)])
      (let ([c (lexer input-port)])
        (if (eq? c 'EOF)
            (append r (list 'EOF))
            (loop (append r (list c)))))))
  
  (define (parse token-stream)
    (let loop ([ts token-stream]
               [r (list)])
      (let ([c (car ts)])
        (if (not (eq? c 'BIBS))
            r
            (loop (cdr (cdr (cdr (cdr (cdr (cdr ts))))))
                  (append r
                          (list (map token-value
                                     (list (list-ref ts 1)
                                           (list-ref ts 2)
                                           (list-ref ts 3)
                                           (list-ref ts 4))))))))))
  
  (require (lib "class.ss")
           "yppdb-util.ss"
           (prefix sql-oo: (planet "sql-oo.ss" ("jaymccarthy" "sql-oo.plt" 1)))
           (prefix sql-oo:paper: "sql-oo-paper.ss"))
  (define db:moc% (sql-oo:apply-units sql-oo:sql-oo%
                                      sql-oo:paper:paper@))
  (define db:moc (new db:moc% (db-path "/Users/jay/Development/plt/yppdb.db")))
  
  (define (do-it file read?)
    (with-input-from-file
        file
      (lambda ()
        (let ([refs (parse (totally-lex biblexer (current-input-port)))])
          (for-each
           (lambda (title year authors url)
             (let ([o (send db:moc object url "object_paper")])
               (send* o (title! title) (year! year) (author! authors) (url! url) (categories! (write/string (list 'P2P))) (read! read?))))
           (map car refs)
           (map cadr refs)
           (map caddr refs)
           (map cadddr refs))))))
  
  (do-it "/Users/jay/Desktop/P2P-Ref.txt" #t)
  (do-it "/Users/jay/Desktop/P2P-RefU.txt" #f))