r1713: *** empty log message ***
[clsql.git] / interfaces / oracle / alien-resources.lisp
1 ;;; -*- Mode: Lisp -*-
2 ;;; $Id: alien-resources.lisp,v 1.1 2002/04/01 05:27:55 kevin Exp $
3
4 ;;; MaiSQL --- Common Lisp Interface Layer to SQL Databases
5 ;;; This is copyrighted software.  See documentation for terms.
6 ;;; 
7 ;;; oracle-sql.lisp --- SQL-Interface implementation for Oracle
8 ;;;
9 ;;; derived from postgresql.lisp
10
11 (in-package :MAISQL-ORACLE)
12
13 (declaim (optimize (speed 3)
14                    (debug 1)))
15
16 (defparameter *alien-resource-hash* (make-hash-table :test #'equal))
17
18 (defun %get-resource (type sizeof)
19   (let ((resources (gethash type *alien-resource-hash*)))
20     (car (member-if
21           #'(lambda (res)
22               (and (= (alien-resource-sizeof res) sizeof)
23                    (not (alien-resource-in-use res))))
24           resources))))
25
26 (defun %insert-alien-resource (type res)
27   (let ((resource (gethash type *alien-resource-hash*)))
28     (setf (gethash type *alien-resource-hash*)
29           (cons res (gethash type *alien-resource-hash*)))))
30
31 (defmacro acquire-alien-resource (type &optional size)
32   `(let ((res (%get-resource ',type ,size)))
33      (unless res
34        (setf res (make-alien-resource
35                   :type ',type :sizeof ,size
36                   :buffer (make-alien ,type ,size)))
37        (%insert-alien-resource ',type res))
38      (claim-alien-resource res)))
39                
40 (defstruct (alien-resource)
41   (type (error "Missing TYPE.")
42         :read-only t)
43   (sizeof (error "Missing SIZEOF.")
44           :read-only t)
45   (buffer (error "Missing BUFFER.")
46           :read-only t)
47   (in-use nil :type boolean))
48
49 (defun free-alien-resource (ares)
50   (setf (alien-resource-in-use ares) nil)
51   ares)
52
53 (defun claim-alien-resource (ares)
54   (setf (alien-resource-in-use ares) t)
55   ares)
56
57
58