(index-by-name :accessor index-by-name
:initform (make-hash-table :size 128 :test 'equal))
(meta-index :accessor meta-index :initform (make-array 5))
(index-by-name :accessor index-by-name
:initform (make-hash-table :size 128 :test 'equal))
(meta-index :accessor meta-index :initform (make-array 5))
(defgeneric get-table (xdump-parser table-name))
(defgeneric get-table-entry (xdump-parser table-name index))
(defgeneric get-table (xdump-parser table-name))
(defgeneric get-table-entry (xdump-parser table-name index))
(defgeneric header-parser (xdump-parser line))
(defgeneric parse-line (xdump-parser line))
(defgeneric reset-table-parser (xdump-parser))
(defgeneric header-parser (xdump-parser line))
(defgeneric parse-line (xdump-parser line))
(defgeneric reset-table-parser (xdump-parser))
(defmethod sym-by-value ((parser xdump-parser) table-name value)
(with-slots (table-classes-package) parser
(defmethod sym-by-value ((parser xdump-parser) table-name value)
(with-slots (table-classes-package) parser
-(defun meta-meta-finalizer (parser)
- (with-slots (entry-buffer meta-index meta-meta) parser
+(defun define-meta-table (entry-buffer)
+ (with-slots (meta-index meta-meta user-log) *current-parser*
+ (print `(define-meta-table ,entry-buffer) user-log)
(defun table-entry-defclass-form (name class-name package slot-list)
`(defclass ,(find-symbol class-name package) ()
,(mapcar #'(lambda (raw-slot-name)
(defun table-entry-defclass-form (name class-name package slot-list)
`(defclass ,(find-symbol class-name package) ()
,(mapcar #'(lambda (raw-slot-name)
- (with-slots (entry-buffer name meta-index meta-by-index index-by-name
- table-by-index)
- parser
+ (with-slots (meta-index meta-by-index index-by-name table-by-index user-log)
+ *current-parser*
+ (print `(define-table ,name ,entry-buffer) user-log)
(loop for entry across entry-buffer
do (let ((meta (make-instance 'table-column-meta)))
(loop for slot across meta-index
for field in entry
do (setf (slot-value meta slot) field))
(vector-push-extend meta meta-table)))
(loop for entry across entry-buffer
do (let ((meta (make-instance 'table-column-meta)))
(loop for slot across meta-index
for field in entry
do (setf (slot-value meta slot) field))
(vector-push-extend meta meta-table)))
;; create xdump-table instance and entry class
(let* ((class-name (string-upcase (format nil "~a-table-entry" name)))
;; create xdump-table instance and entry class
(let* ((class-name (string-upcase (format nil "~a-table-entry" name)))
(slot-list (loop for entry across entry-buffer
collect (car entry))))
(setf (aref table-by-index table-index) table-instance)
(slot-list (loop for entry across entry-buffer
collect (car entry))))
(setf (aref table-by-index table-index) table-instance)
(defmethod array-p ((parser xdump-parser) column)
(let ((column-len (meta-len column))
(column-type (sym-by-value parser "meta-type" (meta-type column))))
(defmethod array-p ((parser xdump-parser) column)
(let ((column-len (meta-len column))
(column-type (sym-by-value parser "meta-type" (meta-type column))))
-(defun table-finalizer (parser)
- (with-slots (entry-buffer name timestamp index-by-name meta-by-index
- table-by-index table-classes-package) parser
+(defun load-table (name timestamp entry-buffer)
+ (with-slots (index-by-name meta-by-index table-by-index table-classes-package
+ user-log)
+ *current-parser*
+ (print `(load-table ,name ,timestamp ,entry-buffer) user-log)
(if (string= name "table") ; special magic: prefill index-by-name
(loop for entry across entry-buffer do
(setf (gethash (second entry) index-by-name) (first entry))))
(if (string= name "table") ; special magic: prefill index-by-name
(loop for entry across entry-buffer do
(setf (gethash (second entry) index-by-name) (first entry))))
(let* ((table-index (gethash name index-by-name))
(meta-table (aref meta-by-index table-index))
(table (aref table-by-index table-index))
(let* ((table-index (gethash name index-by-name))
(meta-table (aref meta-by-index table-index))
(table (aref table-by-index table-index))
(array-support-p (not (or (string= name "table")
(string= name "meta-type")))))
(loop for entry across entry-buffer do
(array-support-p (not (or (string= name "table")
(string= name "meta-type")))))
(loop for entry across entry-buffer do
(vector-push-extend entry-instance (table-entries table)))))
(setf (table-last-update table) timestamp))))
(vector-push-extend entry-instance (table-entries table)))))
(setf (table-last-update table) timestamp))))
(defmethod finish-table ((parser xdump-parser) number-of-records)
(if (not (equal number-of-records (length (entry-buffer parser))))
(error "Table row count mismatch"))
(defmethod finish-table ((parser xdump-parser) number-of-records)
(if (not (equal number-of-records (length (entry-buffer parser))))
(error "Table row count mismatch"))