Creating classes from tables
Knut Olav Bøhmer <[email protected]>
| Newsgroups | gmane.lisp.clsql.general |
|---|---|
| Message-ID | <[email protected]> |
Hi,
Why does not DEF-VIEW-CLASS seam to create the db-class?
(list-classes) gives nil.
I have the flowing code:
(defpackage #:db-test
(:nicknames #:dbt)
(:use #:cl #:clsql))
(in-package #:db-test)
(clsql:connect '("localhost" "mydb" "myuser" "mypasswd") :database-type :mysql)
(defun convert-mysql-type (type)
(case type
((DECIMAL NUMERIC) 'RATIO)
((INT TINYINT SMALLINT MEDIUMINT BIGINT YEAR) 'INTEGER)
((FLOAT REAL DOUBLE PRECISION ) 'DOUBLE-FLOAT)
((DATE DATETIME TIMESTAMP) 'INTEGER)
((TIME) 'INTEGER)
((CHAR VARCHAR TEXT TINYTEXT MEDIUMTEXT LONGTEXT) 'STRING)
((BIT BLOB MEDIUMBLOB LONGBLOB TINYBLOB GEOMETRY) 'SIMPLE-ARRAY)))
(defun make-class-desc (table-name)
(let ((desc (clsql:query (format nil "describe ~a;" table-name)))
(types (clsql:list-attribute-types table-name)))
(flet ((keyp (name) (equalp "PRI" (fourth (find name desc :key
'first :test 'equalp))))
(slot-name (name) (intern (string-upcase (substitute #\- #\_ name
:test 'char-equal)))))
`(clsql:def-view-class ,(slot-name table-name) ()
,(loop for (name type scale null) in types
collect `(,(slot-name name)
:column ,name
:type ,(convert-mysql-type (intern (symbol-name type)))
:db-kind ,(if (keyp name) :key :base)
:initarg ,(intern (symbol-name (slot-name name)) :keyword)))
(:base-table table-name)))))
;;
;;
;;
;;
;; (make-class-desc "wp_posts") Gives =>
;;
(DEF-VIEW-CLASS WP-POSTS NIL
((ID :COLUMN "ID" :TYPE INTEGER :DB-KIND :KEY :INITARG :ID)
(POST-AUTHOR :COLUMN "post_author" :TYPE INTEGER :DB-KIND
:BASE :INITARG :POST-AUTHOR)
(POST-DATE :COLUMN "post_date" :TYPE INTEGER :DB-KIND :BASE
:INITARG :POST-DATE)
(POST-DATE-GMT :COLUMN "post_date_gmt" :TYPE INTEGER :DB-KIND
:BASE :INITARG :POST-DATE-GMT)
(POST-CONTENT :COLUMN "post_content" :TYPE STRING :DB-KIND
:BASE :INITARG :POST-CONTENT)
(POST-TITLE :COLUMN "post_title" :TYPE STRING :DB-KIND :BASE
:INITARG :POST-TITLE)
(POST-EXCERPT :COLUMN "post_excerpt" :TYPE STRING :DB-KIND
:BASE :INITARG :POST-EXCERPT)
(POST-STATUS :COLUMN "post_status" :TYPE STRING :DB-KIND :BASE
:INITARG :POST-STATUS)
(COMMENT-STATUS :COLUMN "comment_status" :TYPE STRING :DB-KIND
:BASE :INITARG :COMMENT-STATUS)
(PING-STATUS :COLUMN "ping_status" :TYPE STRING :DB-KIND :BASE
:INITARG :PING-STATUS)
(POST-PASSWORD :COLUMN "post_password" :TYPE STRING :DB-KIND
:BASE :INITARG :POST-PASSWORD)
(POST-NAME :COLUMN "post_name" :TYPE STRING :DB-KIND :BASE
:INITARG :POST-NAME)
(TO-PING :COLUMN "to_ping" :TYPE STRING :DB-KIND :BASE
:INITARG :TO-PING)
(PINGED :COLUMN "pinged" :TYPE STRING :DB-KIND :BASE :INITARG
:PINGED)
(POST-MODIFIED :COLUMN "post_modified" :TYPE INTEGER :DB-KIND
:BASE :INITARG :POST-MODIFIED)
(POST-MODIFIED-GMT :COLUMN "post_modified_gmt" :TYPE INTEGER
:DB-KIND :BASE :INITARG :POST-MODIFIED-GMT)
(POST-CONTENT-FILTERED :COLUMN "post_content_filtered" :TYPE
STRING :DB-KIND :BASE :INITARG :POST-CONTENT-FILTERED)
(POST-PARENT :COLUMN "post_parent" :TYPE INTEGER :DB-KIND
:BASE :INITARG :POST-PARENT)
(GUID :COLUMN "guid" :TYPE STRING :DB-KIND :BASE :INITARG
:GUID)
(MENU-ORDER :COLUMN "menu_order" :TYPE INTEGER :DB-KIND :BASE
:INITARG :MENU-ORDER)
(POST-TYPE :COLUMN "post_type" :TYPE STRING :DB-KIND :BASE
:INITARG :POST-TYPE)
(POST-MIME-TYPE :COLUMN "post_mime_type" :TYPE STRING :DB-KIND
:BASE :INITARG :POST-MIME-TYPE)
(COMMENT-COUNT :COLUMN "comment_count" :TYPE INTEGER :DB-KIND
:BASE :INITARG :COMMENT-COUNT))
(:BASE-TABLE "wp_posts"))
;;
;; Gives => #<CLSQL-SYS::STANDARD-DB-CLASS WP-POSTS>
;;
(list-classes)
;;
;; gives => nil
;;
--
Knut Olav Bøhmer