1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
5 ;;;; Name: sqlite-usql.lisp
6 ;;;; Purpose: SQLite interface for USQL routines
7 ;;;; Programmers: Aurelio Bignoli
8 ;;;; Date Started: Aug 2003
10 ;;;; $Id: sqlite-usql.lisp,v 1.3 2004/03/09 20:58:38 aurelio Exp $
12 ;;;; This file, part of CLSQL, is Copyright (c) 2003 by Aurelio Bignoli
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 ;;;; *************************************************************************
19 (in-package :clsql-sqlite)
21 (defun %sequence-name-to-table-name (sequence-name)
22 (concatenate 'string "_usql_seq_" (sql-escape sequence-name)))
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)")
31 (database-execute-command
32 (format nil "INSERT INTO ~A VALUES (-1)" table-name)
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))
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)
48 (sqlite:sqlite-last-insert-rowid (sqlite-db database)))
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"
57 (declaim (inline sqlite-table-info))
58 (defun sqlite-table-info (table database)
59 (database-query (format nil "PRAGMA table_info('~A')" table)
62 (defmethod database-list-attributes (table (database sqlite-database))
63 (mapcar #'(lambda (table-info) (third table-info))
64 (sqlite-table-info table database)))
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)))