2009-10-26 14 views
6

मैं लगभग 50,000 रिकॉर्ड के छोटे डेटाबेस को बनाए रखने के विचार के साथ पीटर सिबेल की पुस्तक Practical Common Lisp के Simple Database अनुभाग को पढ़ रहा था। मैंने सोचा कि Emacs में ऐसा करना एक दिलचस्प, और उपयोगी, व्यायाम हो सकता है। Emacs Lisp कुछ notable differences को छोड़कर सीएल के साथ कुछ हद तक संगत है। प्रारूप उपरोक्त उदाहरण में उपयोग किया गया फ़ंक्शन एक बड़ा अंतर है।Emacs में डेटाबेस बनाना और बनाए रखना?

यहां वह कोड है जिसमें सीएल में डेटाबेस बनाने, सहेजने और लोड करने के लिए आवश्यक सब कुछ शामिल है। क्या इसे Emacs में अच्छी तरह से काम करने के लिए संशोधित किया जा सकता है? मैंने को और का चयन किया जहां फ़ंक्शंस, लेकिन मैं उन्हें शामिल करना चाहता हूं। शायद डेटाबेस बनाने और बनाए रखने का एक बेहतर Emacs तरीका है? निजी तौर पर, मैं इसे सीएल सीखने और मौजूदा समस्या को हल करने के लिए एक अभ्यास के रूप में उपयोग कर रहा हूं।

 
;; Simple Common Lisp database 
;; http://www.gigamonkeys.com/book/practical-a-simple-database.html 
;; 
(defvar *db* nil) 

(defun make-cd (title artist rating ripped) 
    (list :title title :artist artist :rating rating :ripped ripped)) 

(defun add-record (cd) (push cd *db*)) 

(defun dump-db() 
    (dolist (cd *db*) 
    (format t "~{~a:~10t~a~%~}~%" cd))) 

(defun save-db (filename) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :supersede) 
    (with-standard-io-syntax 
     (print *db* out)))) 

(defun load-db (filename) 
    (with-open-file (in filename) 
    (with-standard-io-syntax 
     (setf *db* (read in))))) 
; === 
; 
; Add some records 
; 
(add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 
(add-record (make-cd "Fly" "Dixie Chicks" 8 t)) 
(add-record (make-cd "Home" "Dixie Chicks" 9 t)) 

; (dump-db) 
; (save-db "cd.db") 
; (load-db "cd.db") 

उत्तर

2

जब मैंने Emacs के लिए एक ईबुक लाइब्रेरी लिखने की कोशिश की, तो मैंने रिकॉर्ड को एक सूची में संग्रहीत किया, इसे समय-समय पर डिस्क पर सहेज लिया। जब सूची की लंबाई लगभग पांच हजार रिकॉर्ड से अधिक हो गई, तो प्रदर्शन का सामना करना पड़ा।

(defun bread-library-load-db() 
"Loads the list of books from disk file to the variable bread-library-db" 
     (if (file-exists-p bread-library-file) 
      (with-temp-buffer 
     (insert-file-contents bread-library-file) 
     (setq bread-library-db (read (current-buffer)))) 
     (setq bread-library-db '()))) 

(defun bread-library-add-book (file) 
    "Attempts to get metadata from file, then prompts for 
confirmation (or modification) of these metadata, then adds the 
book to the database and saves it. Intended use: from dired." 
    (if (assoc file bread-library-db) 
     (error "File is already in the database") 
    (progn 
     (let ((metadata (bread-get-metadata file))) 
    (let ((filename (nth 0 metadata)) 
      (author (read-from-minibuffer 
       "Author: " 
       (nth 1 metadata))) 
      (title (read-from-minibuffer 
       "Title: " 
       (nth 2 metadata))) 
      (genre (read-from-minibuffer "Genre: " (nth 3 metadata))) 
      (tags (read-from-minibuffer "Tags (separated and surrounded by colons): " ":")) 
      (desc (nth 4 metadata))) 
     (setq bread-library-db (cons 
        (list filename author title tags "TOREAD" genre nil desc) 
        bread-library-db)))) 
     (bread-library-save-db bread-library-db)))) 

(defun bread-library-save-db (db) 
    "Save the library database to a file." 
    (message "Saving Bread library database...") 
    (with-temp-buffer 
     (insert "; 1.path 2.author 3.title 4.tags 5.state 6.genre 7.priority 8.description") 
     (print db (current-buffer)) 
     (write-file bread-library-file)) 
    (message "Saving Bread library database...done")) 
+0

आप एक नमूना डाटाबेस फ़ाइल को शामिल किया जा सका

यहाँ कोड से कुछ कार्यों कर रहे हैं? आपके आदेश इंटरैक्टिव नहीं हैं। आप उन्हें कैसे बुलाते हैं? –

+0

मैंने (साथ-temp-buffer ...) अनुभाग निकाला और इसका उपयोग किया। –

2

यहाँ मेरी समाधान है:

 

(defvar *db* nil) 

(setq *db*()) 

(defun make-cd (title artist rating ripped) 
    (list :title title :artist artist :rating rating :ripped ripped)) 

(defun add-record (cd) (push cd *db*)) 

(defun init() 
    (progn 
    (add-record (make-cd "Roses" "Kathy Mattea" 7 t)) 
    (add-record (make-cd "Fly" "Dixie Chicks" 8 t)) 
    (add-record (make-cd "Home" "Dixie Chicks" 9 t)) 
    )) 

(defun save-db (filename) 
    (with-temp-buffer 
    (print *db* (current-buffer)) 
    (write-file filename)) 
    (message "Saving database...done") 
) 

(defun load-db (filename) 
    (with-temp-buffer 
    (insert-file-contents filename) 
     (setq *db* (read (current-buffer))))) 

(defun dump-db() 
    (dolist (cd *db*) 
    (print cd))) 


;; Test in M-x lisp-interaction-mode 
;;(init) 
;;(save-db "cd.db") 
;*db* 
;(add-record (make-cd "Born To Run" "Bruce Springsteen" 10 t)) 
;(add-record (make-cd "The River" "Bruce Springsteen" 10 t)) 
;(add-record (make-cd "Nebraska" "Bruce Springsteen" 10 t)) 
;(add-record (make-cd "Human Touch" "Bruce Springsteen" 10 nil)) 
;;(save-db "cd.db") 
;(setq *db*()) 
;;(load-db "cd.db") 
;*db* 
 
संबंधित मुद्दे