1 /*
2  *  hdesc.h
3  *
4  *  $Id$
5  *
6  *  Descriptor object
7  *
8  *  The iODBC driver manager.
9  *
10  *  Copyright (C) 1995 Ke Jin <kejin@empress.com>
11  *  Copyright (C) 1996-2021 OpenLink Software <iodbc@openlinksw.com>
12  *  All Rights Reserved.
13  *
14  *  This software is released under the terms of either of the following
15  *  licenses:
16  *
17  *      - GNU Library General Public License (see LICENSE.LGPL)
18  *      - The BSD License (see LICENSE.BSD).
19  *
20  *  Note that the only valid version of the LGPL license as far as this
21  *  project is concerned is the original GNU Library General Public License
22  *  Version 2, dated June 1991.
23  *
24  *  While not mandated by the BSD license, any patches you make to the
25  *  iODBC source code may be contributed back into the iODBC project
26  *  at your discretion. Contributions will benefit the Open Source and
27  *  Data Access community as a whole. Submissions may be made at:
28  *
29  *      http://www.iodbc.org
30  *
31  *
32  *  GNU Library Generic Public License Version 2
33  *  ============================================
34  *  This library is free software; you can redistribute it and/or
35  *  modify it under the terms of the GNU Library General Public
36  *  License as published by the Free Software Foundation; only
37  *  Version 2 of the License dated June 1991.
38  *
39  *  This library is distributed in the hope that it will be useful,
40  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
41  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
42  *  Library General Public License for more details.
43  *
44  *  You should have received a copy of the GNU Library General Public
45  *  License along with this library; if not, write to the Free
46  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
47  *
48  *
49  *  The BSD License
50  *  ===============
51  *  Redistribution and use in source and binary forms, with or without
52  *  modification, are permitted provided that the following conditions
53  *  are met:
54  *
55  *  1. Redistributions of source code must retain the above copyright
56  *     notice, this list of conditions and the following disclaimer.
57  *  2. Redistributions in binary form must reproduce the above copyright
58  *     notice, this list of conditions and the following disclaimer in
59  *     the documentation and/or other materials provided with the
60  *     distribution.
61  *  3. Neither the name of OpenLink Software Inc. nor the names of its
62  *     contributors may be used to endorse or promote products derived
63  *     from this software without specific prior written permission.
64  *
65  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
66  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
67  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
68  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR
69  *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
70  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
71  *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
72  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
73  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
74  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
75  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76  */
77 
78 
79 #ifndef __DESC_H
80 #define __DESC_H
81 
82 #define APP_ROW_DESC	0
83 #define APP_PARAM_DESC	1
84 #define IMP_ROW_DESC	2
85 #define IMP_PARAM_DESC	3
86 
87 typedef struct DESC_s {
88 
89   int type;
90   HERR herr;   		/* list of descriptor errors */
91   SQLRETURN rc;
92 
93   struct DESC_s *next;
94 
95   SQLHDBC hdbc;	 	/* connection associated with the descriptor */
96   SQLHDESC dhdesc; 	/* the driver's desc handle */
97   HSTMT hstmt;   	/* if not null - the descriptor is implicit to that statement */
98 
99   SWORD desc_cip;        /* Call in Progress flag */
100 
101   SQLSMALLINT err_rec;
102 } DESC_t;
103 
104 #ifndef HDESC
105 #define HDESC SQLHDESC
106 #endif
107 
108 
109 #define IS_VALID_HDESC(x) \
110 	((x) != SQL_NULL_HDESC && \
111 	 ((DESC_t *)(x))->type == SQL_HANDLE_DESC && \
112 	 ((DESC_t *)(x))->hdbc != SQL_NULL_HDBC)
113 
114 
115 #define ENTER_DESC(hdesc, trace) \
116 	DESC (pdesc, hdesc); \
117 	SQLRETURN retcode = SQL_SUCCESS; \
118         ODBC_LOCK();\
119 	TRACE(trace); \
120     	if (!IS_VALID_HDESC (pdesc)) \
121 	  { \
122 	    retcode = SQL_INVALID_HANDLE; \
123 	    goto done; \
124 	  } \
125 	else if (pdesc->desc_cip) \
126           { \
127 	    PUSHSQLERR (pdesc->herr, en_S1010); \
128 	    retcode = SQL_ERROR; \
129 	    goto done; \
130 	  } \
131 	pdesc->desc_cip = 1; \
132 	CLEAR_ERRORS (pdesc); \
133 	ODBC_UNLOCK()
134 
135 
136 #define LEAVE_DESC(hdesc, trace) \
137 	ODBC_LOCK (); \
138 	pdesc->desc_cip = 0; \
139     done: \
140     	TRACE(trace); \
141 	ODBC_UNLOCK (); \
142 	return (retcode)
143 
144 #endif /* __DESC_H */
145