/usr/share/common-lisp/source/clsql/sql/sequences.lisp is in cl-sql 6.7.0-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
;;;; *************************************************************************
;;;;
;;;; Generic sequence implementation. Backends should use native sequences if
;;;; are available.
;;;;
;;;; This file is part of CLSQL.
;;;;
;;;; CLSQL users are granted the rights to distribute and use this software
;;;; as governed by the terms of the Lisp Lesser GNU Public License
;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
;;;; *************************************************************************
(in-package #:clsql-sys)
(defclass generic-database (database)
()
(:documentation "Encapsulate same behavior across backends."))
;;; Sequence functions
(defvar *old-sequence-names* nil
"Should CLSQL use its old sequence naming scheme _CLSQL_SEQ_{table} instead
of the current scheme {table}_CLSQL_SEQ")
(defun %sequence-name-to-table (sequence-name database)
(escaped
(combine-database-identifiers
(if *old-sequence-names*
(list '_CLSQL_SEQ sequence-name)
(list sequence-name 'CLSQL_SEQ))
database)))
(defmethod database-create-sequence (sequence-name database)
(let ((table-name (%sequence-name-to-table sequence-name database)))
(database-execute-command
(concatenate 'string "CREATE TABLE " table-name
" (last_value int NOT NULL PRIMARY KEY, increment_by int, min_value int, is_called char(1))")
database)
(database-execute-command
(concatenate 'string "INSERT INTO " table-name
" VALUES (1,1,1,'f')")
database)))
(defmethod database-drop-sequence (sequence-name database)
(database-execute-command
(concatenate 'string "DROP TABLE " (%sequence-name-to-table sequence-name database))
database))
(defun %seq-name-key ()
(if *old-sequence-names*
"_CLSQL_SEQ_"
"_CLSQL_SEQ"))
(defun %table-name-to-sequence-name (table-name)
;; if this was escaped it still should be,
;; if it wasnt it still shouldnt-be
(check-type table-name string)
(replace-all table-name (%seq-name-key) ""))
(defmethod database-list-sequences (database &key (owner nil))
(declare (ignore owner))
(mapcan #'(lambda (s)
(and (search (%seq-name-key) s :test #'string-equal)
(list (%table-name-to-sequence-name s))))
(database-list-tables-and-sequences database)))
(defmethod database-set-sequence-position (sequence-name position database)
(database-execute-command
(format nil "UPDATE ~A SET last_value=~A,is_called='t'"
(%sequence-name-to-table sequence-name database)
position)
database)
position)
(defmethod database-sequence-next (sequence-name database)
(without-interrupts
(let* ((table-name (%sequence-name-to-table sequence-name database))
(tuple
(car (database-query
(concatenate 'string "SELECT last_value,is_called FROM "
table-name)
database :auto nil))))
(cond
((char-equal (schar (second tuple) 0) #\f)
(database-execute-command
(format nil "UPDATE ~A SET is_called='t'" table-name)
database)
(car tuple))
(t
(let ((new-pos (1+ (car tuple))))
(database-execute-command
(format nil "UPDATE ~A SET last_value=~D" table-name new-pos)
database)
new-pos))))))
(defmethod database-sequence-last (sequence-name database)
(without-interrupts
(caar (database-query
(concatenate 'string "SELECT last_value FROM "
(%sequence-name-to-table sequence-name database))
database :auto nil))))
|