4d66be7ca29d9782a49c49b0bf18a3a9d18eea2d
[clsql.git] / db-sqlite / sqlite-usql.lisp
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          sqlite-usql.lisp
6 ;;;; Purpose:       SQLite interface for USQL routines
7 ;;;; Programmers:   Aurelio Bignoli
8 ;;;; Date Started:  Aug 2003
9 ;;;;
10 ;;;; $Id: sqlite-usql.lisp,v 1.3 2004/03/09 20:58:38 aurelio Exp $
11 ;;;;
12 ;;;; This file, part of CLSQL, is Copyright (c) 2003 by Aurelio Bignoli
13 ;;;;
14 ;;;; CLSQL users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
16 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
17 ;;;; *************************************************************************
18
19 (in-package :clsql-sqlite)
20
21 (defun %sequence-name-to-table-name (sequence-name)
22   (concatenate 'string "_usql_seq_" (sql-escape sequence-name)))
23
24 (defmethod database-create-sequence (sequence-name
25                                      (database sqlite-database))
26   (let ((table-name (%sequence-name-to-table-name sequence-name)))
27     (database-execute-command
28      (concatenate 'string "CREATE TABLE " table-name
29                   " (id INTEGER PRIMARY KEY)")
30      database)
31     (database-execute-command 
32      (format nil "INSERT INTO ~A VALUES (-1)" table-name)
33      database)))
34
35 (defmethod database-drop-sequence (sequence-name
36                                    (database sqlite-database))
37   (database-execute-command
38    (concatenate 'string "DROP TABLE "
39                 (%sequence-name-to-table-name sequence-name)) 
40    database))
41
42 (defmethod database-sequence-next (sequence-name (database sqlite-database))
43   (let ((table-name (%sequence-name-to-table-name sequence-name)))
44     (database-execute-command
45      (format nil "UPDATE ~A SET id=(SELECT id FROM ~A)+1"
46              table-name table-name)
47      database))
48   (sqlite:sqlite-last-insert-rowid (sqlite-db database)))
49
50 (defmethod database-list-tables ((database sqlite-database) &key system-tables)
51   (declare (ignore system-tables))
52   ;; Query is copied from .table command of sqlite comamnd line utility.
53   (mapcar #'car (database-query
54                  "SELECT name FROM sqlite_master WHERE type='table' UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table' ORDER BY name"
55                  database '())))
56
57 (declaim (inline sqlite-table-info))
58 (defun sqlite-table-info (table database)
59   (database-query (format nil "PRAGMA table_info('~A')" table)
60                           database '()))
61
62 (defmethod database-list-attributes (table (database sqlite-database))
63   (mapcar #'(lambda (table-info) (third table-info))
64           (sqlite-table-info table database)))
65
66 (defmethod database-attribute-type (attribute table 
67                                     (database sqlite-database))
68   (loop for field-info in (sqlite-table-info table database)
69         when (string= attribute (second field-info))
70         return (third field-info)))