removed no longer used src/iodbc directory
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51755 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -144,19 +144,6 @@ src/regex/tests
|
|||||||
src/regex/regex.3
|
src/regex/regex.3
|
||||||
src/regex/regex.7
|
src/regex/regex.7
|
||||||
|
|
||||||
src/iodbc/AUTHORS
|
|
||||||
src/iodbc/COPYING
|
|
||||||
src/iodbc/autoconfig
|
|
||||||
src/iodbc/Changes.log
|
|
||||||
src/iodbc/IAFA-PACKAGE
|
|
||||||
src/iodbc/INSTALL
|
|
||||||
src/iodbc/NEWS
|
|
||||||
src/iodbc/README
|
|
||||||
src/iodbc/*.c
|
|
||||||
src/iodbc/*.h
|
|
||||||
src/iodbc/*.ci
|
|
||||||
src/iodbc/*.exp
|
|
||||||
|
|
||||||
include/wx/*.h
|
include/wx/*.h
|
||||||
include/wx/*.inl
|
include/wx/*.inl
|
||||||
include/wx/*.cpp
|
include/wx/*.cpp
|
||||||
|
@@ -96,19 +96,6 @@ src/png/scripts/makefile*
|
|||||||
src/png/scripts/*.com
|
src/png/scripts/*.com
|
||||||
src/png/scripts/*.def
|
src/png/scripts/*.def
|
||||||
|
|
||||||
src/iodbc/AUTHORS
|
|
||||||
src/iodbc/COPYING
|
|
||||||
src/iodbc/autoconfig
|
|
||||||
src/iodbc/Changes.log
|
|
||||||
src/iodbc/IAFA-PACKAGE
|
|
||||||
src/iodbc/INSTALL
|
|
||||||
src/iodbc/NEWS
|
|
||||||
src/iodbc/README
|
|
||||||
src/iodbc/*.c
|
|
||||||
src/iodbc/*.h
|
|
||||||
src/iodbc/*.ci
|
|
||||||
src/iodbc/*.exp
|
|
||||||
|
|
||||||
include/wx/wx_setup.vms
|
include/wx/wx_setup.vms
|
||||||
include/wx/common/*.h
|
include/wx/common/*.h
|
||||||
include/wx/generic/*.h
|
include/wx/generic/*.h
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
Written by Ke Jin <kejin@inprise.com>
|
|
||||||
|
|
||||||
Additions by OpenLink Software Inc. http://www.openlinksw.com/
|
|
||||||
Contact: Patrick van Kleef <pkleef@openlinksw.com>
|
|
@@ -1,482 +0,0 @@
|
|||||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
|
||||||
675 Mass Ave, Cambridge, MA 02139, USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
[This is the first released version of the library GPL. It is
|
|
||||||
numbered 2 because it goes with version 2 of the ordinary GPL.]
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
Licenses are intended to guarantee your freedom to share and change
|
|
||||||
free software--to make sure the software is free for all its users.
|
|
||||||
|
|
||||||
This license, the Library General Public License, applies to some
|
|
||||||
specially designated Free Software Foundation software, and to any
|
|
||||||
other libraries whose authors decide to use it. You can use it for
|
|
||||||
your libraries, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if
|
|
||||||
you distribute copies of the library, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of the library, whether gratis
|
|
||||||
or for a fee, you must give the recipients all the rights that we gave
|
|
||||||
you. You must make sure that they, too, receive or can get the source
|
|
||||||
code. If you link a program with the library, you must provide
|
|
||||||
complete object files to the recipients so that they can relink them
|
|
||||||
with the library, after making changes to the library and recompiling
|
|
||||||
it. And you must show them these terms so they know their rights.
|
|
||||||
|
|
||||||
Our method of protecting your rights has two steps: (1) copyright
|
|
||||||
the library, and (2) offer you this license which gives you legal
|
|
||||||
permission to copy, distribute and/or modify the library.
|
|
||||||
|
|
||||||
Also, for each distributor's protection, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
library. If the library is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original
|
|
||||||
version, so that any problems introduced by others will not reflect on
|
|
||||||
the original authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that companies distributing free
|
|
||||||
software will individually obtain patent licenses, thus in effect
|
|
||||||
transforming the program into proprietary software. To prevent this,
|
|
||||||
we have made it clear that any patent must be licensed for everyone's
|
|
||||||
free use or not licensed at all.
|
|
||||||
|
|
||||||
Most GNU software, including some libraries, is covered by the ordinary
|
|
||||||
GNU General Public License, which was designed for utility programs. This
|
|
||||||
license, the GNU Library General Public License, applies to certain
|
|
||||||
designated libraries. This license is quite different from the ordinary
|
|
||||||
one; be sure to read it in full, and don't assume that anything in it is
|
|
||||||
the same as in the ordinary license.
|
|
||||||
|
|
||||||
The reason we have a separate public license for some libraries is that
|
|
||||||
they blur the distinction we usually make between modifying or adding to a
|
|
||||||
program and simply using it. Linking a program with a library, without
|
|
||||||
changing the library, is in some sense simply using the library, and is
|
|
||||||
analogous to running a utility program or application program. However, in
|
|
||||||
a textual and legal sense, the linked executable is a combined work, a
|
|
||||||
derivative of the original library, and the ordinary General Public License
|
|
||||||
treats it as such.
|
|
||||||
|
|
||||||
Because of this blurred distinction, using the ordinary General
|
|
||||||
Public License for libraries did not effectively promote software
|
|
||||||
sharing, because most developers did not use the libraries. We
|
|
||||||
concluded that weaker conditions might promote sharing better.
|
|
||||||
|
|
||||||
However, unrestricted linking of non-free programs would deprive the
|
|
||||||
users of those programs of all benefit from the free status of the
|
|
||||||
libraries themselves. This Library General Public License is intended to
|
|
||||||
permit developers of non-free programs to use free libraries, while
|
|
||||||
preserving your freedom as a user of such programs to change the free
|
|
||||||
libraries that are incorporated in them. (We have not seen how to achieve
|
|
||||||
this as regards changes in header files, but we have achieved it as regards
|
|
||||||
changes in the actual functions of the Library.) The hope is that this
|
|
||||||
will lead to faster development of free libraries.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow. Pay close attention to the difference between a
|
|
||||||
"work based on the library" and a "work that uses the library". The
|
|
||||||
former contains code derived from the library, while the latter only
|
|
||||||
works together with the library.
|
|
||||||
|
|
||||||
Note that it is possible for a library to be covered by the ordinary
|
|
||||||
General Public License rather than by this special one.
|
|
||||||
|
|
||||||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License Agreement applies to any software library which
|
|
||||||
contains a notice placed by the copyright holder or other authorized
|
|
||||||
party saying it may be distributed under the terms of this Library
|
|
||||||
General Public License (also called "this License"). Each licensee is
|
|
||||||
addressed as "you".
|
|
||||||
|
|
||||||
A "library" means a collection of software functions and/or data
|
|
||||||
prepared so as to be conveniently linked with application programs
|
|
||||||
(which use some of those functions and data) to form executables.
|
|
||||||
|
|
||||||
The "Library", below, refers to any such software library or work
|
|
||||||
which has been distributed under these terms. A "work based on the
|
|
||||||
Library" means either the Library or any derivative work under
|
|
||||||
copyright law: that is to say, a work containing the Library or a
|
|
||||||
portion of it, either verbatim or with modifications and/or translated
|
|
||||||
straightforwardly into another language. (Hereinafter, translation is
|
|
||||||
included without limitation in the term "modification".)
|
|
||||||
|
|
||||||
"Source code" for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For a library, complete source code means
|
|
||||||
all the source code for all modules it contains, plus any associated
|
|
||||||
interface definition files, plus the scripts used to control compilation
|
|
||||||
and installation of the library.
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running a program using the Library is not restricted, and output from
|
|
||||||
such a program is covered only if its contents constitute a work based
|
|
||||||
on the Library (independent of the use of the Library in a tool for
|
|
||||||
writing it). Whether that is true depends on what the Library does
|
|
||||||
and what the program that uses the Library does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Library's
|
|
||||||
complete source code as you receive it, in any medium, provided that
|
|
||||||
you conspicuously and appropriately publish on each copy an
|
|
||||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
|
||||||
all the notices that refer to this License and to the absence of any
|
|
||||||
warranty; and distribute a copy of this License along with the
|
|
||||||
Library.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy,
|
|
||||||
and you may at your option offer warranty protection in exchange for a
|
|
||||||
fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Library or any portion
|
|
||||||
of it, thus forming a work based on the Library, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The modified work must itself be a software library.
|
|
||||||
|
|
||||||
b) You must cause the files modified to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
c) You must cause the whole of the work to be licensed at no
|
|
||||||
charge to all third parties under the terms of this License.
|
|
||||||
|
|
||||||
d) If a facility in the modified Library refers to a function or a
|
|
||||||
table of data to be supplied by an application program that uses
|
|
||||||
the facility, other than as an argument passed when the facility
|
|
||||||
is invoked, then you must make a good faith effort to ensure that,
|
|
||||||
in the event an application does not supply such function or
|
|
||||||
table, the facility still operates, and performs whatever part of
|
|
||||||
its purpose remains meaningful.
|
|
||||||
|
|
||||||
(For example, a function in a library to compute square roots has
|
|
||||||
a purpose that is entirely well-defined independent of the
|
|
||||||
application. Therefore, Subsection 2d requires that any
|
|
||||||
application-supplied function or table used by this function must
|
|
||||||
be optional: if the application does not supply it, the square
|
|
||||||
root function must still compute square roots.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Library,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Library, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote
|
|
||||||
it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Library.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Library
|
|
||||||
with the Library (or with a work based on the Library) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
|
||||||
License instead of this License to a given copy of the Library. To do
|
|
||||||
this, you must alter all the notices that refer to this License, so
|
|
||||||
that they refer to the ordinary GNU General Public License, version 2,
|
|
||||||
instead of to this License. (If a newer version than version 2 of the
|
|
||||||
ordinary GNU General Public License has appeared, then you can specify
|
|
||||||
that version instead if you wish.) Do not make any other change in
|
|
||||||
these notices.
|
|
||||||
|
|
||||||
Once this change is made in a given copy, it is irreversible for
|
|
||||||
that copy, so the ordinary GNU General Public License applies to all
|
|
||||||
subsequent copies and derivative works made from that copy.
|
|
||||||
|
|
||||||
This option is useful when you wish to copy part of the code of
|
|
||||||
the Library into a program that is not a library.
|
|
||||||
|
|
||||||
4. You may copy and distribute the Library (or a portion or
|
|
||||||
derivative of it, under Section 2) in object code or executable form
|
|
||||||
under the terms of Sections 1 and 2 above provided that you accompany
|
|
||||||
it with the complete corresponding machine-readable source code, which
|
|
||||||
must be distributed under the terms of Sections 1 and 2 above on a
|
|
||||||
medium customarily used for software interchange.
|
|
||||||
|
|
||||||
If distribution of object code is made by offering access to copy
|
|
||||||
from a designated place, then offering equivalent access to copy the
|
|
||||||
source code from the same place satisfies the requirement to
|
|
||||||
distribute the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
5. A program that contains no derivative of any portion of the
|
|
||||||
Library, but is designed to work with the Library by being compiled or
|
|
||||||
linked with it, is called a "work that uses the Library". Such a
|
|
||||||
work, in isolation, is not a derivative work of the Library, and
|
|
||||||
therefore falls outside the scope of this License.
|
|
||||||
|
|
||||||
However, linking a "work that uses the Library" with the Library
|
|
||||||
creates an executable that is a derivative of the Library (because it
|
|
||||||
contains portions of the Library), rather than a "work that uses the
|
|
||||||
library". The executable is therefore covered by this License.
|
|
||||||
Section 6 states terms for distribution of such executables.
|
|
||||||
|
|
||||||
When a "work that uses the Library" uses material from a header file
|
|
||||||
that is part of the Library, the object code for the work may be a
|
|
||||||
derivative work of the Library even though the source code is not.
|
|
||||||
Whether this is true is especially significant if the work can be
|
|
||||||
linked without the Library, or if the work is itself a library. The
|
|
||||||
threshold for this to be true is not precisely defined by law.
|
|
||||||
|
|
||||||
If such an object file uses only numerical parameters, data
|
|
||||||
structure layouts and accessors, and small macros and small inline
|
|
||||||
functions (ten lines or less in length), then the use of the object
|
|
||||||
file is unrestricted, regardless of whether it is legally a derivative
|
|
||||||
work. (Executables containing this object code plus portions of the
|
|
||||||
Library will still fall under Section 6.)
|
|
||||||
|
|
||||||
Otherwise, if the work is a derivative of the Library, you may
|
|
||||||
distribute the object code for the work under the terms of Section 6.
|
|
||||||
Any executables containing that work also fall under Section 6,
|
|
||||||
whether or not they are linked directly with the Library itself.
|
|
||||||
|
|
||||||
6. As an exception to the Sections above, you may also compile or
|
|
||||||
link a "work that uses the Library" with the Library to produce a
|
|
||||||
work containing portions of the Library, and distribute that work
|
|
||||||
under terms of your choice, provided that the terms permit
|
|
||||||
modification of the work for the customer's own use and reverse
|
|
||||||
engineering for debugging such modifications.
|
|
||||||
|
|
||||||
You must give prominent notice with each copy of the work that the
|
|
||||||
Library is used in it and that the Library and its use are covered by
|
|
||||||
this License. You must supply a copy of this License. If the work
|
|
||||||
during execution displays copyright notices, you must include the
|
|
||||||
copyright notice for the Library among them, as well as a reference
|
|
||||||
directing the user to the copy of this License. Also, you must do one
|
|
||||||
of these things:
|
|
||||||
|
|
||||||
a) Accompany the work with the complete corresponding
|
|
||||||
machine-readable source code for the Library including whatever
|
|
||||||
changes were used in the work (which must be distributed under
|
|
||||||
Sections 1 and 2 above); and, if the work is an executable linked
|
|
||||||
with the Library, with the complete machine-readable "work that
|
|
||||||
uses the Library", as object code and/or source code, so that the
|
|
||||||
user can modify the Library and then relink to produce a modified
|
|
||||||
executable containing the modified Library. (It is understood
|
|
||||||
that the user who changes the contents of definitions files in the
|
|
||||||
Library will not necessarily be able to recompile the application
|
|
||||||
to use the modified definitions.)
|
|
||||||
|
|
||||||
b) Accompany the work with a written offer, valid for at
|
|
||||||
least three years, to give the same user the materials
|
|
||||||
specified in Subsection 6a, above, for a charge no more
|
|
||||||
than the cost of performing this distribution.
|
|
||||||
|
|
||||||
c) If distribution of the work is made by offering access to copy
|
|
||||||
from a designated place, offer equivalent access to copy the above
|
|
||||||
specified materials from the same place.
|
|
||||||
|
|
||||||
d) Verify that the user has already received a copy of these
|
|
||||||
materials or that you have already sent this user a copy.
|
|
||||||
|
|
||||||
For an executable, the required form of the "work that uses the
|
|
||||||
Library" must include any data and utility programs needed for
|
|
||||||
reproducing the executable from it. However, as a special exception,
|
|
||||||
the source code distributed need not include anything that is normally
|
|
||||||
distributed (in either source or binary form) with the major
|
|
||||||
components (compiler, kernel, and so on) of the operating system on
|
|
||||||
which the executable runs, unless that component itself accompanies
|
|
||||||
the executable.
|
|
||||||
|
|
||||||
It may happen that this requirement contradicts the license
|
|
||||||
restrictions of other proprietary libraries that do not normally
|
|
||||||
accompany the operating system. Such a contradiction means you cannot
|
|
||||||
use both them and the Library together in an executable that you
|
|
||||||
distribute.
|
|
||||||
|
|
||||||
7. You may place library facilities that are a work based on the
|
|
||||||
Library side-by-side in a single library together with other library
|
|
||||||
facilities not covered by this License, and distribute such a combined
|
|
||||||
library, provided that the separate distribution of the work based on
|
|
||||||
the Library and of the other library facilities is otherwise
|
|
||||||
permitted, and provided that you do these two things:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work
|
|
||||||
based on the Library, uncombined with any other library
|
|
||||||
facilities. This must be distributed under the terms of the
|
|
||||||
Sections above.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library of the fact
|
|
||||||
that part of it is a work based on the Library, and explaining
|
|
||||||
where to find the accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
8. You may not copy, modify, sublicense, link with, or distribute
|
|
||||||
the Library except as expressly provided under this License. Any
|
|
||||||
attempt otherwise to copy, modify, sublicense, link with, or
|
|
||||||
distribute the Library is void, and will automatically terminate your
|
|
||||||
rights under this License. However, parties who have received copies,
|
|
||||||
or rights, from you under this License will not have their licenses
|
|
||||||
terminated so long as such parties remain in full compliance.
|
|
||||||
|
|
||||||
9. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Library or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Library (or any work based on the
|
|
||||||
Library), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Library or works based on it.
|
|
||||||
|
|
||||||
10. Each time you redistribute the Library (or any work based on the
|
|
||||||
Library), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute, link with or modify the Library
|
|
||||||
subject to these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
11. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Library at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Library by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Library.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under any
|
|
||||||
particular circumstance, the balance of the section is intended to apply,
|
|
||||||
and the section as a whole is intended to apply in other circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
12. If the distribution and/or use of the Library is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Library under this License may add
|
|
||||||
an explicit geographical distribution limitation excluding those countries,
|
|
||||||
so that distribution is permitted only in or among countries not thus
|
|
||||||
excluded. In such case, this License incorporates the limitation as if
|
|
||||||
written in the body of this License.
|
|
||||||
|
|
||||||
13. The Free Software Foundation may publish revised and/or new
|
|
||||||
versions of the Library General Public License from time to time.
|
|
||||||
Such new versions will be similar in spirit to the present version,
|
|
||||||
but may differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Library
|
|
||||||
specifies a version number of this License which applies to it and
|
|
||||||
"any later version", you have the option of following the terms and
|
|
||||||
conditions either of that version or of any later version published by
|
|
||||||
the Free Software Foundation. If the Library does not specify a
|
|
||||||
license version number, you may choose any version ever published by
|
|
||||||
the Free Software Foundation.
|
|
||||||
|
|
||||||
14. If you wish to incorporate parts of the Library into other free
|
|
||||||
programs whose distribution conditions are incompatible with these,
|
|
||||||
write to the author to ask for permission. For software which is
|
|
||||||
copyrighted by the Free Software Foundation, write to the Free
|
|
||||||
Software Foundation; we sometimes make exceptions for this. Our
|
|
||||||
decision will be guided by the two goals of preserving the free status
|
|
||||||
of all derivatives of our free software and of promoting the sharing
|
|
||||||
and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
|
||||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
|
||||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
|
||||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
|
||||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
|
||||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
|
||||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
|
||||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
|
||||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
|
||||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
|
||||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
|
||||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
|
||||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
|
||||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|
||||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
||||||
DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Libraries
|
|
||||||
|
|
||||||
If you develop a new library, and you want it to be of the greatest
|
|
||||||
possible use to the public, we recommend making it free software that
|
|
||||||
everyone can redistribute and change. You can do so by permitting
|
|
||||||
redistribution under these terms (or, alternatively, under the terms of the
|
|
||||||
ordinary General Public License).
|
|
||||||
|
|
||||||
To apply these terms, attach the following notices to the library. It is
|
|
||||||
safest to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least the
|
|
||||||
"copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the library's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with this library; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
|
||||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1990
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
That's all there is to it!
|
|
||||||
|
|
@@ -1,67 +0,0 @@
|
|||||||
January 18, 1999, V2.50:
|
|
||||||
* Added autoconf/automake/libtool support
|
|
||||||
* Licensing moved to LGPL
|
|
||||||
* Added OpenLink code enhancements and bug fixes
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
Original Changelog from Ke Jin
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
July 30, 1995, v2.00.beta:
|
|
||||||
0. the first release and beta version.
|
|
||||||
|
|
||||||
Sep. 11, 1995, v2.10:
|
|
||||||
1. Porting to AIX 3.x and 4.x, by writing dlopen(),
|
|
||||||
dlsym(), dlclose() interface.
|
|
||||||
2. Tested on SCO OpenServer 5.x
|
|
||||||
3. Awared of that, unlike s700/s800, exported function
|
|
||||||
symbols on HP9000 s300/s400 will be prepended with
|
|
||||||
a '_' prefix by compiler(and this '_' prefix is not
|
|
||||||
automatically handled by shl_findsym()). Now, it works
|
|
||||||
fine on s300/s400.
|
|
||||||
4. Support driver ODBC call tracing.
|
|
||||||
|
|
||||||
Oct. 12, 1995, v2.11:
|
|
||||||
5. Driver's SQLNumResultCols() will automatically be
|
|
||||||
invoked in driver manager's SQLExecute(),
|
|
||||||
SQLExecDirect() and SQLParamData() after successfully
|
|
||||||
(i.e. return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO )
|
|
||||||
calling of their correspondent driver functions. This
|
|
||||||
simplifies the state tracing/checking of the driver
|
|
||||||
manager a lot and allows store procedures to return
|
|
||||||
result set and also make iODBC driver manager work
|
|
||||||
properly with SELECT INTO statements which actually
|
|
||||||
don't return result sets.
|
|
||||||
6. Memory leaks are cleared.
|
|
||||||
7. Two bugs in dld.c for AIX are fixed
|
|
||||||
8. A bug of setting tracing option is fixed.
|
|
||||||
9. The driver will not be unloaded by SQLDisconnect()
|
|
||||||
but by SQLFreeConnect() or next SQLConnect()/
|
|
||||||
SQLDriverConnect()/SQLBrowsConnect() on a different
|
|
||||||
driver. This will save driver's loading time if it
|
|
||||||
has been used by a previous connection(even there
|
|
||||||
is no active connection on this driver).
|
|
||||||
10.Another three platforms are supported:
|
|
||||||
FreeBSD 2.x
|
|
||||||
Concurrent Max/OS SVR4 1.x
|
|
||||||
DG/UX 5.x
|
|
||||||
11.autoconfig and build -- shell scripts to help modifying
|
|
||||||
Config.mk and building iodbc driver manager
|
|
||||||
|
|
||||||
Nov. 12, 1995, v2.12
|
|
||||||
12.I realized that a driver manager doesn't aware of
|
|
||||||
difference between a C5 (i.e. hstmt) and a C6
|
|
||||||
(i.e. transaction) states.
|
|
||||||
13.The link flags "-lc" has been droped from Linux ELF
|
|
||||||
section of Config.mk to fix a segment fault problem.
|
|
||||||
Now, it works fine on Slackware 2.3 and Red Hat 2.0
|
|
||||||
(kernel version are 1.2.xx and 1.3.xx respectively).
|
|
||||||
14.On FreeBSD 2.x, dlsym() doesn't handle the '_' prefix
|
|
||||||
prepended to an exportting function symbol by compiler.
|
|
||||||
So, CLI_NAME_PREFIX needs to be defined as "_SQL" for
|
|
||||||
FreeBSD 2.x.
|
|
||||||
15.Some files are renamed
|
|
||||||
dld.c -> dlf.c
|
|
||||||
dld.h -> dlf.h
|
|
||||||
confg.h -> config.h
|
|
||||||
16. Fix a bug on setting tracing options.
|
|
||||||
|
|
@@ -1,40 +0,0 @@
|
|||||||
Title: iODBC Driver Manager
|
|
||||||
|
|
||||||
Version: 2.50
|
|
||||||
|
|
||||||
Description: iODBC (intrinsic Open Database Connectivity) driver manager
|
|
||||||
is compatible with ODBC 2.x specification and performs exactly
|
|
||||||
same jobs of ODBC 2.x driver manager(i.e. driver loading,
|
|
||||||
Parameters and function sequence checking, driver's function
|
|
||||||
Invoking, etc.). Any ODBC driver works with ODBC 2.0 driver
|
|
||||||
Manager will also work with iODBC driver manager and vice versa.
|
|
||||||
Applications (using ODBC function calls) linked with
|
|
||||||
iODBC driver manager will be able to simultaneously access
|
|
||||||
different type of data sources within one process through
|
|
||||||
suitable iODBC drivers.
|
|
||||||
|
|
||||||
Original Author: Jin, Ke
|
|
||||||
Source Code Enhancement Contributors: OpenLink Software
|
|
||||||
Maintainers: OpenLink Software
|
|
||||||
Web Site: http://www.openlinksw.com
|
|
||||||
|
|
||||||
Platforms: SunOS (Sparc) 4.1.x
|
|
||||||
HP/UX (s700/s800) 9.x, 10.x
|
|
||||||
HP/UX (s300/s400) 9.x
|
|
||||||
IBM AIX 3.x, 4.x
|
|
||||||
Solaris (Sparc) 2.x
|
|
||||||
Solaris (PCx86) 2.x
|
|
||||||
SGI Irix 5.x, 6.x
|
|
||||||
NCR SVR4 3.x
|
|
||||||
UnixWare SVR4.2 1.x, 2.x
|
|
||||||
DEC Unix (OSF/1) 3.x, 4.x
|
|
||||||
FreeBSD 2.x
|
|
||||||
BSDI BSD/OS 2.x
|
|
||||||
Linux ELF 1.2.x
|
|
||||||
SCO OpenServer 5.x
|
|
||||||
Concurrent MAX/OS 1.x
|
|
||||||
DG/UX 5.x
|
|
||||||
|
|
||||||
License Policy: Freely Redistributable under GNU Library General Public License (LGPL)
|
|
||||||
|
|
||||||
Keywords: ODBC, database, SQL, OpenLink
|
|
@@ -1,182 +0,0 @@
|
|||||||
Basic Installation
|
|
||||||
==================
|
|
||||||
|
|
||||||
These are generic installation instructions.
|
|
||||||
|
|
||||||
The `configure' shell script attempts to guess correct values for
|
|
||||||
various system-dependent variables used during compilation. It uses
|
|
||||||
those values to create a `Makefile' in each directory of the package.
|
|
||||||
It may also create one or more `.h' files containing system-dependent
|
|
||||||
definitions. Finally, it creates a shell script `config.status' that
|
|
||||||
you can run in the future to recreate the current configuration, a file
|
|
||||||
`config.cache' that saves the results of its tests to speed up
|
|
||||||
reconfiguring, and a file `config.log' containing compiler output
|
|
||||||
(useful mainly for debugging `configure').
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
|
||||||
to figure out how `configure' could check whether to do them, and mail
|
|
||||||
diffs or instructions to the address given in the `README' so they can
|
|
||||||
be considered for the next release. If at some point `config.cache'
|
|
||||||
contains results you don't want to keep, you may remove or edit it.
|
|
||||||
|
|
||||||
The file `configure.in' is used to create `configure' by a program
|
|
||||||
called `autoconf'. You only need `configure.in' if you want to change
|
|
||||||
it or regenerate `configure' using a newer version of `autoconf'.
|
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
|
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type
|
|
||||||
`./configure' to configure the package for your system. If you're
|
|
||||||
using `csh' on an old version of System V, you might need to type
|
|
||||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
|
||||||
`configure' itself.
|
|
||||||
|
|
||||||
Running `configure' takes awhile. While running, it prints some
|
|
||||||
messages telling which features it is checking for.
|
|
||||||
|
|
||||||
2. Type `make' to compile the package.
|
|
||||||
|
|
||||||
3. Optionally, type `make check' to run any self-tests that come with
|
|
||||||
the package.
|
|
||||||
|
|
||||||
4. Type `make install' to install the programs and any data files and
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
5. You can remove the program binaries and object files from the
|
|
||||||
source code directory by typing `make clean'. To also remove the
|
|
||||||
files that `configure' created (so you can compile the package for
|
|
||||||
a different kind of computer), type `make distclean'. There is
|
|
||||||
also a `make maintainer-clean' target, but that is intended mainly
|
|
||||||
for the package's developers. If you use it, you may have to get
|
|
||||||
all sorts of other programs in order to regenerate files that came
|
|
||||||
with the distribution.
|
|
||||||
|
|
||||||
Compilers and Options
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
|
||||||
the `configure' script does not know about. You can give `configure'
|
|
||||||
initial values for variables by setting them in the environment. Using
|
|
||||||
a Bourne-compatible shell, you can do that on the command line like
|
|
||||||
this:
|
|
||||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
|
||||||
|
|
||||||
Or on systems that have the `env' program, you can do it like this:
|
|
||||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
|
||||||
|
|
||||||
Compiling For Multiple Architectures
|
|
||||||
====================================
|
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
|
||||||
same time, by placing the object files for each architecture in their
|
|
||||||
own directory. To do this, you must use a version of `make' that
|
|
||||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
|
||||||
directory where you want the object files and executables to go and run
|
|
||||||
the `configure' script. `configure' automatically checks for the
|
|
||||||
source code in the directory that `configure' is in and in `..'.
|
|
||||||
|
|
||||||
If you have to use a `make' that does not supports the `VPATH'
|
|
||||||
variable, you have to compile the package for one architecture at a time
|
|
||||||
in the source code directory. After you have installed the package for
|
|
||||||
one architecture, use `make distclean' before reconfiguring for another
|
|
||||||
architecture.
|
|
||||||
|
|
||||||
Installation Names
|
|
||||||
==================
|
|
||||||
|
|
||||||
By default, `make install' will install the package's files in
|
|
||||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
|
||||||
installation prefix other than `/usr/local' by giving `configure' the
|
|
||||||
option `--prefix=PATH'.
|
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
|
||||||
architecture-specific files and architecture-independent files. If you
|
|
||||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
|
||||||
PATH as the prefix for installing programs and libraries.
|
|
||||||
Documentation and other data files will still use the regular prefix.
|
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
|
||||||
options like `--bindir=PATH' to specify different values for particular
|
|
||||||
kinds of files. Run `configure --help' for a list of the directories
|
|
||||||
you can set and what kinds of files go in them.
|
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
|
||||||
with an extra prefix or suffix on their names by giving `configure' the
|
|
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
|
||||||
|
|
||||||
Optional Features
|
|
||||||
=================
|
|
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to
|
|
||||||
`configure', where FEATURE indicates an optional part of the package.
|
|
||||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
|
||||||
is something like `gnu-as' or `x' (for the X Window System). The
|
|
||||||
`README' should mention any `--enable-' and `--with-' options that the
|
|
||||||
package recognizes.
|
|
||||||
|
|
||||||
For packages that use the X Window System, `configure' can usually
|
|
||||||
find the X include and library files automatically, but if it doesn't,
|
|
||||||
you can use the `configure' options `--x-includes=DIR' and
|
|
||||||
`--x-libraries=DIR' to specify their locations.
|
|
||||||
|
|
||||||
Specifying the System Type
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There may be some features `configure' can not figure out
|
|
||||||
automatically, but needs to determine by the type of host the package
|
|
||||||
will run on. Usually `configure' can figure that out, but if it prints
|
|
||||||
a message saying it can not guess the host type, give it the
|
|
||||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
|
||||||
type, such as `sun4', or a canonical name with three fields:
|
|
||||||
CPU-COMPANY-SYSTEM
|
|
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If
|
|
||||||
`config.sub' isn't included in this package, then this package doesn't
|
|
||||||
need to know the host type.
|
|
||||||
|
|
||||||
If you are building compiler tools for cross-compiling, you can also
|
|
||||||
use the `--target=TYPE' option to select the type of system they will
|
|
||||||
produce code for and the `--build=TYPE' option to select the type of
|
|
||||||
system on which you are compiling the package.
|
|
||||||
|
|
||||||
Sharing Defaults
|
|
||||||
================
|
|
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share,
|
|
||||||
you can create a site shell script called `config.site' that gives
|
|
||||||
default values for variables like `CC', `cache_file', and `prefix'.
|
|
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
|
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
|
||||||
`CONFIG_SITE' environment variable to the location of the site script.
|
|
||||||
A warning: not all `configure' scripts look for a site script.
|
|
||||||
|
|
||||||
Operation Controls
|
|
||||||
==================
|
|
||||||
|
|
||||||
`configure' recognizes the following options to control how it
|
|
||||||
operates.
|
|
||||||
|
|
||||||
`--cache-file=FILE'
|
|
||||||
Use and save the results of the tests in FILE instead of
|
|
||||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
|
||||||
debugging `configure'.
|
|
||||||
|
|
||||||
`--help'
|
|
||||||
Print a summary of the options to `configure', and exit.
|
|
||||||
|
|
||||||
`--quiet'
|
|
||||||
`--silent'
|
|
||||||
`-q'
|
|
||||||
Do not print messages saying which checks are being made. To
|
|
||||||
suppress all normal output, redirect it to `/dev/null' (any error
|
|
||||||
messages will still be shown).
|
|
||||||
|
|
||||||
`--srcdir=DIR'
|
|
||||||
Look for the package's source code in directory DIR. Usually
|
|
||||||
`configure' can determine that directory automatically.
|
|
||||||
|
|
||||||
`--version'
|
|
||||||
Print the version of Autoconf used to generate the `configure'
|
|
||||||
script, and exit.
|
|
||||||
|
|
||||||
`configure' also accepts some other, not widely useful, options.
|
|
@@ -1,8 +0,0 @@
|
|||||||
Version: 2.5
|
|
||||||
-------------
|
|
||||||
Added OpenLink enhancements
|
|
||||||
|
|
||||||
|
|
||||||
Version: 2.12
|
|
||||||
-------------
|
|
||||||
Original version of Ke Jin
|
|
187
src/iodbc/README
187
src/iodbc/README
@@ -1,187 +0,0 @@
|
|||||||
0. Changes
|
|
||||||
a. I realized that a driver manager doesn't aware of
|
|
||||||
difference between a C5 (i.e. hstmt) and a C6
|
|
||||||
(i.e. transaction) states.
|
|
||||||
|
|
||||||
b. The link flags "-lc" has been removed from Linux ELF
|
|
||||||
section of Config.mk to fix a segment fault problem.
|
|
||||||
Now, it works fine on Slackware 2.3 and Red Hat 2.0
|
|
||||||
(kernel version are 1.2.xx and 1.3.xx respectively).
|
|
||||||
|
|
||||||
c. On FreeBSD 2.x, dlsym() doesn't handle the '_'
|
|
||||||
prepended before a exporting function symbol. So,
|
|
||||||
CLI_NAME_PREFIX needs to be defined as "_SQL" for
|
|
||||||
FreeBSD.
|
|
||||||
|
|
||||||
d. Some files are renamed
|
|
||||||
dld.c -> dlf.c
|
|
||||||
dld.h -> dlf.h
|
|
||||||
confg.h -> config.h
|
|
||||||
|
|
||||||
1. iODBC driver manager platform availability
|
|
||||||
|
|
||||||
iODBC driver manager has been ported to following Unix platforms:
|
|
||||||
|
|
||||||
SunOS 4.1.x Sun Sparc
|
|
||||||
HP/UX 9.x, 10.x HP9000 s700/s800
|
|
||||||
HP/UX 9.x HP9000 s300/s400
|
|
||||||
IBM AIX 3.x, 4.x IBM RS6000, PowerPC
|
|
||||||
Sun Solaris 2.x Sun Sparc, PCx86
|
|
||||||
SGI Irix SVR4 5.x, 6.x IP12 MIPS, IP22 MIPS
|
|
||||||
NCR SVR4 3.x NCR 3435
|
|
||||||
UnixWare SVR4.2 1.x, 2.x x86
|
|
||||||
DEC Unix(OSF/1) 3.x, 4.x DEC Alpha
|
|
||||||
FreeBSD 2.x x86
|
|
||||||
BSDI BSD/OS 2.x ?
|
|
||||||
Linux ELF 1.2.x, 1.3.x x86
|
|
||||||
SCO OpenServer 5.x x86
|
|
||||||
Max/OS SVR4 1.x Concurrent Maxion 9200 MP
|
|
||||||
DG/UX 5.x Aviion
|
|
||||||
|
|
||||||
Porting of iODBC driver manager to some non-unix operating systems
|
|
||||||
such as Windows family(3.x, 95, NT), OS/2 and Mac is supported but
|
|
||||||
has never compiled and tested yet :). Of cause, you need to supply
|
|
||||||
a make/build file and a short LibMain for creating the iodbc.dll.
|
|
||||||
|
|
||||||
2. How to build iODBC driver manager:
|
|
||||||
|
|
||||||
step 1. Identify your system
|
|
||||||
step 2. Run build with a suitable option
|
|
||||||
|
|
||||||
Here is an example:
|
|
||||||
|
|
||||||
%[1]: sh iodbc-2.12.shar
|
|
||||||
....
|
|
||||||
%[2]: cd iodbc-2.12
|
|
||||||
%[3]: uname -s -v -r -m
|
|
||||||
HP-UX B.10.01 A 9000/710
|
|
||||||
%[4]: ./build hp700
|
|
||||||
autoconfig hp700
|
|
||||||
make
|
|
||||||
....
|
|
||||||
Generating iODBC driver manager --> /home/kejin/iodbc-2.12.sl
|
|
||||||
|
|
||||||
3. odbc.ini( ~/.odbc.ini )
|
|
||||||
|
|
||||||
Driver manager and drivers use odbc.ini(or ~/.odbc.ini on Unix) file
|
|
||||||
or connection string when establishing a data source connection. On
|
|
||||||
Windows, odbc.ini is located in Windows directory. On unix, iODBC driver
|
|
||||||
manager(and all other ODBC drivers and driver managers I awared) looks
|
|
||||||
.odbc.ini file in real user's home directory (it could be a softlink to
|
|
||||||
the file located somewhere else). Make sure your driver will look into
|
|
||||||
the same file (or a file which is a symbolic link to the same file).
|
|
||||||
The format of odbc.ini( or ~/.odbc.ini ) is defined as:
|
|
||||||
|
|
||||||
odbc.ini(or .odbc.ini) ::= data_source_list
|
|
||||||
|
|
||||||
data_source_list ::= /* empty */
|
|
||||||
| data_source '\n' data_source_list
|
|
||||||
|
|
||||||
data_source ::= '[' data_source_name ']' '\n' data_source_desc
|
|
||||||
|
|
||||||
data_source_name ::= 'default' | [A-Za-z]*[A-Za-z0-9_]*
|
|
||||||
|
|
||||||
data_source_desc ::= /* empty */
|
|
||||||
| attrib_desc '\n' data_source_desc
|
|
||||||
|
|
||||||
addrib_desc ::= Attrib '=' attrib_value
|
|
||||||
|
|
||||||
Attrib ::= 'Driver' | 'PID' | 'UID' | driver_def_attrib
|
|
||||||
|
|
||||||
driver_def_attrib ::= [A-Za-z]*[A-Za-z0-9_]*
|
|
||||||
|
|
||||||
An example of .odbc.ini file:
|
|
||||||
|
|
||||||
[toronto_yp]
|
|
||||||
# yellow page of metro Toronto
|
|
||||||
Driver = /usr/lib/odbc/oracle.so
|
|
||||||
<....>
|
|
||||||
|
|
||||||
[toronto_wp]
|
|
||||||
# white page of metro Toronto
|
|
||||||
Driver = /usr/lib/odbc/oracle.so
|
|
||||||
<....>
|
|
||||||
|
|
||||||
[contract]
|
|
||||||
# all contract documents
|
|
||||||
Driver = /usr/lib/odbc/informix.so
|
|
||||||
<....>
|
|
||||||
|
|
||||||
[netnews]
|
|
||||||
# NNTP netnews group
|
|
||||||
Driver = /usr/lib/odbc/nnodbc.so
|
|
||||||
Server = news.empress.com
|
|
||||||
|
|
||||||
[rnd_test]
|
|
||||||
# data source for R&D test
|
|
||||||
Driver = /home/r_d/odbc/empodbc.so
|
|
||||||
URL = empodbc://rnd.empress.com:6322/rnd_test/testdb
|
|
||||||
|
|
||||||
[default]
|
|
||||||
# default to odbc gateway
|
|
||||||
Driver = /usr/lib/odbc/gateway.so
|
|
||||||
|
|
||||||
4. Tracing
|
|
||||||
|
|
||||||
iODBC driver manager traces driver's ODBC call invoked by the driver
|
|
||||||
manager. Default tracing file is ./odbc.log. Tracing option (i.e.
|
|
||||||
on/off or optional tracing file name) can be set in ~/.odbc.ini
|
|
||||||
file (under a data source section) as:
|
|
||||||
|
|
||||||
TraceFile = <optional_trace_file>
|
|
||||||
Trace = ON | On | on | 1 | OFF | Off | off | 0
|
|
||||||
|
|
||||||
If <optional_trace_file> is stderr or stdout, i.e.
|
|
||||||
|
|
||||||
TraceFile = stderr
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
TraceFile = stdout
|
|
||||||
|
|
||||||
the tracing message will go to the terminal screen(if it is available).
|
|
||||||
|
|
||||||
iODBC driver manager allows one to tune on/off tracing on selected
|
|
||||||
connection(s). Different connections can share one or use different
|
|
||||||
tracing file(s). ODBC calls on connections without tuning tracing on
|
|
||||||
will not be traced.
|
|
||||||
|
|
||||||
5. File list:
|
|
||||||
|
|
||||||
README This file
|
|
||||||
IAFA-PACKAGE Version and copyright information
|
|
||||||
Changes.log Source changes log
|
|
||||||
Version.mk Version make include file
|
|
||||||
Config.mk Config make include file
|
|
||||||
Makefile make file
|
|
||||||
config.h system config include file
|
|
||||||
isql.h ODBC 1.0 macro
|
|
||||||
isqlext.h ODBC 2.0 macro
|
|
||||||
dlf.h general dynamic loader module interface
|
|
||||||
dlf.c general dynamic loader module (mapping to svr4)
|
|
||||||
dlproc.h simple dynamic loader module interface
|
|
||||||
dlproc.c simple dynamic loader on top of dlf module
|
|
||||||
herr.h error handling module interface
|
|
||||||
herr.c error handling module
|
|
||||||
herr.ci error handling source include
|
|
||||||
henv.h environment handle interface
|
|
||||||
henv.c environment handle module
|
|
||||||
henv.ci environment handle source include
|
|
||||||
hdbc.h connection handle interface
|
|
||||||
hdbc.c connection handle module
|
|
||||||
hstmt.h statement handle interface
|
|
||||||
hstmt.c statement handle module
|
|
||||||
connect.c connect functions
|
|
||||||
prepare.c query prepare functions
|
|
||||||
execute.c query executing functions
|
|
||||||
result.c query result property functions
|
|
||||||
fetch.c query result fetch functions
|
|
||||||
info.c driver information functions
|
|
||||||
catalog.c catalog functions
|
|
||||||
misc.c miscellaneous functions
|
|
||||||
itrace.h macro
|
|
||||||
itrace.c trace function
|
|
||||||
main.c entry function used to build a share library on AIX
|
|
||||||
shrsub.exp export symbol list used on AIX
|
|
||||||
autoconfig shell script for creating Config.mk
|
|
||||||
build shell script for building iodbc driver manager
|
|
@@ -1,230 +0,0 @@
|
|||||||
#! /usr/bin/sh
|
|
||||||
|
|
||||||
cat > Config.tmp << '@END'
|
|
||||||
#
|
|
||||||
# Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
#============ Default for all system ==============
|
|
||||||
SHELL =
|
|
||||||
SHELL = /bin/sh
|
|
||||||
DLDAPI = DLDAPI_SVR4_DLFCN
|
|
||||||
DLSUFFIX= so
|
|
||||||
OUTFILE = iodbc
|
|
||||||
OBJX =
|
|
||||||
@END
|
|
||||||
|
|
||||||
\rm -f Makefile.tmp
|
|
||||||
cat > Makefile.tmp <<'@END'
|
|
||||||
include Version.mk
|
|
||||||
include Config.mk
|
|
||||||
@END
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
sun4)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ SunOS 4.1.x =========================
|
|
||||||
PIC = -pic
|
|
||||||
CC = acc
|
|
||||||
LIBS = -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#=========== AIX 3.x 4.x ==========================
|
|
||||||
DLDAPI = DLDAPI_AIX_LOAD
|
|
||||||
ANSI = -langlvl=ansi
|
|
||||||
LDFLAGS = -H512 -T512 -bE:shrsub.exp -bM:SRE
|
|
||||||
LIBS = -lc
|
|
||||||
OBJX = main.o
|
|
||||||
DLSUFFIX= s.o
|
|
||||||
CFLAGSX = -DCLI_NAME_PREFIX=\".SQL\"
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp300 | hp400)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ HP/UX (s300/s400) 9.x 10.x ==========
|
|
||||||
DLDAPI = DLDAPI_HP_SHL
|
|
||||||
ANSI = -Aa
|
|
||||||
PIC = +z
|
|
||||||
LDFLAGS = -b
|
|
||||||
DLSUFFIX= sl
|
|
||||||
CFLAGSX = -D_INCLUDE_POSIX_SOURCE -DCLI_NAME_PREFIX=\"_SQL\"
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp700 | hp800)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ HP/UX 9000(s700/s800) 9.x 10.x ======
|
|
||||||
DLDAPI = DLDAPI_HP_SHL
|
|
||||||
ANSI = -Aa
|
|
||||||
PIC = +z
|
|
||||||
LDFLAGS = -b
|
|
||||||
LIBS = -lc -ldld
|
|
||||||
DLSUFFIX= sl
|
|
||||||
CFLAGSX = -D_INCLUDE_POSIX_SOURCE
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
solaris)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#======= Solaris 2.x, SunOS 5.x (Sparc/x86) =======
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl -lnsl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
ncr |gis)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============= NCR SVR4 3.x =======================
|
|
||||||
PIC = -KPIC
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
unixware)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#========= UnixWare SVR4 1.x, 2.x =================
|
|
||||||
PIC = -KPIC
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
maxos)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ Concurrent Maxion MAX/OS 1.x ========
|
|
||||||
PIC = -KPIC
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
sco-opensrv | sco-osr5 )
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ SCO OpenServer 5.x ==================
|
|
||||||
PIC = -K PIC -b elf
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
dgux)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ DG/UX 5.x ===========================
|
|
||||||
PIC = -K PIC
|
|
||||||
LDFLAGS = -G -z defs
|
|
||||||
LIBS = -lc -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
freebsd)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============= FreeBSD 2.x ========================
|
|
||||||
PIC = -fPIC
|
|
||||||
CFLAGSX = -DCLI_NAME_PREFIX=\"_SQL\"
|
|
||||||
LDFLAGS = -Bshareable
|
|
||||||
LIBS = -lc
|
|
||||||
@END
|
|
||||||
|
|
||||||
\rm -f Makefile.tmp
|
|
||||||
cat > Makefile.tmp <<'@END'
|
|
||||||
.include "Version.mk"
|
|
||||||
.include "Config.mk"
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
bsd-os)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============ BSDI BSD/OS 2.x =====================
|
|
||||||
#
|
|
||||||
# ported by: Stuart Hayton <stuey@clic.co.uk>
|
|
||||||
#
|
|
||||||
CC = gcc
|
|
||||||
LDFLAGS = -r
|
|
||||||
LDSUFFIX= o
|
|
||||||
LIBS = -lc_s.2.0 -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
linux-elf)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============= Linux ELF =========================
|
|
||||||
# Slackware 2.x,(kernel 1.3.x) on i386
|
|
||||||
# Red Hat 2.x (kernel 1.2.x) on i486
|
|
||||||
#
|
|
||||||
ANSI = -ansi
|
|
||||||
CC = gcc
|
|
||||||
PIC = -fPIC
|
|
||||||
LDFLAGS = -shared
|
|
||||||
LIBS = -ldl
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
irix5| irix6)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============= SGI IRIX 5.x, 6.x =================
|
|
||||||
LDFLAGS = -shared
|
|
||||||
LIBS = -lc
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
|
|
||||||
dec-osf1 | dec-unix)
|
|
||||||
cat >> Config.tmp << '@END'
|
|
||||||
|
|
||||||
#============= DEC Unix(OSF/1) 3.x, 4.x ==========
|
|
||||||
LDFLAGS = -shared
|
|
||||||
LIBS = -lc
|
|
||||||
@END
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
cat << '@END'
|
|
||||||
|
|
||||||
Usage: autoconfig <platform_opt> or
|
|
||||||
build <platform_opt>
|
|
||||||
|
|
||||||
platform_opt:
|
|
||||||
|
|
||||||
sun4 -- SunOS 4.1.x
|
|
||||||
aix -- IBM AIX 3.x, 4.x
|
|
||||||
hp300, hp400 -- HP/UX 9.x, 10.x on 9000 s300/s400
|
|
||||||
hp700, hp800 -- HP/UX 9.x, 10.x on 9000 s700/s800
|
|
||||||
solaris -- Sun Solaris 2.x, SunOS 5.x
|
|
||||||
ncr, gis -- NCR(GIS) SVR4 3.x
|
|
||||||
unixware -- Novell UnixWare 1.x, 2.x
|
|
||||||
maxos -- Concurrent MAX/OS SVR4 1.x
|
|
||||||
sco-osr5 -- SCO Open Server 5.x
|
|
||||||
dgux -- DG/UX 5.x
|
|
||||||
freebsd -- FreeBSD 2.x
|
|
||||||
bsd-os -- BSDI BSD/OS 2.x
|
|
||||||
linux-elf -- Linux ELF 1.2.x and up
|
|
||||||
irix5, irix6 -- SGI Irix 5.x, 6.x
|
|
||||||
dec-osf1 -- DEC Unix(OSF/1) 3.x, 4.x
|
|
||||||
|
|
||||||
@END
|
|
||||||
\rm -f Config.tmp
|
|
||||||
\rm -f Makefile.tmp
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
\mv -f Config.tmp Config.mk
|
|
||||||
sed -e 's/.include.*//' -e 's/include.*//' Makefile >> Makefile.tmp
|
|
||||||
\mv -f Makefile.tmp Makefile
|
|
||||||
exit 0
|
|
@@ -1,987 +0,0 @@
|
|||||||
/*
|
|
||||||
* catalog.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Catalog functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static RETCODE
|
|
||||||
_iodbcdm_cata_state_ok (
|
|
||||||
HSTMT hstmt,
|
|
||||||
int fidx)
|
|
||||||
/* check state for executing catalog functions */
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != fidx)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static RETCODE
|
|
||||||
_iodbcdm_cata_state_tr (
|
|
||||||
HSTMT hstmt,
|
|
||||||
int fidx,
|
|
||||||
RETCODE result)
|
|
||||||
/* state transition for catalog function */
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
DBC_t FAR *pdbc;
|
|
||||||
|
|
||||||
pdbc = (DBC_t FAR *) (pstmt->hdbc);
|
|
||||||
|
|
||||||
if (pstmt->asyn_on == fidx)
|
|
||||||
{
|
|
||||||
switch (result)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state <= en_stmt_executed)
|
|
||||||
{
|
|
||||||
switch (result)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
pstmt->state = en_stmt_cursoropen;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = fidx;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetTypeInfo (
|
|
||||||
HSTMT hstmt,
|
|
||||||
SWORD fSqlType)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if (fSqlType > SQL_TYPE_MAX)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1004;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: SQL_TYPE_DRIVER_START is a negative number So, we use ">" */
|
|
||||||
if (fSqlType < SQL_TYPE_MIN && fSqlType > SQL_TYPE_DRIVER_START)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1004;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_GetTypeInfo);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetTypeInfo);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_GetTypeInfo,
|
|
||||||
(pstmt->dhstmt, fSqlType))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_GetTypeInfo, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSpecialColumns (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fColType,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName,
|
|
||||||
UWORD fScope,
|
|
||||||
UWORD fNullable)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fColType != SQL_BEST_ROWID && fColType != SQL_ROWVER)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1097;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fScope != SQL_SCOPE_CURROW
|
|
||||||
&& fScope != SQL_SCOPE_TRANSACTION
|
|
||||||
&& fScope != SQL_SCOPE_SESSION)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1098;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fNullable != SQL_NO_NULLS && fNullable != SQL_NULLABLE)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1099;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_SpecialColumns);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SpecialColumns);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SpecialColumns, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
fColType,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName,
|
|
||||||
fScope,
|
|
||||||
fNullable))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_SpecialColumns, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLStatistics (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName,
|
|
||||||
UWORD fUnique,
|
|
||||||
UWORD fAccuracy)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fUnique != SQL_INDEX_UNIQUE && fUnique != SQL_INDEX_ALL)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1100;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fAccuracy != SQL_ENSURE && fAccuracy != SQL_QUICK)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1101;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_Statistics);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Statistics);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Statistics, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName,
|
|
||||||
fUnique,
|
|
||||||
fAccuracy))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_Statistics, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLTables (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName,
|
|
||||||
UCHAR FAR * szTableType,
|
|
||||||
SWORD cbTableType)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS)
|
|
||||||
|| (cbTableType < 0 && cbTableType != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_Tables);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Tables);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Tables, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName,
|
|
||||||
szTableType,
|
|
||||||
cbTableType))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_Tables, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLColumnPrivileges (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName,
|
|
||||||
UCHAR FAR * szColumnName,
|
|
||||||
SWORD cbColumnName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS)
|
|
||||||
|| (cbColumnName < 0 && cbColumnName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_ColumnPrivileges);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ColumnPrivileges);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ColumnPrivileges, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName,
|
|
||||||
szColumnName,
|
|
||||||
cbColumnName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_ColumnPrivileges, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLColumns (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName,
|
|
||||||
UCHAR FAR * szColumnName,
|
|
||||||
SWORD cbColumnName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS)
|
|
||||||
|| (cbColumnName < 0 && cbColumnName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_Columns);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Columns);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Columns, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName,
|
|
||||||
szColumnName,
|
|
||||||
cbColumnName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_Columns, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLForeignKeys (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szPkTableQualifier,
|
|
||||||
SWORD cbPkTableQualifier,
|
|
||||||
UCHAR FAR * szPkTableOwner,
|
|
||||||
SWORD cbPkTableOwner,
|
|
||||||
UCHAR FAR * szPkTableName,
|
|
||||||
SWORD cbPkTableName,
|
|
||||||
UCHAR FAR * szFkTableQualifier,
|
|
||||||
SWORD cbFkTableQualifier,
|
|
||||||
UCHAR FAR * szFkTableOwner,
|
|
||||||
SWORD cbFkTableOwner,
|
|
||||||
UCHAR FAR * szFkTableName,
|
|
||||||
SWORD cbFkTableName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbPkTableQualifier < 0 && cbPkTableQualifier != SQL_NTS)
|
|
||||||
|| (cbPkTableOwner < 0 && cbPkTableOwner != SQL_NTS)
|
|
||||||
|| (cbPkTableName < 0 && cbPkTableName != SQL_NTS)
|
|
||||||
|| (cbFkTableQualifier < 0 && cbFkTableQualifier != SQL_NTS)
|
|
||||||
|| (cbFkTableOwner < 0 && cbFkTableOwner != SQL_NTS)
|
|
||||||
|| (cbFkTableName < 0 && cbFkTableName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_ForeignKeys);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ForeignKeys);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ForeignKeys, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szPkTableQualifier,
|
|
||||||
cbPkTableQualifier,
|
|
||||||
szPkTableOwner,
|
|
||||||
cbPkTableOwner,
|
|
||||||
szPkTableName,
|
|
||||||
cbPkTableName,
|
|
||||||
szFkTableQualifier,
|
|
||||||
cbFkTableQualifier,
|
|
||||||
szFkTableOwner,
|
|
||||||
cbFkTableOwner,
|
|
||||||
szFkTableName,
|
|
||||||
cbFkTableName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_ForeignKeys, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLPrimaryKeys (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_PrimaryKeys);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_PrimaryKeys);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PrimaryKeys, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szTableQualifier,
|
|
||||||
cbTableQualifier,
|
|
||||||
szTableOwner,
|
|
||||||
cbTableOwner,
|
|
||||||
szTableName,
|
|
||||||
cbTableName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_PrimaryKeys, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLProcedureColumns (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szProcQualifier,
|
|
||||||
SWORD cbProcQualifier,
|
|
||||||
UCHAR FAR * szProcOwner,
|
|
||||||
SWORD cbProcOwner,
|
|
||||||
UCHAR FAR * szProcName,
|
|
||||||
SWORD cbProcName,
|
|
||||||
UCHAR FAR * szColumnName,
|
|
||||||
SWORD cbColumnName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbProcQualifier < 0 && cbProcQualifier != SQL_NTS)
|
|
||||||
|| (cbProcOwner < 0 && cbProcOwner != SQL_NTS)
|
|
||||||
|| (cbProcName < 0 && cbProcName != SQL_NTS)
|
|
||||||
|| (cbColumnName < 0 && cbColumnName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_ProcedureColumns);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ProcedureColumns);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ProcedureColumns, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szProcQualifier,
|
|
||||||
cbProcQualifier,
|
|
||||||
szProcOwner,
|
|
||||||
cbProcOwner,
|
|
||||||
szProcName,
|
|
||||||
cbProcName,
|
|
||||||
szColumnName,
|
|
||||||
cbColumnName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_ProcedureColumns, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLProcedures (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szProcQualifier,
|
|
||||||
SWORD cbProcQualifier,
|
|
||||||
UCHAR FAR * szProcOwner,
|
|
||||||
SWORD cbProcOwner,
|
|
||||||
UCHAR FAR * szProcName,
|
|
||||||
SWORD cbProcName)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbProcQualifier < 0 && cbProcQualifier != SQL_NTS)
|
|
||||||
|| (cbProcOwner < 0 && cbProcOwner != SQL_NTS)
|
|
||||||
|| (cbProcName < 0 && cbProcName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_Procedures);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Procedures);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Procedures, (
|
|
||||||
pstmt->dhstmt,
|
|
||||||
szProcQualifier,
|
|
||||||
cbProcQualifier,
|
|
||||||
szProcOwner,
|
|
||||||
cbProcOwner,
|
|
||||||
szProcName,
|
|
||||||
cbProcName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_Procedures, retcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLTablePrivileges (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szTableQualifier,
|
|
||||||
SWORD cbTableQualifier,
|
|
||||||
UCHAR FAR * szTableOwner,
|
|
||||||
SWORD cbTableOwner,
|
|
||||||
UCHAR FAR * szTableName,
|
|
||||||
SWORD cbTableName)
|
|
||||||
{
|
|
||||||
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
|
|
||||||
|| (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
|
|
||||||
|| (cbTableName < 0 && cbTableName != SQL_NTS))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
retcode = _iodbcdm_cata_state_ok (hstmt, en_TablePrivileges);
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_TablePrivileges);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_TablePrivileges,
|
|
||||||
(pstmt->dhstmt, szTableQualifier, cbTableQualifier, szTableOwner,
|
|
||||||
cbTableOwner, szTableName, cbTableName))
|
|
||||||
|
|
||||||
return _iodbcdm_cata_state_tr (hstmt, en_TablePrivileges, retcode);
|
|
||||||
}
|
|
@@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
*
|
|
||||||
* config.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Configuration
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _CONFIG_H
|
|
||||||
#define _CONFIG_H
|
|
||||||
|
|
||||||
#if !defined(WINDOWS) && !defined(WIN32_SYSTEM)
|
|
||||||
#define _UNIX_
|
|
||||||
|
|
||||||
#include "wx/setup.h"
|
|
||||||
|
|
||||||
/* we have these definitions from configure */
|
|
||||||
#if defined(HAVE_DLOPEN)
|
|
||||||
#define DLDAPI_SVR4_DLFCN
|
|
||||||
#elif defined(HAVE_SHL_LOAD)
|
|
||||||
#define DLDAPI_HP_SHL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define MEM_ALLOC(size) (malloc((size_t)(size)))
|
|
||||||
#define MEM_FREE(ptr) {if(ptr) free(ptr);}
|
|
||||||
|
|
||||||
#define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
|
|
||||||
#define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n)))
|
|
||||||
#define STRCAT(t, s) (strcat((char*)(t), (char*)(s)))
|
|
||||||
#define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n)))
|
|
||||||
#define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0)
|
|
||||||
#define STRLEN(str) ((str)? strlen((char*)(str)):0)
|
|
||||||
|
|
||||||
#define EXPORT
|
|
||||||
#define CALLBACK
|
|
||||||
#define FAR
|
|
||||||
|
|
||||||
typedef signed short SSHOR;
|
|
||||||
typedef short WORD;
|
|
||||||
typedef long DWORD;
|
|
||||||
|
|
||||||
typedef WORD WPARAM;
|
|
||||||
typedef DWORD LPARAM;
|
|
||||||
typedef int BOOL;
|
|
||||||
#endif /* _UNIX_ */
|
|
||||||
|
|
||||||
#if defined(WINDOWS) || defined(WIN32_SYSTEM)
|
|
||||||
#include <windows.h>
|
|
||||||
#include <windowsx.h>
|
|
||||||
|
|
||||||
#ifdef _MSVC_
|
|
||||||
#define MEM_ALLOC(size) (fmalloc((size_t)(size)))
|
|
||||||
#define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0))
|
|
||||||
#define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s)))
|
|
||||||
#define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
|
|
||||||
#define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0)
|
|
||||||
#define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _BORLAND_
|
|
||||||
#define MEM_ALLOC(size) (farmalloc((unsigned long)(size))
|
|
||||||
#define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0)
|
|
||||||
#define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s)))
|
|
||||||
#define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
|
|
||||||
#define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0)
|
|
||||||
#define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* WINDOWS */
|
|
||||||
|
|
||||||
#define SYSERR (-1)
|
|
||||||
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL ((void FAR*)0UL)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
1241
src/iodbc/connect.c
1241
src/iodbc/connect.c
File diff suppressed because it is too large
Load Diff
612
src/iodbc/dlf.c
612
src/iodbc/dlf.c
@@ -1,612 +0,0 @@
|
|||||||
/*
|
|
||||||
* dlf.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Dynamic Library Loader (mapping to SVR4)
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dlf.h"
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#ifdef DLDAPI_DEFINED
|
|
||||||
#undef DLDAPI_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DLDAPI_SVR4_DLFCN
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
static char sccsid[] = "@(#)dynamic load interface -- SVR4 dlfcn";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*********************************
|
|
||||||
*
|
|
||||||
* HP/UX
|
|
||||||
*
|
|
||||||
*********************************/
|
|
||||||
|
|
||||||
#ifdef DLDAPI_HP_SHL
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
#include <dl.h>
|
|
||||||
|
|
||||||
static char sccsid[] = "@(#)dynamic load interface -- HP/UX dl(shl)";
|
|
||||||
|
|
||||||
void *
|
|
||||||
dlopen (char *path, int mode)
|
|
||||||
{
|
|
||||||
return (void *) shl_load ((char *) (path), BIND_DEFERRED, 0L);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void *
|
|
||||||
dlsym (void *hdll, char *sym)
|
|
||||||
{
|
|
||||||
void *symaddr = 0;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!hdll)
|
|
||||||
hdll = (void *) PROG_HANDLE;
|
|
||||||
|
|
||||||
/* Remember, a driver may export calls as function pointers
|
|
||||||
* (i.e. with type TYPE_DATA) rather than as functions
|
|
||||||
* (i.e. with type TYPE_PROCEDURE). Thus, to be safe, we
|
|
||||||
* uses TYPE_UNDEFINED to cover all of them.
|
|
||||||
*/
|
|
||||||
ret = shl_findsym ((shl_t *) & hdll, sym, TYPE_UNDEFINED, &symaddr);
|
|
||||||
|
|
||||||
if (ret == -1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return symaddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
dlerror ()
|
|
||||||
{
|
|
||||||
extern char *strerror ();
|
|
||||||
|
|
||||||
return strerror (errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
dlclose (void *hdll)
|
|
||||||
{
|
|
||||||
return shl_unload ((shl_t) hdll);
|
|
||||||
}
|
|
||||||
#endif /* end of HP/UX Seection */
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
|
||||||
*
|
|
||||||
* IBM AIX
|
|
||||||
*
|
|
||||||
*********************************/
|
|
||||||
|
|
||||||
#ifdef DLDAPI_AIX_LOAD
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/ldr.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <nlist.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Following id sting is a copyright mark. Removing(i.e. use the
|
|
||||||
* source code in this .c file without include it or make it not
|
|
||||||
* appear in the final object file of AIX platform) or modifing
|
|
||||||
* it without permission from original author(kejin@empress.com)
|
|
||||||
* are copyright violation.
|
|
||||||
*/
|
|
||||||
static char sccsid[]
|
|
||||||
= "@(#)dynamic load interface, Copyright(c) 1995 by Ke Jin";
|
|
||||||
|
|
||||||
#ifndef HTAB_SIZE
|
|
||||||
#define HTAB_SIZE 256
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FACTOR 0.618039887 /* i.e. (sqrt(5) - 1)/2 */
|
|
||||||
|
|
||||||
#ifndef ENTRY_SYM
|
|
||||||
#define ENTRY_SYM ".__start" /* default entry point for aix */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct slot_s
|
|
||||||
{
|
|
||||||
char *sym;
|
|
||||||
long fdesc[3]; /* 12 bytes function descriptor */
|
|
||||||
struct slot_s *next;
|
|
||||||
}
|
|
||||||
slot_t;
|
|
||||||
|
|
||||||
/* Note: on AIX, a function pointer actually points to a
|
|
||||||
* function descriptor, a 12 bytes data. The first 4 bytes
|
|
||||||
* is the virtual address of the function. The next 4 bytes
|
|
||||||
* is the virtual address of TOC (Table of Contents) of the
|
|
||||||
* object module the function belong to. The last 4 bytes
|
|
||||||
* are always 0 for C and Fortran functions. Every object
|
|
||||||
* module has an entry point (which can be specified at link
|
|
||||||
* time by -e ld option). iODBC driver manager requires ODBC
|
|
||||||
* driver shared library always use the default entry point
|
|
||||||
* (so you shouldn't use -e ld option when creating a driver
|
|
||||||
* share library). load() returns the function descriptor of
|
|
||||||
* a module's entry point. From which we can calculate function
|
|
||||||
* descriptors of other functions in the same module by using
|
|
||||||
* the fact that the load() doesn't change the relative
|
|
||||||
* offset of functions to their module entry point(i.e the
|
|
||||||
* offset in memory loaded by load() will be as same as in
|
|
||||||
* the module library file).
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef slot_t *hent_t;
|
|
||||||
typedef struct nlist nlist_t;
|
|
||||||
typedef struct stat stat_t;
|
|
||||||
|
|
||||||
typedef struct obj
|
|
||||||
{
|
|
||||||
int dev; /* device id */
|
|
||||||
int ino; /* inode number */
|
|
||||||
char *path; /* file name */
|
|
||||||
int (*pentry) (); /* entry point of this share library */
|
|
||||||
int refn; /* number of reference */
|
|
||||||
hent_t htab[HTAB_SIZE];
|
|
||||||
struct obj * next;
|
|
||||||
}
|
|
||||||
obj_t;
|
|
||||||
|
|
||||||
static char *errmsg = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_htab (hent_t * ht)
|
|
||||||
/* initate a hashing table */
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < HTAB_SIZE; i++)
|
|
||||||
ht[i] = (slot_t *) 0;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
clean_htab (hent_t * ht)
|
|
||||||
/* free all slots */
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
slot_t *ent;
|
|
||||||
slot_t *tent;
|
|
||||||
|
|
||||||
for (i = 0; i < HTAB_SIZE; i++)
|
|
||||||
{
|
|
||||||
for (ent = ht[i]; ent;)
|
|
||||||
{
|
|
||||||
tent = ent->next;
|
|
||||||
|
|
||||||
free (ent->sym);
|
|
||||||
free (ent);
|
|
||||||
|
|
||||||
ent = tent;
|
|
||||||
}
|
|
||||||
|
|
||||||
ht[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
hash (char *sym)
|
|
||||||
{
|
|
||||||
int a, key;
|
|
||||||
double f;
|
|
||||||
|
|
||||||
if (!sym || !*sym)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (key = *sym; *sym; sym++)
|
|
||||||
{
|
|
||||||
key += *sym;
|
|
||||||
a = key;
|
|
||||||
|
|
||||||
key = (int) ((a << 8) + (key >> 8));
|
|
||||||
key = (key > 0) ? key : -key;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = key * FACTOR;
|
|
||||||
a = (int) f;
|
|
||||||
|
|
||||||
return (int) ((HTAB_SIZE - 1) * (f - a));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static hent_t
|
|
||||||
search (hent_t * htab, char *sym)
|
|
||||||
/* search hashing table to find a matched slot */
|
|
||||||
{
|
|
||||||
int key;
|
|
||||||
slot_t *ent;
|
|
||||||
|
|
||||||
key = hash (sym);
|
|
||||||
|
|
||||||
for (ent = htab[key]; ent; ent = ent->next)
|
|
||||||
{
|
|
||||||
if (!strcmp (ent->sym, sym))
|
|
||||||
return ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0; /* no match */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
insert (hent_t * htab, slot_t * ent)
|
|
||||||
/* insert a new slot to hashing table */
|
|
||||||
{
|
|
||||||
int key;
|
|
||||||
|
|
||||||
key = hash (ent->sym);
|
|
||||||
|
|
||||||
ent->next = htab[key];
|
|
||||||
htab[key] = ent;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static slot_t *
|
|
||||||
slot_alloc (char *sym)
|
|
||||||
/* allocate a new slot with symbol */
|
|
||||||
{
|
|
||||||
slot_t *ent;
|
|
||||||
|
|
||||||
ent = (slot_t *) malloc (sizeof (slot_t));
|
|
||||||
|
|
||||||
ent->sym = (char *) malloc (strlen (sym) + 1);
|
|
||||||
|
|
||||||
if (!ent->sym)
|
|
||||||
{
|
|
||||||
free (ent);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (ent->sym, sym);
|
|
||||||
|
|
||||||
return ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static obj_t *obj_list = 0;
|
|
||||||
|
|
||||||
void *
|
|
||||||
dlopen (char *file, int mode)
|
|
||||||
{
|
|
||||||
stat_t st;
|
|
||||||
obj_t *pobj;
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
if (!file || !*file)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
errmsg = 0;
|
|
||||||
|
|
||||||
if (stat (file, &st))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (pobj = obj_list; pobj; pobj = pobj->next)
|
|
||||||
/* find a match object */
|
|
||||||
{
|
|
||||||
if (pobj->ino == st.st_ino
|
|
||||||
&& pobj->dev == st.st_dev)
|
|
||||||
{
|
|
||||||
/* found a match. increase its
|
|
||||||
* reference count and return
|
|
||||||
* its address */
|
|
||||||
pobj->refn++;
|
|
||||||
return pobj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pobj = (obj_t *) malloc (sizeof (obj_t));
|
|
||||||
|
|
||||||
if (!pobj)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pobj->path = (char *) malloc (strlen (file) + 1);
|
|
||||||
|
|
||||||
if (!pobj->path)
|
|
||||||
{
|
|
||||||
free (pobj);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy (pobj->path, file);
|
|
||||||
|
|
||||||
pobj->dev = st.st_dev;
|
|
||||||
pobj->ino = st.st_ino;
|
|
||||||
pobj->refn = 1;
|
|
||||||
|
|
||||||
pobj->pentry = (int (*)()) load (file, 0, 0);
|
|
||||||
|
|
||||||
if (!pobj->pentry)
|
|
||||||
{
|
|
||||||
free (pobj->path);
|
|
||||||
free (pobj);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_htab (pobj->htab);
|
|
||||||
|
|
||||||
pobj->next = obj_list;
|
|
||||||
obj_list = pobj;
|
|
||||||
|
|
||||||
return pobj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
dlclose (void *hobj)
|
|
||||||
{
|
|
||||||
obj_t *pobj = (obj_t *) hobj;
|
|
||||||
obj_t *tpobj;
|
|
||||||
int match = 0;
|
|
||||||
|
|
||||||
if (!hobj)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
errmsg = 0;
|
|
||||||
|
|
||||||
if (pobj == obj_list)
|
|
||||||
{
|
|
||||||
pobj->refn--;
|
|
||||||
|
|
||||||
if (pobj->refn)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
match = 1;
|
|
||||||
obj_list = pobj->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (tpobj = obj_list; !match && tpobj; tpobj = tpobj->next)
|
|
||||||
{
|
|
||||||
if (tpobj->next == pobj)
|
|
||||||
{
|
|
||||||
pobj->refn--;
|
|
||||||
|
|
||||||
if (pobj->refn)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
match = 1;
|
|
||||||
tpobj->next = pobj->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (match)
|
|
||||||
{
|
|
||||||
unload ((void *) (pobj->pentry));
|
|
||||||
clean_htab (pobj->htab);
|
|
||||||
free (pobj->path);
|
|
||||||
free (pobj);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
dlerror ()
|
|
||||||
{
|
|
||||||
extern char *sys_errlist[];
|
|
||||||
|
|
||||||
if (!errmsg || !errmsg[0])
|
|
||||||
{
|
|
||||||
if (errno >= 0)
|
|
||||||
return sys_errlist[errno];
|
|
||||||
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return errmsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void *
|
|
||||||
dlsym (void *hdl, char *sym)
|
|
||||||
{
|
|
||||||
nlist_t nl[3];
|
|
||||||
obj_t *pobj = (obj_t *) hdl;
|
|
||||||
slot_t *ent;
|
|
||||||
int (*fp) ();
|
|
||||||
long lbuf[3];
|
|
||||||
|
|
||||||
if (!hdl || !(pobj->htab) || !sym || !*sym)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
errmsg = 0;
|
|
||||||
|
|
||||||
ent = search (pobj->htab, sym);
|
|
||||||
|
|
||||||
if (ent)
|
|
||||||
return ent->fdesc;
|
|
||||||
|
|
||||||
#define n_name _n._n_name
|
|
||||||
|
|
||||||
nl[0].n_name = ENTRY_SYM;
|
|
||||||
nl[1].n_name = sym;
|
|
||||||
nl[2].n_name = 0;
|
|
||||||
|
|
||||||
/* There is a potential problem here. If application
|
|
||||||
* did not pass a full path name, and changed the
|
|
||||||
* working directory after the load(), then nlist()
|
|
||||||
* will be unable to open the original shared library
|
|
||||||
* file to resolve the symbols. there are 3 ways to working
|
|
||||||
* round this: 1. convert to full pathname in driver
|
|
||||||
* manager. 2. applications always pass driver's full
|
|
||||||
* path name. 3. if driver itself don't support
|
|
||||||
* SQLGetFunctions(), call it with SQL_ALL_FUNCTIONS
|
|
||||||
* as flag immidately after SQLConnect(), SQLDriverConnect()
|
|
||||||
* and SQLBrowseConnect() to force the driver manager
|
|
||||||
* resolving all will be used symbols.
|
|
||||||
*/
|
|
||||||
if (nlist (pobj->path, nl) == -1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!nl[0].n_type && !nl[0].n_value)
|
|
||||||
{
|
|
||||||
errmsg = "can't locate module entry symbol";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: On AIX 3.x if the object library is not
|
|
||||||
* built with -g compiling option, .n_type field
|
|
||||||
* is always 0. While on 4.x it will be 32.
|
|
||||||
* On AIX 4.x, if the symbol is a entry point,
|
|
||||||
* n_value will be 0. However, one thing is for sure
|
|
||||||
* that if a symbol is not existance in the file,
|
|
||||||
* both .n_type and .n_value would be 0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!nl[1].n_type && !nl[1].n_value)
|
|
||||||
{
|
|
||||||
errmsg = "symbol not existance in this module";
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ent = slot_alloc (sym);
|
|
||||||
|
|
||||||
if (!ent)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* catch it with a slot in the hashing table */
|
|
||||||
insert (pobj->htab, ent);
|
|
||||||
|
|
||||||
memcpy (ent->fdesc, pobj->pentry, sizeof (ent->fdesc));
|
|
||||||
|
|
||||||
/* now ent->fdesc[0] is the virtual address of entry point
|
|
||||||
* and ent->fdesc[1] is the TOC of the module
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* let's calculate the virtual address of the symbol
|
|
||||||
* by adding a relative offset getting from the module
|
|
||||||
* file symbol table, i.e
|
|
||||||
*
|
|
||||||
* functin virtual address = entry point virtual address +
|
|
||||||
* + ( function offset in file - entry point offset in file )
|
|
||||||
*/
|
|
||||||
|
|
||||||
(ent->fdesc)[0] = (ent->fdesc)[0] +
|
|
||||||
(nl[1].n_value - nl[0].n_value);
|
|
||||||
|
|
||||||
/* return the function descriptor */
|
|
||||||
return ent->fdesc;
|
|
||||||
}
|
|
||||||
#endif /* end of IBM AIX Section */
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
|
||||||
*
|
|
||||||
* Windows 3.x, 95, NT
|
|
||||||
*
|
|
||||||
*********************************/
|
|
||||||
|
|
||||||
#ifdef DLDAPI_WINDOWS
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
void FAR *
|
|
||||||
dlopen (char FAR * dll, int mode)
|
|
||||||
{
|
|
||||||
HINSTANCE hint;
|
|
||||||
|
|
||||||
if (dll == NULL)
|
|
||||||
{
|
|
||||||
return GetWindowWord (NULL, GWW_HINSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
hint = LoadLibrary (dll);
|
|
||||||
|
|
||||||
if (hint < HINSTANCE_ERROR)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void FAR *) hint;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FAR *
|
|
||||||
dlsym (void FAR * hdll, char FAR * sym)
|
|
||||||
{
|
|
||||||
return (void FAR *) GetProcAddress (hdll, sym);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char FAR *
|
|
||||||
dlerror ()
|
|
||||||
{
|
|
||||||
return 0L; /* unimplemented yet */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
dlclose (void FAR * hdll)
|
|
||||||
{
|
|
||||||
FreeLibrary ((HINSTANCE) hdll);
|
|
||||||
}
|
|
||||||
#endif /* end of Windows family */
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************
|
|
||||||
*
|
|
||||||
* other platforms
|
|
||||||
*
|
|
||||||
***********************************/
|
|
||||||
|
|
||||||
#ifdef DLDAPI_OS2
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
/*
|
|
||||||
* DosLoadModule(), DosQueryProcAddress(), DosFreeModule(), ...
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DLDAPI_MAC
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DLDAPI_NEXT
|
|
||||||
#define DLDAPI_DEFINED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DLDAPI_DEFINED
|
|
||||||
#error "dynamic load editor undefined"
|
|
||||||
#endif
|
|
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* dlf.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Dynamic Library Loader (mapping to SVR4)
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _DLF_H
|
|
||||||
#define _DLF_H
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#if defined(HAVE_LIBDL)
|
|
||||||
#define DLDAPI_SVR4_DLFCN
|
|
||||||
#elif defined(HAVE_SHL_LOAD)
|
|
||||||
#define DLDAPI_HP_SHL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DLDAPI_SVR4_DLFCN
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#elif DLDAPI_AIX_LOAD
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#else
|
|
||||||
extern void FAR *dlopen (char FAR * path, int mode);
|
|
||||||
extern void FAR *dlsym (void FAR * hdll, char FAR * sym);
|
|
||||||
extern char FAR *dlerror ();
|
|
||||||
extern int dlclose (void FAR * hdll);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RTLD_LAZY
|
|
||||||
#define RTLD_LAZY 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DLL_OPEN(dll) (void*)dlopen((char*)(path), RTLD_LAZY)
|
|
||||||
#define DLL_PROC(hdll, sym) (void*)dlsym((void*)(hdll), (char*)sym)
|
|
||||||
#define DLL_ERROR() (char*)dlerror()
|
|
||||||
#define DLL_CLOSE(hdll) dlclose((void*)(hdll))
|
|
||||||
#endif
|
|
@@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
* dlproc.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Load driver and resolve driver's function entry point
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#include "henv.ci"
|
|
||||||
|
|
||||||
HPROC
|
|
||||||
_iodbcdm_getproc (HDBC hdbc, int idx)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
ENV_t FAR *penv;
|
|
||||||
HPROC FAR *phproc;
|
|
||||||
|
|
||||||
if (idx <= 0 || idx > SQL_EXT_API_LAST)
|
|
||||||
/* first entry naver used */
|
|
||||||
{
|
|
||||||
return SQL_NULL_HPROC;
|
|
||||||
}
|
|
||||||
|
|
||||||
penv = (ENV_t FAR *) (pdbc->henv);
|
|
||||||
|
|
||||||
if (penv == NULL)
|
|
||||||
{
|
|
||||||
return SQL_NULL_HPROC;
|
|
||||||
}
|
|
||||||
|
|
||||||
phproc = penv->dllproc_tab + idx;
|
|
||||||
|
|
||||||
if (*phproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
int i, en_idx;
|
|
||||||
|
|
||||||
for (i = 0;; i++)
|
|
||||||
{
|
|
||||||
en_idx = odbcapi_symtab[i].en_idx;
|
|
||||||
|
|
||||||
if (en_idx == en_NullProc)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (en_idx == idx)
|
|
||||||
{
|
|
||||||
*phproc = _iodbcdm_dllproc (penv->hdll,
|
|
||||||
odbcapi_symtab[i].symbol);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return *phproc;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HDLL
|
|
||||||
_iodbcdm_dllopen (char FAR * path)
|
|
||||||
{
|
|
||||||
return (HDLL) DLL_OPEN (path);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HPROC
|
|
||||||
_iodbcdm_dllproc (HDLL hdll, char FAR * sym)
|
|
||||||
{
|
|
||||||
return (HPROC) DLL_PROC (hdll, sym);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
_iodbcdm_dllclose (HDLL hdll)
|
|
||||||
{
|
|
||||||
DLL_CLOSE (hdll);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
_iodbcdm_dllerror ()
|
|
||||||
{
|
|
||||||
return DLL_ERROR ();
|
|
||||||
}
|
|
||||||
|
|
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* dlproc.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Load driver and resolve driver's function entry point
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _DLPROC_H
|
|
||||||
#define _DLPROC_H
|
|
||||||
|
|
||||||
#include "dlf.h"
|
|
||||||
|
|
||||||
typedef RETCODE (FAR * HPROC) ();
|
|
||||||
|
|
||||||
#ifdef DLDAPI_SVR4_DLFCN
|
|
||||||
#include <dlfcn.h>
|
|
||||||
typedef void *HDLL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DLDAPI_HP_SHL
|
|
||||||
#include <dl.h>
|
|
||||||
typedef shl_t HDLL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DLDAPI_AIX_LOAD) || defined(__DECCXX)
|
|
||||||
typedef void *HDLL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern HPROC _iodbcdm_getproc ();
|
|
||||||
extern HDLL _iodbcdm_dllopen (char FAR * dll);
|
|
||||||
extern HPROC _iodbcdm_dllproc (HDLL hdll, char FAR * sym);
|
|
||||||
extern char FAR *_iodbcdm_dllerror ();
|
|
||||||
extern int _iodbcdm_dllclose (HDLL hdll);
|
|
||||||
|
|
||||||
#define SQL_NULL_HDLL ((HDLL)NULL)
|
|
||||||
#define SQL_NULL_HPROC ((HPROC)NULL)
|
|
||||||
#endif
|
|
@@ -1,768 +0,0 @@
|
|||||||
/*
|
|
||||||
* execute.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Invoke a query
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
do_cursoropen (STMT_t FAR * pstmt)
|
|
||||||
{
|
|
||||||
RETCODE retcode;
|
|
||||||
SWORD ncol;
|
|
||||||
|
|
||||||
pstmt->state = en_stmt_executed;
|
|
||||||
|
|
||||||
retcode = SQLNumResultCols (pstmt, &ncol);
|
|
||||||
|
|
||||||
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
if (ncol)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_cursoropen;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_opened;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_executed;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLExecute (HSTMT hstmt)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
if (!pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
if (!pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (!pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sqlstat = en_24000;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_Execute)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat == en_00000)
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Execute);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Execute,
|
|
||||||
(pstmt->dhstmt))
|
|
||||||
|
|
||||||
/* stmt state transition */
|
|
||||||
if (pstmt->asyn_on == en_Execute)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
do_cursoropen (hstmt);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
pstmt->state = en_stmt_needdata;
|
|
||||||
pstmt->need_on = en_Execute;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_Execute;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
pstmt->state = en_stmt_needdata;
|
|
||||||
pstmt->need_on = en_Execute;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_Execute;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLExecDirect (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szSqlStr,
|
|
||||||
SDWORD cbSqlStr)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check arguments */
|
|
||||||
if (szSqlStr == NULL)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1009;
|
|
||||||
}
|
|
||||||
else if (cbSqlStr < 0 && cbSqlStr != SQL_NTS)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_ExecDirect)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExecDirect);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ExecDirect,
|
|
||||||
(pstmt->dhstmt, szSqlStr, cbSqlStr))
|
|
||||||
|
|
||||||
/* stmt state transition */
|
|
||||||
if (pstmt->asyn_on == en_ExecDirect)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state <= en_stmt_executed)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
do_cursoropen (hstmt);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
pstmt->state = en_stmt_needdata;
|
|
||||||
pstmt->need_on = en_ExecDirect;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_ExecDirect;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLPutData (
|
|
||||||
HSTMT hstmt,
|
|
||||||
PTR rgbValue,
|
|
||||||
SDWORD cbValue)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument value */
|
|
||||||
if (rgbValue == NULL &&
|
|
||||||
(cbValue != SQL_DEFAULT_PARAM && cbValue != SQL_NULL_DATA))
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->state <= en_stmt_xfetched)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_PutData)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_PutData);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PutData,
|
|
||||||
(pstmt->dhstmt, rgbValue, cbValue))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_PutData)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* must in mustput or canput states */
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
pstmt->state = en_stmt_canput;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ERROR:
|
|
||||||
switch (pstmt->need_on)
|
|
||||||
{
|
|
||||||
case en_ExecDirect:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_Execute:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_SetPos:
|
|
||||||
/* Is this possible ???? */
|
|
||||||
pstmt->state = en_stmt_xfetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_PutData;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLParamData (
|
|
||||||
HSTMT hstmt,
|
|
||||||
PTR FAR * prgbValue)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->state <= en_stmt_xfetched)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_ParamData)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ParamData);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ParamData,
|
|
||||||
(pstmt->dhstmt, prgbValue))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_ParamData)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state < en_stmt_needdata)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_ERROR:
|
|
||||||
switch (pstmt->need_on)
|
|
||||||
{
|
|
||||||
case en_ExecDirect:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_Execute:
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_SetPos:
|
|
||||||
pstmt->state = en_stmt_xfetched;
|
|
||||||
pstmt->cursor_state
|
|
||||||
= en_stmt_cursor_xfetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_needdata:
|
|
||||||
pstmt->state = en_stmt_mustput;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_canput:
|
|
||||||
switch (pstmt->need_on)
|
|
||||||
{
|
|
||||||
case en_SetPos:
|
|
||||||
pstmt->state
|
|
||||||
= en_stmt_xfetched;
|
|
||||||
pstmt->cursor_state
|
|
||||||
= en_stmt_cursor_xfetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_ExecDirect:
|
|
||||||
case en_Execute:
|
|
||||||
do_cursoropen (hstmt);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
pstmt->state = en_stmt_mustput;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLNumParams (
|
|
||||||
HSTMT hstmt,
|
|
||||||
SWORD FAR * pcpar)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_NumParams)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_NumParams);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_NumParams,
|
|
||||||
(pstmt->dhstmt, pcpar))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_NumParams)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_NumParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLDescribeParam (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD ipar,
|
|
||||||
SWORD FAR * pfSqlType,
|
|
||||||
UDWORD FAR * pcbColDef,
|
|
||||||
SWORD FAR * pibScale,
|
|
||||||
SWORD FAR * pfNullable)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
if (ipar == 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1093);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_DescribeParam)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_DescribeParam);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_DescribeParam,
|
|
||||||
(pstmt->dhstmt, ipar, pfSqlType, pcbColDef, pibScale, pfNullable))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_DescribeParam)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_DescribeParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
@@ -1,649 +0,0 @@
|
|||||||
/*
|
|
||||||
* fetch.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Fetch query result
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLFetch (HSTMT hstmt)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_Fetch)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Fetch);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Fetch,
|
|
||||||
(pstmt->dhstmt))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_Fetch)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
pstmt->state = en_stmt_fetched;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_fetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
}
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_Fetch;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLExtendedFetch (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fFetchType,
|
|
||||||
SDWORD irow,
|
|
||||||
UDWORD FAR * pcrow,
|
|
||||||
UWORD FAR * rgfRowStatus)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check fetch type */
|
|
||||||
if (fFetchType < SQL_FETCH_NEXT || fFetchType > SQL_FETCH_BOOKMARK)
|
|
||||||
{
|
|
||||||
/* Unlike MS driver manager(i.e. DM),
|
|
||||||
* we don't check driver's ODBC version
|
|
||||||
* against SQL_FETCH_RESUME (only 1.0)
|
|
||||||
* and SQL_FETCH_BOOKMARK (only 2.0).
|
|
||||||
*/
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1106);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_ExtendedFetch)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExtendedFetch);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ExtendedFetch,
|
|
||||||
(pstmt->dhstmt, fFetchType, irow, pcrow, rgfRowStatus))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_ExtendedFetch)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
pstmt->state = en_stmt_xfetched;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_xfetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_ExtendedFetch;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetData (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD icol,
|
|
||||||
SWORD fCType,
|
|
||||||
PTR rgbValue,
|
|
||||||
SDWORD cbValueMax,
|
|
||||||
SDWORD FAR * pcbValue)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
if (rgbValue == NULL)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1009;
|
|
||||||
}
|
|
||||||
else if (cbValueMax < 0)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (fCType)
|
|
||||||
{
|
|
||||||
case SQL_C_DEFAULT:
|
|
||||||
case SQL_C_CHAR:
|
|
||||||
case SQL_C_BINARY:
|
|
||||||
case SQL_C_BIT:
|
|
||||||
case SQL_C_TINYINT:
|
|
||||||
case SQL_C_STINYINT:
|
|
||||||
case SQL_C_UTINYINT:
|
|
||||||
case SQL_C_SHORT:
|
|
||||||
case SQL_C_SSHORT:
|
|
||||||
case SQL_C_USHORT:
|
|
||||||
case SQL_C_LONG:
|
|
||||||
case SQL_C_SLONG:
|
|
||||||
case SQL_C_ULONG:
|
|
||||||
case SQL_C_FLOAT:
|
|
||||||
case SQL_C_DOUBLE:
|
|
||||||
case SQL_C_DATE:
|
|
||||||
case SQL_C_TIME:
|
|
||||||
case SQL_C_TIMESTAMP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sqlstat = en_S1003;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_GetData)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetData);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetData,
|
|
||||||
(pstmt->dhstmt, icol, fCType, rgbValue, cbValueMax, pcbValue))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_GetData)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_GetData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLMoreResults (HSTMT hstmt)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT
|
|
||||||
|| pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_MoreResults)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_MoreResults);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_MoreResults,
|
|
||||||
(pstmt->dhstmt))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_MoreResults)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
/* driver should return SQL_NO_DATA_FOUND */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
if (retcode == SQL_NO_DATA_FOUND)
|
|
||||||
{
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_MoreResults;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (retcode == SQL_SUCCESS)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (retcode == SQL_NO_DATA_FOUND)
|
|
||||||
{
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_MoreResults;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetPos (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD irow,
|
|
||||||
UWORD fOption,
|
|
||||||
UWORD fLock)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument value */
|
|
||||||
if (fOption > SQL_ADD || fLock > SQL_LOCK_UNLOCK)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1009);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_SetPos)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetPos);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetPos,
|
|
||||||
(pstmt->dhstmt, irow, fOption, fLock))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_SetPos)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now, the only possible init state is 'xfetched' */
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
pstmt->state = en_stmt_needdata;
|
|
||||||
pstmt->need_on = en_SetPos;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_SetPos;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
811
src/iodbc/hdbc.c
811
src/iodbc/hdbc.c
@@ -1,811 +0,0 @@
|
|||||||
/*
|
|
||||||
* hdbc.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Data source connect object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
|
|
||||||
extern RETCODE _iodbcdm_driverunload();
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLAllocConnect (
|
|
||||||
HENV henv,
|
|
||||||
HDBC FAR * phdbc)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t FAR *) henv;
|
|
||||||
DBC_t FAR *pdbc;
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
if (henv == SQL_NULL_HENV || genv->type != SQL_HANDLE_ENV)
|
|
||||||
#else
|
|
||||||
if (henv == SQL_NULL_HENV)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (phdbc == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc = (DBC_t FAR *) MEM_ALLOC (sizeof (DBC_t));
|
|
||||||
|
|
||||||
if (pdbc == NULL)
|
|
||||||
{
|
|
||||||
*phdbc = SQL_NULL_HDBC;
|
|
||||||
|
|
||||||
PUSHSQLERR (genv->herr, en_S1001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
pdbc->type = SQL_HANDLE_DBC;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* insert this dbc entry into the link list */
|
|
||||||
pdbc->next = genv->hdbc;
|
|
||||||
genv->hdbc = pdbc;
|
|
||||||
pdbc->genv = henv;
|
|
||||||
|
|
||||||
pdbc->henv = SQL_NULL_HENV;
|
|
||||||
pdbc->hstmt = SQL_NULL_HSTMT;
|
|
||||||
pdbc->herr = SQL_NULL_HERR;
|
|
||||||
pdbc->dhdbc = SQL_NULL_HDBC;
|
|
||||||
pdbc->state = en_dbc_allocated;
|
|
||||||
pdbc->trace = 0;
|
|
||||||
pdbc->tstm = NULL;
|
|
||||||
pdbc->tfile = NULL;
|
|
||||||
|
|
||||||
/* set connect options to default values */
|
|
||||||
pdbc->access_mode = SQL_MODE_DEFAULT;
|
|
||||||
pdbc->autocommit = SQL_AUTOCOMMIT_DEFAULT;
|
|
||||||
pdbc->current_qualifier = NULL;
|
|
||||||
pdbc->login_timeout = 0UL;
|
|
||||||
pdbc->odbc_cursors = SQL_CUR_DEFAULT;
|
|
||||||
pdbc->packet_size = 0UL;
|
|
||||||
pdbc->quiet_mode = (UDWORD) NULL;
|
|
||||||
pdbc->txn_isolation = SQL_TXN_READ_UNCOMMITTED;
|
|
||||||
pdbc->cb_commit = (SWORD) SQL_CB_DELETE;
|
|
||||||
pdbc->cb_rollback = (SWORD) SQL_CB_DELETE;
|
|
||||||
|
|
||||||
*phdbc = (HDBC) pdbc;
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLFreeConnect (HDBC hdbc)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv;
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
DBC_t FAR *tpdbc;
|
|
||||||
|
|
||||||
if (hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pdbc->state != en_dbc_allocated)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
genv = (GENV_t FAR *) pdbc->genv;
|
|
||||||
|
|
||||||
for (tpdbc = (DBC_t FAR *) genv->hdbc;
|
|
||||||
tpdbc != NULL;
|
|
||||||
tpdbc = tpdbc->next)
|
|
||||||
{
|
|
||||||
if (pdbc == tpdbc)
|
|
||||||
{
|
|
||||||
genv->hdbc = pdbc->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc == tpdbc->next)
|
|
||||||
{
|
|
||||||
tpdbc->next = pdbc->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free this dbc */
|
|
||||||
_iodbcdm_driverunload (pdbc);
|
|
||||||
_iodbcdm_freesqlerrlist (pdbc->herr);
|
|
||||||
|
|
||||||
if (pdbc->tfile)
|
|
||||||
{
|
|
||||||
MEM_FREE (pdbc->tfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
SQLSetConnectOption (pdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF);
|
|
||||||
|
|
||||||
MEM_FREE (pdbc);
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetConnectOption (
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fOption,
|
|
||||||
UDWORD vParam)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
STMT_t FAR *pstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
if (hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check option */
|
|
||||||
if (fOption < SQL_CONN_OPT_MIN ||
|
|
||||||
(fOption > SQL_CONN_OPT_MAX && fOption < SQL_CONNECT_OPT_DRVR_START))
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1092);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state of connection handle */
|
|
||||||
switch (pdbc->state)
|
|
||||||
{
|
|
||||||
case en_dbc_allocated:
|
|
||||||
if (fOption == SQL_TRANSLATE_DLL || fOption == SQL_TRANSLATE_OPTION)
|
|
||||||
{
|
|
||||||
/* This two options are only meaningful
|
|
||||||
* for specified driver. So, has to be
|
|
||||||
* set after a dirver has been loaded.
|
|
||||||
*/
|
|
||||||
sqlstat = en_08003;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOption >= SQL_CONNECT_OPT_DRVR_START && pdbc->henv == SQL_NULL_HENV)
|
|
||||||
/* An option only meaningful for drivers
|
|
||||||
* is passed before loading a driver.
|
|
||||||
* We classify this as an invalid option error.
|
|
||||||
* This is not documented by MS SDK guide.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
sqlstat = en_S1092;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_dbc_needdata:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_dbc_connected:
|
|
||||||
case en_dbc_hstmt:
|
|
||||||
if (fOption == SQL_ODBC_CURSORS)
|
|
||||||
{
|
|
||||||
sqlstat = en_08002;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state of statement handle(s) */
|
|
||||||
for (pstmt = (STMT_t FAR *) pdbc->hstmt;
|
|
||||||
pstmt != NULL && sqlstat == en_00000;
|
|
||||||
pstmt = (STMT_t FAR *) pstmt->next)
|
|
||||||
{
|
|
||||||
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOption == SQL_OPT_TRACE)
|
|
||||||
/* tracing flag can be set before and after connect
|
|
||||||
* and only meaningful for driver manager(actually
|
|
||||||
* there is only one tracing file under one global
|
|
||||||
* environment).
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
switch (vParam)
|
|
||||||
{
|
|
||||||
case SQL_OPT_TRACE_ON:
|
|
||||||
if (pdbc->tfile == NULL)
|
|
||||||
{
|
|
||||||
pdbc->tfile = (char FAR *) MEM_ALLOC (1 +
|
|
||||||
STRLEN (SQL_OPT_TRACE_FILE_DEFAULT));
|
|
||||||
|
|
||||||
if (pdbc->tfile == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRCPY (pdbc->tfile, SQL_OPT_TRACE_FILE_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->tstm == NULL)
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined(stderr) && defined(stdout)
|
|
||||||
if (STREQ (pdbc->tfile, "stderr"))
|
|
||||||
{
|
|
||||||
pdbc->tstm = stderr;
|
|
||||||
}
|
|
||||||
else if (STREQ (pdbc->tfile, "stdout"))
|
|
||||||
{
|
|
||||||
pdbc->tstm = stdout;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
pdbc->tstm
|
|
||||||
= fopen (pdbc->tfile, "a+");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->tstm)
|
|
||||||
{
|
|
||||||
pdbc->trace = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pdbc->trace = 0;
|
|
||||||
|
|
||||||
sqlstat = en_IM013;
|
|
||||||
retcode = SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_OPT_TRACE_OFF:
|
|
||||||
if (pdbc->trace && pdbc->tstm)
|
|
||||||
{
|
|
||||||
|
|
||||||
#if defined(stderr) && defined(stdout)
|
|
||||||
if (stderr != (FILE FAR *) (pdbc->tstm)
|
|
||||||
&& stdout != (FILE FAR *) (pdbc->tstm))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
fclose (pdbc->tstm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pdbc->tstm = NULL;
|
|
||||||
pdbc->trace = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1009);
|
|
||||||
retcode = SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, sqlstat);
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOption == SQL_OPT_TRACEFILE)
|
|
||||||
/* Tracing file can be set before and after connect
|
|
||||||
* and only meaningful for driver manager.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
if (vParam == 0UL || ((char FAR *) vParam)[0] == 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->tfile && STREQ (pdbc->tfile, vParam))
|
|
||||||
{
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->trace)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_IM014);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->tfile)
|
|
||||||
{
|
|
||||||
MEM_FREE (pdbc->tfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc->tfile = (char FAR *) MEM_ALLOC (1 + STRLEN (vParam));
|
|
||||||
|
|
||||||
if (pdbc->tfile == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRCPY (pdbc->tfile, vParam);
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->state != en_dbc_allocated)
|
|
||||||
{
|
|
||||||
/* If already connected, then, driver's odbc call
|
|
||||||
* will be invoked. Otherwise, we only save the options
|
|
||||||
* and delay the setting process until the connection
|
|
||||||
* been established.
|
|
||||||
*/
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_SetConnectOption);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_SetConnectOption,
|
|
||||||
(pdbc->dhdbc, fOption, vParam))
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now, either driver's odbc call was successed or
|
|
||||||
* driver has not been loaded yet. In the first case, we
|
|
||||||
* need flip flag for(such as access_mode, autocommit, ...)
|
|
||||||
* for our finit state machine. While in the second case,
|
|
||||||
* we need save option values(such as current_qualifier, ...)
|
|
||||||
* for delaied setting. So, ...
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* No matter what state we are(i.e. allocated or connected, ..)
|
|
||||||
* we need to flip the flag.
|
|
||||||
*/
|
|
||||||
switch (fOption)
|
|
||||||
{
|
|
||||||
case SQL_ACCESS_MODE:
|
|
||||||
pdbc->access_mode = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_AUTOCOMMIT:
|
|
||||||
pdbc->autocommit = vParam;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pdbc->state != en_dbc_allocated)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Only 'allocated' state is possible here, and we need to
|
|
||||||
* save the options for delaied setting.
|
|
||||||
*/
|
|
||||||
switch (fOption)
|
|
||||||
{
|
|
||||||
case SQL_CURRENT_QUALIFIER:
|
|
||||||
if (pdbc->current_qualifier != NULL)
|
|
||||||
{
|
|
||||||
MEM_FREE (pdbc->current_qualifier);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vParam == 0UL)
|
|
||||||
{
|
|
||||||
pdbc->current_qualifier = NULL;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc->current_qualifier
|
|
||||||
= (char FAR *) MEM_ALLOC (
|
|
||||||
STRLEN (vParam) + 1);
|
|
||||||
|
|
||||||
if (pdbc->current_qualifier == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1001);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRCPY (pdbc->current_qualifier, vParam);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_LOGIN_TIMEOUT:
|
|
||||||
pdbc->login_timeout = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ODBC_CURSORS:
|
|
||||||
pdbc->odbc_cursors = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_PACKET_SIZE:
|
|
||||||
pdbc->packet_size = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_QUIET_MODE:
|
|
||||||
pdbc->quiet_mode = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_TXN_ISOLATION:
|
|
||||||
pdbc->txn_isolation = vParam;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* Since we didn't save the option value for delaied
|
|
||||||
* setting, we should raise an error here.
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetConnectOption (
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fOption,
|
|
||||||
PTR pvParam)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check option */
|
|
||||||
if (fOption < SQL_CONN_OPT_MIN ||
|
|
||||||
(fOption > SQL_CONN_OPT_MAX && fOption < SQL_CONNECT_OPT_DRVR_START))
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1092);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
switch (pdbc->state)
|
|
||||||
{
|
|
||||||
case en_dbc_allocated:
|
|
||||||
if (fOption != SQL_ACCESS_MODE
|
|
||||||
&& fOption != SQL_AUTOCOMMIT
|
|
||||||
&& fOption != SQL_LOGIN_TIMEOUT
|
|
||||||
&& fOption != SQL_OPT_TRACE
|
|
||||||
&& fOption != SQL_OPT_TRACEFILE)
|
|
||||||
{
|
|
||||||
sqlstat = en_08003;
|
|
||||||
}
|
|
||||||
/* MS ODBC SDK document only
|
|
||||||
* allows SQL_ACCESS_MODE
|
|
||||||
* and SQL_AUTOCOMMIT in this
|
|
||||||
* dbc state. We allow another
|
|
||||||
* two options, because they
|
|
||||||
* are only meaningful for driver
|
|
||||||
* manager.
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_dbc_needdata:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tracing and tracing file options are only
|
|
||||||
* meaningful for driver manager
|
|
||||||
*/
|
|
||||||
if (fOption == SQL_OPT_TRACE)
|
|
||||||
{
|
|
||||||
if (pdbc->trace)
|
|
||||||
*((UDWORD *) pvParam) = (UDWORD) SQL_OPT_TRACE_ON;
|
|
||||||
else
|
|
||||||
*((UDWORD *) pvParam) = (UDWORD) SQL_OPT_TRACE_OFF;
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOption == SQL_OPT_TRACEFILE)
|
|
||||||
{
|
|
||||||
STRCPY (pvParam, pdbc->tfile);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->state != en_dbc_allocated)
|
|
||||||
/* if already connected, we will invoke driver's function */
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_GetConnectOption);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_GetConnectOption,
|
|
||||||
(pdbc->dhdbc, fOption, pvParam))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We needn't to handle options which are not allowed
|
|
||||||
* to be *get* at a allocated dbc state(and two tracing
|
|
||||||
* options which has been handled and returned). Thus,
|
|
||||||
* there are only two possible cases.
|
|
||||||
*/
|
|
||||||
switch (fOption)
|
|
||||||
{
|
|
||||||
case SQL_ACCESS_MODE:
|
|
||||||
*((UDWORD *) pvParam) = pdbc->access_mode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_AUTOCOMMIT:
|
|
||||||
*((UDWORD *) pvParam) = pdbc->autocommit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_LOGIN_TIMEOUT:
|
|
||||||
*((UDWORD *) pvParam) = pdbc->login_timeout;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static RETCODE
|
|
||||||
_iodbcdm_transact (
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fType)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
STMT_t FAR *pstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
switch (pdbc->state)
|
|
||||||
{
|
|
||||||
case en_dbc_allocated:
|
|
||||||
case en_dbc_needdata:
|
|
||||||
PUSHSQLERR (pdbc->herr, en_08003);
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
case en_dbc_connected:
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
|
|
||||||
case en_dbc_hstmt:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (pstmt = (STMT_t FAR *) (pdbc->hstmt);
|
|
||||||
pstmt != NULL;
|
|
||||||
pstmt = pstmt->next)
|
|
||||||
{
|
|
||||||
if (pstmt->state >= en_stmt_needdata
|
|
||||||
|| pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_Transact);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_Transact,
|
|
||||||
(SQL_NULL_HENV, pdbc->dhdbc, fType))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc->state = en_dbc_hstmt;
|
|
||||||
|
|
||||||
for (pstmt = (STMT_t FAR *) (pdbc->hstmt);
|
|
||||||
pstmt != NULL;
|
|
||||||
pstmt = pstmt->next)
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
if (pdbc->cb_commit == SQL_CB_DELETE
|
|
||||||
|| pdbc->cb_rollback == SQL_CB_DELETE)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (!pstmt->prep_state
|
|
||||||
&& pdbc->cb_commit != SQL_CB_PRESERVE
|
|
||||||
&& pdbc->cb_rollback != SQL_CB_PRESERVE)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
if (pdbc->cb_commit == SQL_CB_DELETE
|
|
||||||
|| pdbc->cb_rollback == SQL_CB_DELETE)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->cb_commit == SQL_CB_CLOSE
|
|
||||||
|| pdbc->cb_rollback == SQL_CB_CLOSE)
|
|
||||||
{
|
|
||||||
pstmt->state
|
|
||||||
= en_stmt_prepared;
|
|
||||||
pstmt->cursor_state
|
|
||||||
= en_stmt_cursor_no;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLTransact (
|
|
||||||
HENV henv,
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fType)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t FAR *) henv;
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
HERR herr;
|
|
||||||
RETCODE retcode = 0;
|
|
||||||
|
|
||||||
if (hdbc != SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
herr = pdbc->herr;
|
|
||||||
}
|
|
||||||
else if (henv != SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
herr = genv->herr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
if (fType != SQL_COMMIT
|
|
||||||
&& fType != SQL_ROLLBACK)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (herr, en_S1012);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hdbc != SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
retcode = _iodbcdm_transact (hdbc, fType);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (pdbc = (DBC_t FAR *) (genv->hdbc);
|
|
||||||
pdbc != NULL;
|
|
||||||
pdbc = pdbc->next)
|
|
||||||
{
|
|
||||||
retcode |= _iodbcdm_transact (hdbc, fType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS
|
|
||||||
&& retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
/* fail on one of the connection */
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
/*
|
|
||||||
* hdbc.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Data source connect object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _HDBC_H
|
|
||||||
#define _HDBC_H
|
|
||||||
|
|
||||||
typedef struct DBC
|
|
||||||
{
|
|
||||||
int type; /* must be 1st field */
|
|
||||||
struct DBC FAR *
|
|
||||||
next;
|
|
||||||
|
|
||||||
HENV genv; /* back point to global env object */
|
|
||||||
|
|
||||||
HDBC dhdbc; /* driver's private dbc */
|
|
||||||
HENV henv; /* back point to instant env object */
|
|
||||||
HSTMT hstmt; /* list of statement object handle(s) */
|
|
||||||
HERR herr;
|
|
||||||
|
|
||||||
int state;
|
|
||||||
|
|
||||||
/* options */
|
|
||||||
UDWORD access_mode;
|
|
||||||
UDWORD autocommit;
|
|
||||||
|
|
||||||
UDWORD login_timeout;
|
|
||||||
UDWORD odbc_cursors;
|
|
||||||
UDWORD packet_size;
|
|
||||||
UDWORD quiet_mode;
|
|
||||||
UDWORD txn_isolation;
|
|
||||||
SWORD cb_commit;
|
|
||||||
SWORD cb_rollback;
|
|
||||||
|
|
||||||
char FAR *
|
|
||||||
current_qualifier;
|
|
||||||
|
|
||||||
int trace; /* trace flag */
|
|
||||||
char FAR *
|
|
||||||
tfile;
|
|
||||||
void FAR *
|
|
||||||
tstm; /* trace stream */
|
|
||||||
}
|
|
||||||
DBC_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note:
|
|
||||||
* - ODBC applications can see address of driver manager's
|
|
||||||
* connection object, i.e connection handle -- a void pointer,
|
|
||||||
* but not detail of it. ODBC applications can neither see
|
|
||||||
* detail driver's connection object nor its address.
|
|
||||||
*
|
|
||||||
* - ODBC driver manager knows its own connection objects and
|
|
||||||
* exposes their address to an ODBC application. Driver manager
|
|
||||||
* also knows address of driver's connection objects and keeps
|
|
||||||
* it via dhdbc field in driver manager's connection object.
|
|
||||||
*
|
|
||||||
* - ODBC driver exposes address of its own connection object to
|
|
||||||
* driver manager without detail.
|
|
||||||
*
|
|
||||||
* - Applications can get driver's connection object handle by
|
|
||||||
* SQLGetInfo() with fInfoType equals to SQL_DRIVER_HDBC.
|
|
||||||
*/
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
en_dbc_allocated,
|
|
||||||
en_dbc_needdata,
|
|
||||||
en_dbc_connected,
|
|
||||||
en_dbc_hstmt
|
|
||||||
};
|
|
||||||
#endif
|
|
@@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
* henv.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Environment object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLAllocEnv (HENV FAR * phenv)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv;
|
|
||||||
|
|
||||||
genv = (GENV_t *) MEM_ALLOC (sizeof (GENV_t));
|
|
||||||
|
|
||||||
if (genv == NULL)
|
|
||||||
{
|
|
||||||
*phenv = SQL_NULL_HENV;
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300 )
|
|
||||||
genv->type = SQL_HANDLE_ENV;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
genv->henv = SQL_NULL_HENV; /* driver's env list */
|
|
||||||
genv->hdbc = SQL_NULL_HDBC; /* driver's dbc list */
|
|
||||||
genv->herr = SQL_NULL_HERR; /* err list */
|
|
||||||
|
|
||||||
*phenv = (HENV) genv;
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLFreeEnv (HENV henv)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t *) henv;
|
|
||||||
|
|
||||||
if (henv == SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (genv->hdbc != SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
_iodbcdm_freesqlerrlist (genv->herr);
|
|
||||||
|
|
||||||
MEM_FREE (henv);
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
@@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
* henv.ci
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Function names
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* There are some exceptions :
|
|
||||||
* on FreeBSD 2.x CLI_NAME_PREFIX is defined in Config.mk as "_SQL"
|
|
||||||
* on HP/UX s300/s400, CLI_NAME_PREFIX is defined in Config.mk as "_SQL"
|
|
||||||
* on AIX 3.x 4.x, CLI_NAME_PREFIX is defined in Config.mk as ".SQL"
|
|
||||||
*/
|
|
||||||
#ifndef CLI_NAME_PREFIX
|
|
||||||
# define CLI_NAME_PREFIX "SQL" /* using call by value prefix */
|
|
||||||
#else
|
|
||||||
# ifdef NEED_USCORE
|
|
||||||
# define CLI_NAME_PREFIX "_SQL"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct
|
|
||||||
{
|
|
||||||
int en_idx;
|
|
||||||
char *symbol;
|
|
||||||
}
|
|
||||||
odbcapi_symtab[] = {
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
{ en_AllocHandle CLI_NAME_PREFIX "AllocHandle" },
|
|
||||||
{ en_FreeHandle CLI_NAME_PREFIX "FreeHandle" },
|
|
||||||
#endif
|
|
||||||
{ en_AllocEnv, CLI_NAME_PREFIX "AllocEnv" },
|
|
||||||
{ en_AllocConnect, CLI_NAME_PREFIX "AllocConnect" },
|
|
||||||
{ en_Connect, CLI_NAME_PREFIX "Connect" },
|
|
||||||
{ en_DriverConnect, CLI_NAME_PREFIX "DriverConnect" },
|
|
||||||
{ en_BrowseConnect, CLI_NAME_PREFIX "BrowseConnect" },
|
|
||||||
|
|
||||||
{ en_DataSources, CLI_NAME_PREFIX "DataSources" },
|
|
||||||
{ en_Drivers, CLI_NAME_PREFIX "Driver" },
|
|
||||||
{ en_GetInfo, CLI_NAME_PREFIX "GetInfo" },
|
|
||||||
{ en_GetFunctions, CLI_NAME_PREFIX "GetFunctions" },
|
|
||||||
{ en_GetTypeInfo, CLI_NAME_PREFIX "GetTypeInfo" },
|
|
||||||
|
|
||||||
{ en_SetConnectOption, CLI_NAME_PREFIX "SetConnectOption" },
|
|
||||||
{ en_GetConnectOption, CLI_NAME_PREFIX "GetConnectOption" },
|
|
||||||
{ en_SetStmtOption, CLI_NAME_PREFIX "SetStmtOption" },
|
|
||||||
{ en_GetStmtOption, CLI_NAME_PREFIX "GetStmtOption" },
|
|
||||||
|
|
||||||
{ en_AllocStmt, CLI_NAME_PREFIX "AllocStmt" },
|
|
||||||
{ en_Prepare, CLI_NAME_PREFIX "Prepare" },
|
|
||||||
{ en_BindParameter, CLI_NAME_PREFIX "BindParameter" },
|
|
||||||
{ en_ParamOptions, CLI_NAME_PREFIX "ParamOptions" },
|
|
||||||
{ en_GetCursorName, CLI_NAME_PREFIX "GetCursorName" },
|
|
||||||
{ en_SetCursorName, CLI_NAME_PREFIX "SetCursorName" },
|
|
||||||
{ en_SetScrollOptions, CLI_NAME_PREFIX "SetScrollOptions" },
|
|
||||||
{ en_SetParam, CLI_NAME_PREFIX "SetParam" },
|
|
||||||
|
|
||||||
{ en_Execute, CLI_NAME_PREFIX "Execute" },
|
|
||||||
{ en_ExecDirect, CLI_NAME_PREFIX "ExecDirect" },
|
|
||||||
{ en_NativeSql, CLI_NAME_PREFIX "NativeSql" },
|
|
||||||
{ en_DescribeParam, CLI_NAME_PREFIX "DescribeParam" },
|
|
||||||
{ en_NumParams, CLI_NAME_PREFIX "NumParams" },
|
|
||||||
{ en_ParamData, CLI_NAME_PREFIX "ParamData" },
|
|
||||||
{ en_PutData, CLI_NAME_PREFIX "PutData" },
|
|
||||||
|
|
||||||
{ en_RowCount, CLI_NAME_PREFIX "RowCount" },
|
|
||||||
{ en_NumResultCols, CLI_NAME_PREFIX "NumResultCols" },
|
|
||||||
{ en_DescribeCol, CLI_NAME_PREFIX "DescribeCol" },
|
|
||||||
{ en_ColAttributes, CLI_NAME_PREFIX "ColAttributes" },
|
|
||||||
{ en_BindCol, CLI_NAME_PREFIX "BindCol" },
|
|
||||||
{ en_Fetch, CLI_NAME_PREFIX "Fetch" },
|
|
||||||
{ en_ExtendedFetch, CLI_NAME_PREFIX "ExtendedFetch" },
|
|
||||||
{ en_GetData, CLI_NAME_PREFIX "GetData" },
|
|
||||||
{ en_SetPos, CLI_NAME_PREFIX "SetPos" },
|
|
||||||
{ en_MoreResults, CLI_NAME_PREFIX "MoreResults" },
|
|
||||||
{ en_Error, CLI_NAME_PREFIX "Error" },
|
|
||||||
|
|
||||||
{ en_ColumnPrivileges, CLI_NAME_PREFIX "ColumnPrivileges" },
|
|
||||||
{ en_Columns, CLI_NAME_PREFIX "Columns" },
|
|
||||||
{ en_ForeignKeys, CLI_NAME_PREFIX "ForeignKeys" },
|
|
||||||
{ en_PrimaryKeys, CLI_NAME_PREFIX "PrimaryKeys" },
|
|
||||||
{ en_ProcedureColumns, CLI_NAME_PREFIX "ProcedureColumns" },
|
|
||||||
{ en_Procedures, CLI_NAME_PREFIX "Procedures" },
|
|
||||||
{ en_SpecialColumns, CLI_NAME_PREFIX "SpecialColumns" },
|
|
||||||
{ en_Statistics, CLI_NAME_PREFIX "Statistics" },
|
|
||||||
{ en_TablePrivileges, CLI_NAME_PREFIX "TablePrivileges" },
|
|
||||||
{ en_Tables, CLI_NAME_PREFIX "Tables" },
|
|
||||||
|
|
||||||
{ en_FreeStmt, CLI_NAME_PREFIX "FreeStmt" },
|
|
||||||
{ en_Cancel, CLI_NAME_PREFIX "Cancel" },
|
|
||||||
{ en_Transact, CLI_NAME_PREFIX "Transact" },
|
|
||||||
|
|
||||||
{ en_Disconnect, CLI_NAME_PREFIX "Disconnect" },
|
|
||||||
{ en_FreeConnect, CLI_NAME_PREFIX "FreeConnect" },
|
|
||||||
{ en_FreeEnv, CLI_NAME_PREFIX "FreeEnv" },
|
|
||||||
|
|
||||||
{ en_NullProc, NULL }
|
|
||||||
};
|
|
160
src/iodbc/henv.h
160
src/iodbc/henv.h
@@ -1,160 +0,0 @@
|
|||||||
/*
|
|
||||||
* henv.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Environment object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _HENV_H
|
|
||||||
#define _HENV_H
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#ifndef SYSERR
|
|
||||||
#define SYSERR -1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
en_AllocHandle = SQL_API_SQLALLOCHANDLE,
|
|
||||||
en_FreeHandle = SQL_API_SQLFREEHANDLE,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
en_AllocEnv = SQL_API_SQLALLOCENV,
|
|
||||||
en_AllocConnect = SQL_API_SQLALLOCCONNECT,
|
|
||||||
en_Connect = SQL_API_SQLCONNECT,
|
|
||||||
en_DriverConnect = SQL_API_SQLDRIVERCONNECT,
|
|
||||||
en_BrowseConnect = SQL_API_SQLBROWSECONNECT,
|
|
||||||
|
|
||||||
en_DataSources = SQL_API_SQLDATASOURCES,
|
|
||||||
en_Drivers = SQL_API_SQLDRIVERS,
|
|
||||||
en_GetInfo = SQL_API_SQLGETINFO,
|
|
||||||
en_GetFunctions = SQL_API_SQLGETFUNCTIONS,
|
|
||||||
en_GetTypeInfo = SQL_API_SQLGETTYPEINFO,
|
|
||||||
|
|
||||||
en_SetConnectOption = SQL_API_SQLSETCONNECTOPTION,
|
|
||||||
en_GetConnectOption = SQL_API_SQLGETCONNECTOPTION,
|
|
||||||
en_SetStmtOption = SQL_API_SQLSETSTMTOPTION,
|
|
||||||
en_GetStmtOption = SQL_API_SQLGETSTMTOPTION,
|
|
||||||
|
|
||||||
en_AllocStmt = SQL_API_SQLALLOCSTMT,
|
|
||||||
en_Prepare = SQL_API_SQLPREPARE,
|
|
||||||
en_BindParameter = SQL_API_SQLBINDPARAMETER,
|
|
||||||
en_ParamOptions = SQL_API_SQLPARAMOPTIONS,
|
|
||||||
en_GetCursorName = SQL_API_SQLGETCURSORNAME,
|
|
||||||
en_SetCursorName = SQL_API_SQLSETCURSORNAME,
|
|
||||||
en_SetScrollOptions = SQL_API_SQLSETSCROLLOPTIONS,
|
|
||||||
en_SetParam = SQL_API_SQLSETPARAM,
|
|
||||||
|
|
||||||
en_Execute = SQL_API_SQLEXECUTE,
|
|
||||||
en_ExecDirect = SQL_API_SQLEXECDIRECT,
|
|
||||||
en_NativeSql = SQL_API_SQLNATIVESQL,
|
|
||||||
en_DescribeParam = SQL_API_SQLDESCRIBEPARAM,
|
|
||||||
en_NumParams = SQL_API_SQLNUMPARAMS,
|
|
||||||
en_ParamData = SQL_API_SQLPARAMDATA,
|
|
||||||
en_PutData = SQL_API_SQLPUTDATA,
|
|
||||||
|
|
||||||
en_RowCount = SQL_API_SQLROWCOUNT,
|
|
||||||
en_NumResultCols = SQL_API_SQLNUMRESULTCOLS,
|
|
||||||
en_DescribeCol = SQL_API_SQLDESCRIBECOL,
|
|
||||||
en_ColAttributes = SQL_API_SQLCOLATTRIBUTES,
|
|
||||||
en_BindCol = SQL_API_SQLBINDCOL,
|
|
||||||
en_Fetch = SQL_API_SQLFETCH,
|
|
||||||
en_ExtendedFetch = SQL_API_SQLEXTENDEDFETCH,
|
|
||||||
en_GetData = SQL_API_SQLGETDATA,
|
|
||||||
en_SetPos = SQL_API_SQLSETPOS,
|
|
||||||
en_MoreResults = SQL_API_SQLMORERESULTS,
|
|
||||||
en_Error = SQL_API_SQLERROR,
|
|
||||||
|
|
||||||
en_ColumnPrivileges = SQL_API_SQLCOLUMNPRIVILEGES,
|
|
||||||
en_Columns = SQL_API_SQLCOLUMNS,
|
|
||||||
en_ForeignKeys = SQL_API_SQLFOREIGNKEYS,
|
|
||||||
en_PrimaryKeys = SQL_API_SQLPRIMARYKEYS,
|
|
||||||
en_ProcedureColumns = SQL_API_SQLPROCEDURECOLUMNS,
|
|
||||||
en_Procedures = SQL_API_SQLPROCEDURES,
|
|
||||||
en_SpecialColumns = SQL_API_SQLSPECIALCOLUMNS,
|
|
||||||
en_Statistics = SQL_API_SQLSTATISTICS,
|
|
||||||
en_TablePrivileges = SQL_API_SQLTABLEPRIVILEGES,
|
|
||||||
en_Tables = SQL_API_SQLTABLES,
|
|
||||||
|
|
||||||
en_FreeStmt = SQL_API_SQLFREESTMT,
|
|
||||||
en_Cancel = SQL_API_SQLCANCEL,
|
|
||||||
en_Transact = SQL_API_SQLTRANSACT,
|
|
||||||
|
|
||||||
en_Disconnect = SQL_API_SQLDISCONNECT,
|
|
||||||
en_FreeConnect = SQL_API_SQLFREECONNECT,
|
|
||||||
en_FreeEnv = SQL_API_SQLFREEENV,
|
|
||||||
|
|
||||||
en_NullProc = SYSERR
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int type; /* must be 1st field */
|
|
||||||
|
|
||||||
HENV henv; /* driver's env list */
|
|
||||||
HDBC hdbc; /* driver's dbc list */
|
|
||||||
HERR herr; /* err list */
|
|
||||||
int state;
|
|
||||||
}
|
|
||||||
GENV_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
HENV next; /* next attached env handle */
|
|
||||||
int refcount; /* Driver's bookkeeping reference count */
|
|
||||||
HPROC dllproc_tab[SQL_EXT_API_LAST + 1]; /* driver api calls */
|
|
||||||
|
|
||||||
HENV dhenv; /* driver env handle */
|
|
||||||
HDLL hdll; /* drvier share library handle */
|
|
||||||
}
|
|
||||||
ENV_t;
|
|
||||||
|
|
||||||
/* Note:
|
|
||||||
|
|
||||||
* - ODBC applications only know about global environment handle,
|
|
||||||
* a void pointer points to a GENV_t object. There is only one
|
|
||||||
* this object per process(however, to make the library reentrant,
|
|
||||||
* we still keep this object on heap). Applications only know
|
|
||||||
* address of this object and needn't care about its detail.
|
|
||||||
*
|
|
||||||
* - ODBC driver manager knows about instance environment handles,
|
|
||||||
* void pointers point to ENV_t objects. There are maybe more
|
|
||||||
* than one this kind of objects per process. However, multiple
|
|
||||||
* connections to a same data source(i.e. call same share library)
|
|
||||||
* will share one instance environment object.
|
|
||||||
*
|
|
||||||
* - ODBC drvier manager knows about their own environemnt handle,
|
|
||||||
* a void pointer point to a driver defined object. Every driver
|
|
||||||
* keeps one of its own environment object and driver manager
|
|
||||||
* keeps address of it by the 'dhenv' field in the instance
|
|
||||||
* environment object without care about its detail.
|
|
||||||
*
|
|
||||||
* - Applications can get driver's environment object handle by
|
|
||||||
* SQLGetInfo() with fInfoType equals to SQL_DRIVER_HENV
|
|
||||||
*/
|
|
||||||
#endif
|
|
378
src/iodbc/herr.c
378
src/iodbc/herr.c
@@ -1,378 +0,0 @@
|
|||||||
/*
|
|
||||||
* herr.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Error stack management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#include "herr.ci"
|
|
||||||
|
|
||||||
static HERR
|
|
||||||
_iodbcdm_popsqlerr (HERR herr)
|
|
||||||
{
|
|
||||||
sqlerr_t *list = (sqlerr_t *) herr;
|
|
||||||
sqlerr_t *next;
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR)
|
|
||||||
{
|
|
||||||
return herr;
|
|
||||||
}
|
|
||||||
|
|
||||||
next = list->next;
|
|
||||||
|
|
||||||
MEM_FREE (list);
|
|
||||||
|
|
||||||
return next;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
_iodbcdm_freesqlerrlist (HERR herrlist)
|
|
||||||
{
|
|
||||||
HERR list;
|
|
||||||
|
|
||||||
for (list = herrlist; list != 0;)
|
|
||||||
{
|
|
||||||
list = _iodbcdm_popsqlerr (list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HERR
|
|
||||||
_iodbcdm_pushsqlerr (
|
|
||||||
HERR herr,
|
|
||||||
sqlstcode_t code,
|
|
||||||
char *msg)
|
|
||||||
{
|
|
||||||
sqlerr_t *ebuf;
|
|
||||||
sqlerr_t *perr = (sqlerr_t *) herr;
|
|
||||||
int idx = 0;
|
|
||||||
|
|
||||||
if (herr != SQL_NULL_HERR)
|
|
||||||
{
|
|
||||||
idx = perr->idx + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idx == 64)
|
|
||||||
/* over wirte the top entry to prevent error stack blow out */
|
|
||||||
{
|
|
||||||
perr->code = code;
|
|
||||||
perr->msg = msg;
|
|
||||||
|
|
||||||
return herr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ebuf = (sqlerr_t *) MEM_ALLOC (sizeof (sqlerr_t));
|
|
||||||
|
|
||||||
if (ebuf == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ebuf->msg = msg;
|
|
||||||
ebuf->code = code;
|
|
||||||
ebuf->idx = idx;
|
|
||||||
ebuf->next = (sqlerr_t *) herr;
|
|
||||||
|
|
||||||
return (HERR) ebuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char FAR *
|
|
||||||
_iodbcdm_getsqlstate (
|
|
||||||
HERR herr,
|
|
||||||
void FAR * tab)
|
|
||||||
{
|
|
||||||
sqlerr_t *perr = (sqlerr_t *) herr;
|
|
||||||
sqlerrmsg_t *ptr;
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR || tab == NULL)
|
|
||||||
{
|
|
||||||
return (char FAR *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ptr = tab;
|
|
||||||
ptr->code != en_sqlstat_total;
|
|
||||||
ptr++)
|
|
||||||
{
|
|
||||||
if (ptr->code == perr->code)
|
|
||||||
{
|
|
||||||
return (char FAR *) (ptr->stat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (char FAR *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char FAR *
|
|
||||||
_iodbcdm_getsqlerrmsg (
|
|
||||||
HERR herr,
|
|
||||||
void FAR * errtab)
|
|
||||||
{
|
|
||||||
sqlerr_t *perr = (sqlerr_t *) herr;
|
|
||||||
sqlerrmsg_t *ptr;
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (perr->msg == NULL && errtab == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (perr->msg != NULL)
|
|
||||||
{
|
|
||||||
return perr->msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ptr = (sqlerrmsg_t *) errtab;
|
|
||||||
ptr->code != en_sqlstat_total;
|
|
||||||
ptr++)
|
|
||||||
{
|
|
||||||
if (ptr->code == perr->code)
|
|
||||||
{
|
|
||||||
return (char FAR *) ptr->msg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (char FAR *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLError (
|
|
||||||
HENV henv,
|
|
||||||
HDBC hdbc,
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szSqlstate,
|
|
||||||
SDWORD FAR * pfNativeError,
|
|
||||||
UCHAR FAR * szErrorMsg,
|
|
||||||
SWORD cbErrorMsgMax,
|
|
||||||
SWORD FAR * pcbErrorMsg)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t FAR *) henv;
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HDBC thdbc;
|
|
||||||
|
|
||||||
HENV dhenv = SQL_NULL_HENV;
|
|
||||||
HDBC dhdbc = SQL_NULL_HDBC;
|
|
||||||
HSTMT dhstmt = SQL_NULL_HSTMT;
|
|
||||||
|
|
||||||
HERR herr = SQL_NULL_HERR;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
|
|
||||||
char FAR *errmsg = NULL;
|
|
||||||
char FAR *ststr = NULL;
|
|
||||||
|
|
||||||
int handle = 0;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
if (hstmt != SQL_NULL_HSTMT) /* retrive stmt err */
|
|
||||||
{
|
|
||||||
herr = pstmt->herr;
|
|
||||||
thdbc = pstmt->hdbc;
|
|
||||||
|
|
||||||
if (thdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
hproc = _iodbcdm_getproc (thdbc, en_Error);
|
|
||||||
dhstmt = pstmt->dhstmt;
|
|
||||||
handle = 3;
|
|
||||||
}
|
|
||||||
else if (hdbc != SQL_NULL_HDBC) /* retrive dbc err */
|
|
||||||
{
|
|
||||||
herr = pdbc->herr;
|
|
||||||
thdbc = hdbc;
|
|
||||||
if (thdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
hproc = _iodbcdm_getproc (thdbc, en_Error);
|
|
||||||
dhdbc = pdbc->dhdbc;
|
|
||||||
handle = 2;
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR
|
|
||||||
&& pdbc->henv == SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (henv != SQL_NULL_HENV) /* retrive env err */
|
|
||||||
{
|
|
||||||
herr = genv->herr;
|
|
||||||
|
|
||||||
/* Drivers shouldn't push error message
|
|
||||||
* on envoriment handle */
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR)
|
|
||||||
{
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (szErrorMsg != NULL)
|
|
||||||
{
|
|
||||||
if (cbErrorMsgMax < 0
|
|
||||||
|| cbErrorMsgMax > SQL_MAX_MESSAGE_LENGTH - 1)
|
|
||||||
{
|
|
||||||
return SQL_ERROR;
|
|
||||||
/* SQLError() doesn't post error for itself */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (herr == SQL_NULL_HERR) /* no err on drv mng */
|
|
||||||
{
|
|
||||||
/* call driver */
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (thdbc, retcode, hproc, en_Error,
|
|
||||||
(dhenv, dhdbc, dhstmt, szSqlstate, pfNativeError, szErrorMsg,
|
|
||||||
cbErrorMsgMax, pcbErrorMsg))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (szSqlstate != NULL)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/* get sql state string */
|
|
||||||
ststr = (char FAR *) _iodbcdm_getsqlstate (herr,
|
|
||||||
(void FAR *) sqlerrmsg_tab);
|
|
||||||
|
|
||||||
if (ststr == NULL)
|
|
||||||
{
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
len = (int) STRLEN (ststr);
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY (szSqlstate, ststr, len);
|
|
||||||
szSqlstate[len] = 0;
|
|
||||||
/* buffer size of szSqlstate is not checked. Applications
|
|
||||||
* suppose provide enough ( not less than 6 bytes ) buffer
|
|
||||||
* or NULL for it.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pfNativeError != NULL)
|
|
||||||
{
|
|
||||||
/* native error code is specific to data source */
|
|
||||||
*pfNativeError = (SDWORD) 0L;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (szErrorMsg == NULL || cbErrorMsgMax == 0)
|
|
||||||
{
|
|
||||||
if (pcbErrorMsg != NULL)
|
|
||||||
{
|
|
||||||
*pcbErrorMsg = (SWORD) 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char msgbuf[256] = {'\0'};
|
|
||||||
|
|
||||||
/* get sql state message */
|
|
||||||
errmsg = _iodbcdm_getsqlerrmsg (herr, (void FAR *) sqlerrmsg_tab);
|
|
||||||
|
|
||||||
if (errmsg == NULL)
|
|
||||||
{
|
|
||||||
errmsg = (char FAR *) "";
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf (msgbuf, "%s%s", sqlerrhd, errmsg);
|
|
||||||
|
|
||||||
len = STRLEN (msgbuf);
|
|
||||||
|
|
||||||
if (len < cbErrorMsgMax - 1)
|
|
||||||
{
|
|
||||||
retcode = SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
len = cbErrorMsgMax - 1;
|
|
||||||
retcode = SQL_SUCCESS_WITH_INFO;
|
|
||||||
/* and not posts error for itself */
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY ((char *) szErrorMsg, msgbuf, len);
|
|
||||||
szErrorMsg[len] = 0;
|
|
||||||
|
|
||||||
if (pcbErrorMsg != NULL)
|
|
||||||
{
|
|
||||||
*pcbErrorMsg = (SWORD) len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (handle) /* free this err */
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
genv->herr = _iodbcdm_popsqlerr (genv->herr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
pdbc->herr = _iodbcdm_popsqlerr (pdbc->herr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
pstmt->herr = _iodbcdm_popsqlerr (pstmt->herr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
@@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* herr.ci
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Error messages
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const sqlerrmsg_t sqlerrmsg_tab[] =
|
|
||||||
{
|
|
||||||
{ en_00000, "00000", "" },
|
|
||||||
{ en_01000, "01000", "General warning" },
|
|
||||||
{ en_01002, "01002", "Disconnect error" },
|
|
||||||
{ en_01004, "01004", "Data truncated" },
|
|
||||||
{ en_01006, "01006", "Privilege not revoked" },
|
|
||||||
{ en_01S00, "01S00", "Invalid connection string attribute" },
|
|
||||||
{ en_01S01, "01S01", "Error in row" },
|
|
||||||
{ en_01S02, "01S02", "Optional value changed" },
|
|
||||||
{ en_01S03, "01S03", "No rows updated or deleted" },
|
|
||||||
{ en_01S04, "01S04", "More than one row updated or deleted" },
|
|
||||||
{ en_07001, "07001", "Wrong number of parameters" },
|
|
||||||
{ en_07006, "07006", "Restricted data type attribute violation" },
|
|
||||||
{ en_08001, "08001", "Unable to connect to data source" },
|
|
||||||
{ en_08002, "08002", "Connection in use" },
|
|
||||||
{ en_08003, "08003", "Connect not open" },
|
|
||||||
{ en_08004, "08004", "Data source rejected establishment of connection" },
|
|
||||||
{ en_08007, "08007", "Connection failure during transaction" },
|
|
||||||
{ en_08S01, "08S01", "Communication link failure" },
|
|
||||||
{ en_21S01, "21S01", "Insert value list does not match" },
|
|
||||||
{ en_21S02, "21S02", "Degree of derived table does not match column list" },
|
|
||||||
{ en_22001, "22001", "String data right truncation" },
|
|
||||||
{ en_22003, "22003", "Numeric value out of range" },
|
|
||||||
{ en_22005, "22005", "Error in assignment" },
|
|
||||||
{ en_22008, "22008", "Datetime field overflow" },
|
|
||||||
{ en_22012, "22012", "Division by zero" },
|
|
||||||
{ en_22026, "22026", "String data, length mismatch" },
|
|
||||||
{ en_23000, "23000", "Integrity constraint violation" },
|
|
||||||
{ en_24000, "24000", "Invalid cursor state" },
|
|
||||||
{ en_25000, "25000", "Invalid transaction state" },
|
|
||||||
{ en_28000, "28000", "Invalid authorization specification" },
|
|
||||||
{ en_34000, "34000", "Invalid cursor name" },
|
|
||||||
{ en_37000, "37000", "Syntex error or access violation" },
|
|
||||||
{ en_3C000, "3C000", "Duplicate cursor name" },
|
|
||||||
{ en_40001, "40001", "Serialization failure" },
|
|
||||||
{ en_42000, "42000", "Syntax error or access violation" },
|
|
||||||
{ en_70100, "70100", "Operation aborted" },
|
|
||||||
{ en_IM001, "IM001", "Driver does not support this function" },
|
|
||||||
{ en_IM002, "IM002", "Data source name not found and no default "
|
|
||||||
"driver specified. Driver could not be loaded" },
|
|
||||||
{ en_IM003, "IM003", "Specified driver could not be loaded" },
|
|
||||||
{ en_IM004, "IM004", "Driver's SQLAllocEnv() failed" },
|
|
||||||
{ en_IM005, "IM005", "Driver's SQLAllocConnect() failed" },
|
|
||||||
{ en_IM006, "IM006", "Driver's SQLSetConnectOption failed" },
|
|
||||||
{ en_IM007, "IM007", "No data source or driver specified, dialog prohibited" },
|
|
||||||
{ en_IM008, "IM008", "Dialog failed" },
|
|
||||||
{ en_IM009, "IM009", "Unable to load translation DLL" },
|
|
||||||
{ en_IM010, "IM010", "Data source name too long" },
|
|
||||||
{ en_IM011, "IM011", "Driver name too long" },
|
|
||||||
{ en_IM012, "IM012", "DRIVER keyword syntax error" },
|
|
||||||
{ en_IM013, "IM013", "Trace file error" },
|
|
||||||
{ en_IM014, "IM014", "Try to change tracing file while tracing is on" },
|
|
||||||
{ en_S0001, "S0001", "Base table or view already exists" },
|
|
||||||
{ en_S0002, "S0002", "Base table not found" },
|
|
||||||
{ en_S0011, "S0011", "Index already exists" },
|
|
||||||
{ en_S0012, "S0012", "Index not found" },
|
|
||||||
{ en_S0021, "S0021", "Column already exists" },
|
|
||||||
{ en_S0022, "S0022", "Column not found" },
|
|
||||||
{ en_S0023, "S0023", "No default for column" },
|
|
||||||
{ en_S1000, "S1000", "General error" },
|
|
||||||
{ en_S1001, "S1001", "Memory allocation failure" },
|
|
||||||
{ en_S1002, "S1002", "Invalid column number" },
|
|
||||||
{ en_S1003, "S1003", "Program type out of range" },
|
|
||||||
{ en_S1004, "S1004", "SQL data type out of range" },
|
|
||||||
{ en_S1008, "S1008", "Operation canceled" },
|
|
||||||
{ en_S1009, "S1009", "Invalid argument value" },
|
|
||||||
{ en_S1010, "S1010", "Function sequence error" },
|
|
||||||
{ en_S1011, "S1011", "Operation invalid at this time" },
|
|
||||||
{ en_S1012, "S1012", "Invalid transaction operation code specified" },
|
|
||||||
{ en_S1015, "S1015", "No cursor name available" },
|
|
||||||
{ en_S1090, "S1090", "Invalid string or buffer length" },
|
|
||||||
{ en_S1091, "S1091", "Descriptor type out of range" },
|
|
||||||
{ en_S1092, "S1092", "Option type out of range" },
|
|
||||||
{ en_S1093, "S1093", "Invalid parameter" },
|
|
||||||
{ en_S1094, "S1094", "Invalid scale value" },
|
|
||||||
{ en_S1095, "S1095", "Function type out of range" },
|
|
||||||
{ en_S1096, "S1096", "Information type out of range" },
|
|
||||||
{ en_S1097, "S1097", "Column type out of range" },
|
|
||||||
{ en_S1098, "S1098", "Scope type out of range" },
|
|
||||||
{ en_S1099, "S1099", "Nullable type out of range" },
|
|
||||||
{ en_S1100, "S1100", "Uniquenss option type out of range" },
|
|
||||||
{ en_S1101, "S1101", "Accuracy option type out of range" },
|
|
||||||
{ en_S1103, "S1103", "Direction option out of range" },
|
|
||||||
{ en_S1104, "S1104", "Invalid precision value" },
|
|
||||||
{ en_S1105, "S1105", "Invalid parameter type" },
|
|
||||||
{ en_S1106, "S1106", "Fetch type out of range" },
|
|
||||||
{ en_S1107, "S1107", "Row value out of range" },
|
|
||||||
{ en_S1108, "S1108", "Concurrency option out of range" },
|
|
||||||
{ en_S1109, "S1109", "Invalid cursor position" },
|
|
||||||
{ en_S1110, "S1110", "Invalid driver completion" },
|
|
||||||
{ en_S1111, "S1111", "Invalid bookmark value" },
|
|
||||||
{ en_S1C00, "S1C00", "Driver not capable" },
|
|
||||||
{ en_S1T00, "S1T00", "Timeout expired" },
|
|
||||||
{ en_sqlstat_total, NULL, NULL }
|
|
||||||
};
|
|
||||||
|
|
||||||
static char FAR* sqlerrhd = "[iODBC][Driver Manager]";
|
|
153
src/iodbc/herr.h
153
src/iodbc/herr.h
@@ -1,153 +0,0 @@
|
|||||||
/*
|
|
||||||
* herr.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Error stack management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _HERR_H
|
|
||||||
#define _HERR_H
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
en_00000 = 0,
|
|
||||||
en_01000,
|
|
||||||
en_01002,
|
|
||||||
en_01004,
|
|
||||||
en_01006,
|
|
||||||
en_01S00,
|
|
||||||
en_01S01,
|
|
||||||
en_01S02,
|
|
||||||
en_01S03,
|
|
||||||
en_01S04,
|
|
||||||
en_07001,
|
|
||||||
en_07006,
|
|
||||||
en_08001,
|
|
||||||
en_08002,
|
|
||||||
en_08003,
|
|
||||||
en_08004,
|
|
||||||
en_08007,
|
|
||||||
en_08S01,
|
|
||||||
en_21S01,
|
|
||||||
en_21S02,
|
|
||||||
en_22001,
|
|
||||||
en_22003,
|
|
||||||
en_22005,
|
|
||||||
en_22008,
|
|
||||||
en_22012,
|
|
||||||
en_22026,
|
|
||||||
en_23000,
|
|
||||||
en_24000,
|
|
||||||
en_25000,
|
|
||||||
en_28000,
|
|
||||||
en_34000,
|
|
||||||
en_37000,
|
|
||||||
en_3C000,
|
|
||||||
en_40001,
|
|
||||||
en_42000,
|
|
||||||
en_70100,
|
|
||||||
en_IM001,
|
|
||||||
en_IM002,
|
|
||||||
en_IM003,
|
|
||||||
en_IM004,
|
|
||||||
en_IM005,
|
|
||||||
en_IM006,
|
|
||||||
en_IM007,
|
|
||||||
en_IM008,
|
|
||||||
en_IM009,
|
|
||||||
en_IM010,
|
|
||||||
en_IM011,
|
|
||||||
en_IM012,
|
|
||||||
en_IM013,
|
|
||||||
en_IM014,
|
|
||||||
en_S0001,
|
|
||||||
en_S0002,
|
|
||||||
en_S0011,
|
|
||||||
en_S0012,
|
|
||||||
en_S0021,
|
|
||||||
en_S0022,
|
|
||||||
en_S0023,
|
|
||||||
en_S1000,
|
|
||||||
en_S1001,
|
|
||||||
en_S1002,
|
|
||||||
en_S1003,
|
|
||||||
en_S1004,
|
|
||||||
en_S1008,
|
|
||||||
en_S1009,
|
|
||||||
en_S1010,
|
|
||||||
en_S1011,
|
|
||||||
en_S1012,
|
|
||||||
en_S1015,
|
|
||||||
en_S1090,
|
|
||||||
en_S1091,
|
|
||||||
en_S1092,
|
|
||||||
en_S1093,
|
|
||||||
en_S1094,
|
|
||||||
en_S1095,
|
|
||||||
en_S1096,
|
|
||||||
en_S1097,
|
|
||||||
en_S1098,
|
|
||||||
en_S1099,
|
|
||||||
en_S1100,
|
|
||||||
en_S1101,
|
|
||||||
en_S1103,
|
|
||||||
en_S1104,
|
|
||||||
en_S1105,
|
|
||||||
en_S1106,
|
|
||||||
en_S1107,
|
|
||||||
en_S1108,
|
|
||||||
en_S1109,
|
|
||||||
en_S1110,
|
|
||||||
en_S1111,
|
|
||||||
en_S1C00,
|
|
||||||
en_S1T00,
|
|
||||||
en_sqlstat_total
|
|
||||||
}
|
|
||||||
sqlstcode_t;
|
|
||||||
|
|
||||||
typedef void FAR *HERR;
|
|
||||||
#define SQL_NULL_HERR ((HERR)NULL)
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
sqlstcode_t code;
|
|
||||||
char FAR *stat;
|
|
||||||
char FAR *msg;
|
|
||||||
}
|
|
||||||
sqlerrmsg_t;
|
|
||||||
|
|
||||||
typedef struct sqlerr
|
|
||||||
{
|
|
||||||
sqlstcode_t code;
|
|
||||||
int idx;
|
|
||||||
char FAR *msg;
|
|
||||||
struct sqlerr *next;
|
|
||||||
}
|
|
||||||
sqlerr_t;
|
|
||||||
|
|
||||||
extern void _iodbcdm_freesqlerrlist (HERR herr);
|
|
||||||
extern HERR _iodbcdm_pushsqlerr (HERR list, sqlstcode_t code, char *sysmsg);
|
|
||||||
|
|
||||||
#define PUSHSYSERR(list, msg) \
|
|
||||||
list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), 0, (char*)msg )
|
|
||||||
#define PUSHSQLERR(list, code) \
|
|
||||||
list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), (int)(code), NULL )
|
|
||||||
#endif /* _SQLERR_H */
|
|
@@ -1,600 +0,0 @@
|
|||||||
/*
|
|
||||||
* hstmt.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Query statement object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLAllocStmt (
|
|
||||||
HDBC hdbc,
|
|
||||||
HSTMT FAR * phstmt)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
STMT_t FAR *pstmt = NULL;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
if (hdbc == SQL_NULL_HDBC || pdbc->type != SQL_HANDLE_DBC)
|
|
||||||
#else
|
|
||||||
if (hdbc == SQL_NULL_HDBC)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (phstmt == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
switch (pdbc->state)
|
|
||||||
{
|
|
||||||
case en_dbc_connected:
|
|
||||||
case en_dbc_hstmt:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_dbc_allocated:
|
|
||||||
case en_dbc_needdata:
|
|
||||||
PUSHSQLERR (pdbc->herr, en_08003);
|
|
||||||
*phstmt = SQL_NULL_HSTMT;
|
|
||||||
return SQL_ERROR;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pstmt = (STMT_t FAR *) MEM_ALLOC (sizeof (STMT_t));
|
|
||||||
|
|
||||||
if (pstmt == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1001);
|
|
||||||
*phstmt = SQL_NULL_HSTMT;
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
pstmt->type = SQL_HANDLE_STMT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* initiate the object */
|
|
||||||
pstmt->herr = SQL_NULL_HERR;
|
|
||||||
pstmt->hdbc = hdbc;
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
|
|
||||||
/* call driver's function */
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_AllocHandle);
|
|
||||||
|
|
||||||
if (hproc)
|
|
||||||
{
|
|
||||||
CALL_DRIVER (pstmt->hdbc, hdbc, retcode, hproc, en_AllocHandle,
|
|
||||||
(SQL_HANDLE_STMT, pdbc->dhdbc, &(pstmt->dhstmt)))
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_AllocStmt);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
*phstmt = SQL_NULL_HSTMT;
|
|
||||||
MEM_FREE (pstmt);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_AllocStmt,
|
|
||||||
(pdbc->dhdbc, &(pstmt->dhstmt)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
*phstmt = SQL_NULL_HSTMT;
|
|
||||||
MEM_FREE (pstmt);
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* insert into list */
|
|
||||||
pstmt->next = pdbc->hstmt;
|
|
||||||
pdbc->hstmt = pstmt;
|
|
||||||
|
|
||||||
*phstmt = (HSTMT) pstmt;
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
pdbc->state = en_dbc_hstmt;
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE
|
|
||||||
_iodbcdm_dropstmt (HSTMT hstmt)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
STMT_t FAR *tpstmt;
|
|
||||||
DBC_t FAR *pdbc;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc = (DBC_t FAR *) (pstmt->hdbc);
|
|
||||||
|
|
||||||
for (tpstmt = (STMT_t FAR *) pdbc->hstmt;
|
|
||||||
tpstmt != NULL;
|
|
||||||
tpstmt = tpstmt->next)
|
|
||||||
{
|
|
||||||
if (tpstmt == pstmt)
|
|
||||||
{
|
|
||||||
pdbc->hstmt = (HSTMT) pstmt->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tpstmt->next == pstmt)
|
|
||||||
{
|
|
||||||
tpstmt->next = pstmt->next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tpstmt == NULL)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
_iodbcdm_freesqlerrlist (pstmt->herr);
|
|
||||||
MEM_FREE (hstmt);
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLFreeStmt (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fOption)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
STMT_t FAR *tpstmt;
|
|
||||||
DBC_t FAR *pdbc;
|
|
||||||
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdbc = (DBC_t FAR *) (pstmt->hdbc);
|
|
||||||
|
|
||||||
/* check option */
|
|
||||||
switch (fOption)
|
|
||||||
{
|
|
||||||
case SQL_DROP:
|
|
||||||
case SQL_CLOSE:
|
|
||||||
case SQL_UNBIND:
|
|
||||||
case SQL_RESET_PARAMS:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1092);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = SQL_NULL_HPROC;
|
|
||||||
|
|
||||||
#if (ODBCVER >= 0x0300)
|
|
||||||
if (fOption == SQL_DROP)
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeHandle);
|
|
||||||
|
|
||||||
if (hproc)
|
|
||||||
{
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeHandle,
|
|
||||||
(SQL_HANDLE_STMT, pstmt->dhstmt))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeStmt);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeStmt,
|
|
||||||
(pstmt->dhstmt, fOption))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retcode != SQL_SUCCESS
|
|
||||||
&& retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
switch (fOption)
|
|
||||||
{
|
|
||||||
case SQL_DROP:
|
|
||||||
/* delet this object (ignore return) */
|
|
||||||
_iodbcdm_dropstmt (hstmt);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_CLOSE:
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_no;
|
|
||||||
/* This means cursor name set by
|
|
||||||
* SQLSetCursorName() call will also
|
|
||||||
* be erased.
|
|
||||||
*/
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state =
|
|
||||||
en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state =
|
|
||||||
en_stmt_allocated;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_UNBIND:
|
|
||||||
case SQL_RESET_PARAMS:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetStmtOption (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fOption,
|
|
||||||
UDWORD vParam)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check option */
|
|
||||||
if ( /* fOption < SQL_STMT_OPT_MIN || */
|
|
||||||
fOption > SQL_STMT_OPT_MAX)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1092);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fOption == SQL_CONCURRENCY
|
|
||||||
|| fOption == SQL_CURSOR_TYPE
|
|
||||||
|| fOption == SQL_SIMULATE_CURSOR
|
|
||||||
|| fOption == SQL_USE_BOOKMARKS)
|
|
||||||
{
|
|
||||||
if (pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1011;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
sqlstat = en_S1011;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1011;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
if (!pstmt->prep_state)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pstmt->state >= en_stmt_needdata)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetStmtOption);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetStmtOption,
|
|
||||||
(pstmt->dhstmt, fOption, vParam))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetStmtOption (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fOption,
|
|
||||||
PTR pvParam)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check option */
|
|
||||||
if ( /* fOption < SQL_STMT_OPT_MIN || */
|
|
||||||
fOption > SQL_STMT_OPT_MAX)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1092);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state >= en_stmt_needdata
|
|
||||||
|| pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
if (fOption == SQL_ROW_NUMBER || fOption == SQL_GET_BOOKMARK)
|
|
||||||
{
|
|
||||||
sqlstat = en_24000;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetStmtOption);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetStmtOption,
|
|
||||||
(pstmt->dhstmt, fOption, pvParam))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLCancel (HSTMT hstmt)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
/* check state */
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Cancel);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Cancel,
|
|
||||||
(pstmt->dhstmt))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_allocated:
|
|
||||||
case en_stmt_prepared:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_executed:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (pstmt->prep_state)
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
switch (pstmt->need_on)
|
|
||||||
{
|
|
||||||
case en_ExecDirect:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_Execute:
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_SetPos:
|
|
||||||
pstmt->state = en_stmt_xfetched;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pstmt->need_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
@@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* hstmt.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Query statement object management functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _HSTMT_H
|
|
||||||
#define _HSTMT_H
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
typedef struct STMT
|
|
||||||
{
|
|
||||||
int type; /* must be 1st field */
|
|
||||||
|
|
||||||
struct STMT *next;
|
|
||||||
|
|
||||||
HERR herr;
|
|
||||||
HDBC hdbc; /* back point to connection object */
|
|
||||||
HSTMT dhstmt; /* driver's stmt handle */
|
|
||||||
|
|
||||||
int state;
|
|
||||||
int cursor_state;
|
|
||||||
int prep_state;
|
|
||||||
int asyn_on; /* async executing which odbc call */
|
|
||||||
int need_on; /* which call return SQL_NEED_DATA */
|
|
||||||
}
|
|
||||||
STMT_t;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
en_stmt_allocated = 0,
|
|
||||||
en_stmt_prepared,
|
|
||||||
en_stmt_executed,
|
|
||||||
en_stmt_cursoropen,
|
|
||||||
en_stmt_fetched,
|
|
||||||
en_stmt_xfetched,
|
|
||||||
en_stmt_needdata, /* not call SQLParamData() yet */
|
|
||||||
en_stmt_mustput, /* not call SQLPutData() yet */
|
|
||||||
en_stmt_canput /* SQLPutData() called */
|
|
||||||
}; /* for statement handle state */
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
en_stmt_cursor_no = 0,
|
|
||||||
en_stmt_cursor_named,
|
|
||||||
en_stmt_cursor_opened,
|
|
||||||
en_stmt_cursor_fetched,
|
|
||||||
en_stmt_cursor_xfetched
|
|
||||||
}; /* for statement cursor state */
|
|
||||||
|
|
||||||
extern RETCODE _iodbcdm_dropstmt ();
|
|
||||||
#endif
|
|
521
src/iodbc/info.c
521
src/iodbc/info.c
@@ -1,521 +0,0 @@
|
|||||||
/*
|
|
||||||
* info.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Information functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#define SECT1 "ODBC Data Sources"
|
|
||||||
#define SECT2 "Default"
|
|
||||||
#define MAX_ENTRIES 1024
|
|
||||||
|
|
||||||
extern char * _iodbcdm_getinifile (char *buf, int size);
|
|
||||||
extern char * _iodbcdm_getkeyvalbydsn (char *dsn, int dsnlen, char *keywd, char *value, int size);
|
|
||||||
|
|
||||||
static int
|
|
||||||
stricmp (const char *s1, const char *s2)
|
|
||||||
{
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
while (*s1)
|
|
||||||
{
|
|
||||||
if ((cmp = toupper (*s1) - toupper (*s2)) != 0)
|
|
||||||
return cmp;
|
|
||||||
s1++;
|
|
||||||
s2++;
|
|
||||||
}
|
|
||||||
return (*s2) ? -1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
SectSorter (const void *p1, const void *p2)
|
|
||||||
{
|
|
||||||
char **s1 = (char **) p1;
|
|
||||||
char **s2 = (char **) p2;
|
|
||||||
|
|
||||||
return stricmp (*s1, *s2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLDataSources (
|
|
||||||
HENV henv,
|
|
||||||
UWORD fDir,
|
|
||||||
UCHAR FAR * szDSN,
|
|
||||||
SWORD cbDSNMax,
|
|
||||||
SWORD FAR * pcbDSN,
|
|
||||||
UCHAR FAR * szDesc,
|
|
||||||
SWORD cbDescMax,
|
|
||||||
SWORD FAR * pcbDesc)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t FAR *) henv;
|
|
||||||
char *path;
|
|
||||||
char buf[1024];
|
|
||||||
FILE *fp;
|
|
||||||
int i;
|
|
||||||
static int cur_entry = -1;
|
|
||||||
static int num_entries = 0;
|
|
||||||
static char **sect = NULL;
|
|
||||||
|
|
||||||
if (henv == SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
/* check argument */
|
|
||||||
if (cbDSNMax < 0 || cbDescMax < 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
if (fDir != SQL_FETCH_FIRST
|
|
||||||
&& fDir != SQL_FETCH_NEXT)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1103);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
if (cur_entry < 0 || fDir == SQL_FETCH_FIRST)
|
|
||||||
{
|
|
||||||
cur_entry = 0;
|
|
||||||
num_entries = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open the odbc.ini file
|
|
||||||
*/
|
|
||||||
path = (char *) _iodbcdm_getinifile (buf, sizeof (buf));
|
|
||||||
if ((fp = fopen (path, "r")) == NULL)
|
|
||||||
{
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Free old section list
|
|
||||||
*/
|
|
||||||
if (sect)
|
|
||||||
{
|
|
||||||
for (i = 0; i < MAX_ENTRIES; i++)
|
|
||||||
if (sect[i])
|
|
||||||
free (sect[i]);
|
|
||||||
free (sect);
|
|
||||||
}
|
|
||||||
if ((sect = (char **) calloc (MAX_ENTRIES, sizeof (char *))) == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1011);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Build a dynamic list of sections
|
|
||||||
*/
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
char *str, *p;
|
|
||||||
|
|
||||||
str = fgets (buf, sizeof (buf), fp);
|
|
||||||
|
|
||||||
if (str == NULL)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (*str == '[')
|
|
||||||
{
|
|
||||||
str++;
|
|
||||||
for (p = str; *p; p++)
|
|
||||||
if (*p == ']')
|
|
||||||
*p = '\0';
|
|
||||||
|
|
||||||
if (!strcmp (str, SECT1))
|
|
||||||
continue;
|
|
||||||
if (!strcmp (str, SECT2))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add this section to the comma separated list
|
|
||||||
*/
|
|
||||||
if (num_entries >= MAX_ENTRIES)
|
|
||||||
break; /* Skip the rest */
|
|
||||||
|
|
||||||
sect[num_entries++] = (char *) strdup (str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sort all entries so we can present a nice list
|
|
||||||
*/
|
|
||||||
if (num_entries > 1)
|
|
||||||
qsort (sect, num_entries, sizeof (char *), SectSorter);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Try to get to the next item
|
|
||||||
*/
|
|
||||||
if (cur_entry >= num_entries)
|
|
||||||
{
|
|
||||||
cur_entry = 0; /* Next time, start all over again */
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Copy DSN information
|
|
||||||
*/
|
|
||||||
STRNCPY (szDSN, sect[cur_entry], cbDSNMax);
|
|
||||||
/*
|
|
||||||
glt??? pcbDSN = strlen(szDSN);
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* And find the description that goes with this entry
|
|
||||||
*/
|
|
||||||
_iodbcdm_getkeyvalbydsn (sect[cur_entry], strlen (sect[cur_entry]),
|
|
||||||
"Description", (char*) szDesc, cbDescMax);
|
|
||||||
/*
|
|
||||||
glt??? pcbDesc = strlen(szDesc);
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Next record
|
|
||||||
*/
|
|
||||||
cur_entry++;
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLDrivers (
|
|
||||||
HENV henv,
|
|
||||||
UWORD fDir,
|
|
||||||
UCHAR FAR * szDrvDesc,
|
|
||||||
SWORD cbDrvDescMax,
|
|
||||||
SWORD FAR * pcbDrvDesc,
|
|
||||||
UCHAR FAR * szDrvAttr,
|
|
||||||
SWORD cbDrvAttrMax,
|
|
||||||
SWORD FAR * pcbDrvAttr)
|
|
||||||
{
|
|
||||||
GENV_t FAR *genv = (GENV_t FAR *) henv;
|
|
||||||
|
|
||||||
if (henv == SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbDrvDescMax < 0 || cbDrvAttrMax < 0 || cbDrvAttrMax == 1)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fDir != SQL_FETCH_FIRST || fDir != SQL_FETCH_NEXT)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (genv->herr, en_S1103);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************/
|
|
||||||
return SQL_NO_DATA_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetInfo (
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fInfoType,
|
|
||||||
PTR rgbInfoValue,
|
|
||||||
SWORD cbInfoValueMax,
|
|
||||||
SWORD FAR * pcbInfoValue)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
ENV_t FAR *penv;
|
|
||||||
STMT_t FAR *pstmt = NULL;
|
|
||||||
STMT_t FAR *tpstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
DWORD dword;
|
|
||||||
int size = 0, len = 0;
|
|
||||||
char buf[16] = {'\0'};
|
|
||||||
|
|
||||||
if (hdbc == SQL_NULL_HDBC || pdbc->henv == SQL_NULL_HENV)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbInfoValueMax < 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( /* fInfoType < SQL_INFO_FIRST || */
|
|
||||||
(fInfoType > SQL_INFO_LAST
|
|
||||||
&& fInfoType < SQL_INFO_DRIVER_START))
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1096);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fInfoType == SQL_ODBC_VER)
|
|
||||||
{
|
|
||||||
sprintf (buf, "%02d.%02d",
|
|
||||||
(ODBCVER) >> 8, 0x00FF & (ODBCVER));
|
|
||||||
|
|
||||||
|
|
||||||
if (rgbInfoValue != NULL
|
|
||||||
&& cbInfoValueMax > 0)
|
|
||||||
{
|
|
||||||
len = STRLEN (buf);
|
|
||||||
|
|
||||||
if (len < cbInfoValueMax - 1)
|
|
||||||
{
|
|
||||||
len = cbInfoValueMax - 1;
|
|
||||||
PUSHSQLERR (pdbc->herr, en_01004);
|
|
||||||
|
|
||||||
retcode = SQL_SUCCESS_WITH_INFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY (rgbInfoValue, buf, len);
|
|
||||||
((char FAR *) rgbInfoValue)[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcbInfoValue != NULL)
|
|
||||||
{
|
|
||||||
*pcbInfoValue = (SWORD) len;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->state == en_dbc_allocated || pdbc->state == en_dbc_needdata)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_08003);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (fInfoType)
|
|
||||||
{
|
|
||||||
case SQL_DRIVER_HDBC:
|
|
||||||
dword = (DWORD) (pdbc->dhdbc);
|
|
||||||
size = sizeof (dword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_DRIVER_HENV:
|
|
||||||
penv = (ENV_t FAR *) (pdbc->henv);
|
|
||||||
dword = (DWORD) (penv->dhenv);
|
|
||||||
size = sizeof (dword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_DRIVER_HLIB:
|
|
||||||
penv = (ENV_t FAR *) (pdbc->henv);
|
|
||||||
dword = (DWORD) (penv->hdll);
|
|
||||||
size = sizeof (dword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_DRIVER_HSTMT:
|
|
||||||
if (rgbInfoValue != NULL)
|
|
||||||
{
|
|
||||||
pstmt = *((STMT_t FAR **) rgbInfoValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (tpstmt = (STMT_t FAR *) (pdbc->hstmt);
|
|
||||||
tpstmt != NULL;
|
|
||||||
tpstmt = tpstmt->next)
|
|
||||||
{
|
|
||||||
if (tpstmt == pstmt)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tpstmt == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
dword = (DWORD) (pstmt->dhstmt);
|
|
||||||
size = sizeof (dword);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size)
|
|
||||||
{
|
|
||||||
if (rgbInfoValue != NULL)
|
|
||||||
{
|
|
||||||
*((DWORD *) rgbInfoValue) = dword;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcbInfoValue != NULL)
|
|
||||||
{
|
|
||||||
*(pcbInfoValue) = (SWORD) size;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_GetInfo);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_GetInfo,
|
|
||||||
(pdbc->dhdbc, fInfoType, rgbInfoValue, cbInfoValueMax, pcbInfoValue))
|
|
||||||
|
|
||||||
if (retcode == SQL_ERROR
|
|
||||||
&& fInfoType == SQL_DRIVER_ODBC_VER)
|
|
||||||
{
|
|
||||||
STRCPY (buf, "01.00");
|
|
||||||
|
|
||||||
if (rgbInfoValue != NULL
|
|
||||||
&& cbInfoValueMax > 0)
|
|
||||||
{
|
|
||||||
len = STRLEN (buf);
|
|
||||||
|
|
||||||
if (len < cbInfoValueMax - 1)
|
|
||||||
{
|
|
||||||
len = cbInfoValueMax - 1;
|
|
||||||
PUSHSQLERR (pdbc->herr, en_01004);
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY (rgbInfoValue, buf, len);
|
|
||||||
((char FAR *) rgbInfoValue)[len] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pcbInfoValue != NULL)
|
|
||||||
{
|
|
||||||
*pcbInfoValue = (SWORD) len;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* what should we return in this case ???? */
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetFunctions (
|
|
||||||
HDBC hdbc,
|
|
||||||
UWORD fFunc,
|
|
||||||
UWORD FAR * pfExists)
|
|
||||||
{
|
|
||||||
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fFunc > SQL_EXT_API_LAST)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1095);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdbc->state == en_dbc_allocated
|
|
||||||
|| pdbc->state == en_dbc_needdata)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pdbc->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pfExists == NULL)
|
|
||||||
{
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, en_GetFunctions);
|
|
||||||
|
|
||||||
if (hproc != SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
CALL_DRIVER (hdbc, retcode, hproc, en_GetFunctions,
|
|
||||||
(pdbc->dhdbc, fFunc, pfExists))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fFunc == SQL_API_SQLSETPARAM)
|
|
||||||
{
|
|
||||||
fFunc = SQL_API_SQLBINDPARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fFunc != SQL_API_ALL_FUNCTIONS)
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, fFunc);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
*pfExists = (UWORD) 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pfExists = (UWORD) 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (fFunc = 0; fFunc < 100; fFunc++)
|
|
||||||
{
|
|
||||||
hproc = _iodbcdm_getproc (hdbc, fFunc);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
pfExists[fFunc] = (UWORD) 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pfExists[fFunc] = (UWORD) 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
|
||||||
}
|
|
@@ -1,66 +0,0 @@
|
|||||||
#ifndef _CONFIG_H
|
|
||||||
#define _CONFIG_H
|
|
||||||
|
|
||||||
# if !defined(WINDOWS) && !defined(WIN32_SYSTEM)
|
|
||||||
# define _UNIX_
|
|
||||||
|
|
||||||
# include <stdlib.h>
|
|
||||||
# include <sys/types.h>
|
|
||||||
|
|
||||||
# define MEM_ALLOC(size) (malloc((size_t)(size)))
|
|
||||||
# define MEM_FREE(ptr) {if(ptr) free(ptr);}
|
|
||||||
|
|
||||||
# define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
|
|
||||||
# define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n)))
|
|
||||||
# define STRCAT(t, s) (strcat((char*)(t), (char*)(s)))
|
|
||||||
# define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n)))
|
|
||||||
# define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0)
|
|
||||||
# define STRLEN(str) ((str)? strlen((char*)(str)):0)
|
|
||||||
|
|
||||||
# define EXPORT
|
|
||||||
# define CALLBACK
|
|
||||||
# define FAR
|
|
||||||
|
|
||||||
typedef signed short SSHOR;
|
|
||||||
typedef short WORD;
|
|
||||||
typedef long DWORD;
|
|
||||||
|
|
||||||
typedef WORD WPARAM;
|
|
||||||
typedef DWORD LPARAM;
|
|
||||||
typedef void* HWND;
|
|
||||||
typedef int BOOL;
|
|
||||||
|
|
||||||
# endif /* _UNIX_ */
|
|
||||||
|
|
||||||
# if defined(WINDOWS) || defined(WIN32_SYSTEM)
|
|
||||||
|
|
||||||
# include <windows.h>
|
|
||||||
# include <windowsx.h>
|
|
||||||
|
|
||||||
# ifdef _MSVC_
|
|
||||||
# define MEM_ALLOC(size) (fmalloc((size_t)(size)))
|
|
||||||
# define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0))
|
|
||||||
# define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s)))
|
|
||||||
# define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
|
|
||||||
# define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0)
|
|
||||||
# define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifdef _BORLAND_
|
|
||||||
# define MEM_ALLOC(size) (farmalloc((unsigned long)(size))
|
|
||||||
# define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0)
|
|
||||||
# define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s)))
|
|
||||||
# define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
|
|
||||||
# define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0)
|
|
||||||
# define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# endif /* WINDOWS */
|
|
||||||
|
|
||||||
# define SYSERR (-1)
|
|
||||||
|
|
||||||
# ifndef NULL
|
|
||||||
# define NULL ((void FAR*)0UL)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
|
235
src/iodbc/isql.h
235
src/iodbc/isql.h
@@ -1,235 +0,0 @@
|
|||||||
/*
|
|
||||||
* isql.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* iODBC defines
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _ISQL_H
|
|
||||||
#define _ISQL_H
|
|
||||||
|
|
||||||
#ifndef WIN16
|
|
||||||
#ifdef WIN32
|
|
||||||
#define SQL_API __stdcall
|
|
||||||
#else
|
|
||||||
#define FAR
|
|
||||||
#define EXPORT
|
|
||||||
#define CALLBACK
|
|
||||||
#define SQL_API EXPORT CALLBACK
|
|
||||||
#ifndef __EMX__
|
|
||||||
typedef void *HWND;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef void *SQLHWND;
|
|
||||||
|
|
||||||
typedef unsigned char UCHAR;
|
|
||||||
typedef long int SDWORD;
|
|
||||||
typedef short int SWORD;
|
|
||||||
typedef unsigned long int UDWORD;
|
|
||||||
typedef unsigned short int UWORD;
|
|
||||||
typedef long SQLINTEGER;
|
|
||||||
typedef UDWORD SQLUINTEGER;
|
|
||||||
|
|
||||||
typedef void FAR *PTR;
|
|
||||||
typedef void FAR *HENV;
|
|
||||||
typedef void FAR *HDBC;
|
|
||||||
typedef void FAR *HSTMT;
|
|
||||||
|
|
||||||
typedef signed short RETCODE;
|
|
||||||
#define SQLRETURN RETCODE
|
|
||||||
|
|
||||||
|
|
||||||
#define ODBCVER 0x0250
|
|
||||||
|
|
||||||
#define SQL_MAX_MESSAGE_LENGTH 512
|
|
||||||
#define SQL_MAX_DSN_LENGTH 32
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function return codes
|
|
||||||
*/
|
|
||||||
#define SQL_INVALID_HANDLE (-2)
|
|
||||||
#define SQL_ERROR (-1)
|
|
||||||
#define SQL_SUCCESS 0
|
|
||||||
#define SQL_SUCCESS_WITH_INFO 1
|
|
||||||
#define SQL_NO_DATA_FOUND 100
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Standard SQL datatypes, using ANSI type numbering
|
|
||||||
*/
|
|
||||||
#define SQL_CHAR 1
|
|
||||||
#define SQL_NUMERIC 2
|
|
||||||
#define SQL_DECIMAL 3
|
|
||||||
#define SQL_INTEGER 4
|
|
||||||
#define SQL_SMALLINT 5
|
|
||||||
#define SQL_FLOAT 6
|
|
||||||
#define SQL_REAL 7
|
|
||||||
#define SQL_DOUBLE 8
|
|
||||||
#define SQL_VARCHAR 12
|
|
||||||
|
|
||||||
#define SQL_TYPE_MIN SQL_CHAR
|
|
||||||
#define SQL_TYPE_NULL 0
|
|
||||||
#define SQL_TYPE_MAX SQL_VARCHAR
|
|
||||||
|
|
||||||
/*
|
|
||||||
* C datatype to SQL datatype mapping
|
|
||||||
*/
|
|
||||||
#define SQL_C_CHAR SQL_CHAR
|
|
||||||
#define SQL_C_LONG SQL_INTEGER
|
|
||||||
#define SQL_C_SHORT SQL_SMALLINT
|
|
||||||
#define SQL_C_FLOAT SQL_REAL
|
|
||||||
#define SQL_C_DOUBLE SQL_DOUBLE
|
|
||||||
#define SQL_C_DEFAULT 99
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NULL status constants.
|
|
||||||
*/
|
|
||||||
#define SQL_NO_NULLS 0
|
|
||||||
#define SQL_NULLABLE 1
|
|
||||||
#define SQL_NULLABLE_UNKNOWN 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Special length values
|
|
||||||
*/
|
|
||||||
#define SQL_NULL_DATA (-1)
|
|
||||||
#define SQL_DATA_AT_EXEC (-2)
|
|
||||||
#define SQL_NTS (-3)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SQLFreeStmt
|
|
||||||
*/
|
|
||||||
#define SQL_CLOSE 0
|
|
||||||
#define SQL_DROP 1
|
|
||||||
#define SQL_UNBIND 2
|
|
||||||
#define SQL_RESET_PARAMS 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SQLTransact
|
|
||||||
*/
|
|
||||||
#define SQL_COMMIT 0
|
|
||||||
#define SQL_ROLLBACK 1
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SQLColAttributes
|
|
||||||
*/
|
|
||||||
#define SQL_COLUMN_COUNT 0
|
|
||||||
#define SQL_COLUMN_NAME 1
|
|
||||||
#define SQL_COLUMN_TYPE 2
|
|
||||||
#define SQL_COLUMN_LENGTH 3
|
|
||||||
#define SQL_COLUMN_PRECISION 4
|
|
||||||
#define SQL_COLUMN_SCALE 5
|
|
||||||
#define SQL_COLUMN_DISPLAY_SIZE 6
|
|
||||||
#define SQL_COLUMN_NULLABLE 7
|
|
||||||
#define SQL_COLUMN_UNSIGNED 8
|
|
||||||
#define SQL_COLUMN_MONEY 9
|
|
||||||
#define SQL_COLUMN_UPDATABLE 10
|
|
||||||
#define SQL_COLUMN_AUTO_INCREMENT 11
|
|
||||||
#define SQL_COLUMN_CASE_SENSITIVE 12
|
|
||||||
#define SQL_COLUMN_SEARCHABLE 13
|
|
||||||
#define SQL_COLUMN_TYPE_NAME 14
|
|
||||||
#define SQL_COLUMN_TABLE_NAME 15
|
|
||||||
#define SQL_COLUMN_OWNER_NAME 16
|
|
||||||
#define SQL_COLUMN_QUALIFIER_NAME 17
|
|
||||||
#define SQL_COLUMN_LABEL 18
|
|
||||||
|
|
||||||
#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL
|
|
||||||
#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT
|
|
||||||
#define SQL_COLUMN_DRIVER_START 1000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SQLColAttributes : SQL_COLUMN_UPDATABLE
|
|
||||||
*/
|
|
||||||
#define SQL_ATTR_READONLY 0
|
|
||||||
#define SQL_ATTR_WRITE 1
|
|
||||||
#define SQL_ATTR_READWRITE_UNKNOWN 2
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SQLColAttributes : SQL_COLUMN_SEARCHABLE
|
|
||||||
*/
|
|
||||||
#define SQL_UNSEARCHABLE 0
|
|
||||||
#define SQL_LIKE_ONLY 1
|
|
||||||
#define SQL_ALL_EXCEPT_LIKE 2
|
|
||||||
#define SQL_SEARCHABLE 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* NULL Handles
|
|
||||||
*/
|
|
||||||
#define SQL_NULL_HENV 0
|
|
||||||
#define SQL_NULL_HDBC 0
|
|
||||||
#define SQL_NULL_HSTMT 0
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Function Prototypes
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RETCODE SQL_API SQLAllocConnect (HENV henv, HDBC FAR * phdbc);
|
|
||||||
RETCODE SQL_API SQLAllocEnv (HENV FAR * phenv);
|
|
||||||
RETCODE SQL_API SQLAllocStmt (HDBC hdbc, HSTMT FAR * phstmt);
|
|
||||||
RETCODE SQL_API SQLBindCol (HSTMT hstmt, UWORD icol, SWORD fCType,
|
|
||||||
PTR rgbValue, SDWORD cbValueMax, SDWORD FAR * pcbValue);
|
|
||||||
RETCODE SQL_API SQLCancel (HSTMT hstmt);
|
|
||||||
RETCODE SQL_API SQLColAttributes (HSTMT hstmt, UWORD icol, UWORD fDescType,
|
|
||||||
PTR rgbDesc, SWORD cbDescMax, SWORD FAR * pcbDesc, SDWORD FAR * pfDesc);
|
|
||||||
RETCODE SQL_API SQLConnect (HDBC hdbc, UCHAR FAR * szDSN, SWORD cbDSN,
|
|
||||||
UCHAR FAR * szUID, SWORD cbUID, UCHAR FAR * szAuthStr, SWORD cbAuthStr);
|
|
||||||
RETCODE SQL_API SQLDescribeCol (HSTMT hstmt, UWORD icol,
|
|
||||||
UCHAR FAR * szColName, SWORD cbColNameMax, SWORD FAR * pcbColName,
|
|
||||||
SWORD FAR * pfSqlType, UDWORD FAR * pcbColDef, SWORD FAR * pibScale,
|
|
||||||
SWORD FAR * pfNullable);
|
|
||||||
RETCODE SQL_API SQLDisconnect (HDBC hdbc);
|
|
||||||
RETCODE SQL_API SQLError (HENV henv, HDBC hdbc, HSTMT hstmt,
|
|
||||||
UCHAR FAR * szSqlState, SDWORD FAR * pfNativeError, UCHAR FAR * szErrorMsg,
|
|
||||||
SWORD cbErrorMsgMax, SWORD FAR * pcbErrorMsg);
|
|
||||||
RETCODE SQL_API SQLExecDirect (HSTMT hstmt, UCHAR FAR * szSqlStr,
|
|
||||||
SDWORD cbSqlStr);
|
|
||||||
RETCODE SQL_API SQLExecute (HSTMT hstmt);
|
|
||||||
RETCODE SQL_API SQLFetch (HSTMT hstmt);
|
|
||||||
RETCODE SQL_API SQLFreeConnect (HDBC hdbc);
|
|
||||||
RETCODE SQL_API SQLFreeEnv (HENV henv);
|
|
||||||
RETCODE SQL_API SQLFreeStmt (HSTMT hstmt, UWORD fOption);
|
|
||||||
RETCODE SQL_API SQLGetCursorName (HSTMT hstmt, UCHAR FAR * szCursor,
|
|
||||||
SWORD cbCursorMax, SWORD FAR * pcbCursor);
|
|
||||||
RETCODE SQL_API SQLNumResultCols (HSTMT hstmt, SWORD FAR * pccol);
|
|
||||||
RETCODE SQL_API SQLPrepare (HSTMT hstmt, UCHAR FAR * szSqlStr,
|
|
||||||
SDWORD cbSqlStr);
|
|
||||||
RETCODE SQL_API SQLRowCount (HSTMT hstmt, SDWORD FAR * pcrow);
|
|
||||||
RETCODE SQL_API SQLSetCursorName (HSTMT hstmt, UCHAR FAR * szCursor,
|
|
||||||
SWORD cbCursor);
|
|
||||||
RETCODE SQL_API SQLTransact (HENV henv, HDBC hdbc, UWORD fType);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Deprecated ODBC 1.0 function - Use SQLBindParameter
|
|
||||||
*/
|
|
||||||
RETCODE SQL_API SQLSetParam (HSTMT hstmt, UWORD ipar, SWORD fCType,
|
|
||||||
SWORD fSqlType, UDWORD cbColDef, SWORD ibScale, PTR rgbValue,
|
|
||||||
SDWORD FAR * pcbValue);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
1177
src/iodbc/isqlext.h
1177
src/iodbc/isqlext.h
File diff suppressed because it is too large
Load Diff
@@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
* itrace.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Trace functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "henv.ci"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
printreturn (void FAR * istm, int ret)
|
|
||||||
{
|
|
||||||
FILE FAR *stm = (FILE FAR *) istm;
|
|
||||||
char FAR *ptr = "Invalid return value";
|
|
||||||
|
|
||||||
switch (ret)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
ptr = "SQL_SUCCESS";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
ptr = "SQL_SUCCESS_WITH_INFO";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NO_DATA_FOUND:
|
|
||||||
ptr = "SQL_NO_DATA_FOUND";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_NEED_DATA:
|
|
||||||
ptr = "SQL_NEED_DATA";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_INVALID_HANDLE:
|
|
||||||
ptr = "SQL_INVALID_HANDLE";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ERROR:
|
|
||||||
ptr = "SQL_ERROR";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
ptr = "SQL_STILL_EXECUTING";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf (stm, "%s\n", ptr);
|
|
||||||
fflush (stm);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HPROC
|
|
||||||
_iodbcdm_gettrproc (void FAR * istm, int procid, int type)
|
|
||||||
{
|
|
||||||
FILE FAR *stm = (FILE FAR *) istm;
|
|
||||||
|
|
||||||
if (type == TRACE_TYPE_DM2DRV)
|
|
||||||
{
|
|
||||||
int i, j = 0;
|
|
||||||
|
|
||||||
for (i = 0; j != en_NullProc; i++)
|
|
||||||
{
|
|
||||||
j = odbcapi_symtab[i].en_idx;
|
|
||||||
|
|
||||||
if (j == procid)
|
|
||||||
{
|
|
||||||
fprintf (stm, "\n%s ( ... )\n", odbcapi_symtab[i].symbol);
|
|
||||||
|
|
||||||
fflush (stm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == TRACE_TYPE_RETURN)
|
|
||||||
{
|
|
||||||
return (HPROC) printreturn;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SQL_NULL_HPROC;
|
|
||||||
}
|
|
@@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* itrace.h
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Trace functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
#ifndef _ITRACE_H
|
|
||||||
#define _ITRACE_H
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
|
|
||||||
#ifndef NO_TRACE
|
|
||||||
#define NO_TRACE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TRACE_TYPE_APP2DM 1
|
|
||||||
#define TRACE_TYPE_DM2DRV 2
|
|
||||||
#define TRACE_TYPE_DRV2DM 3
|
|
||||||
|
|
||||||
#define TRACE_TYPE_RETURN 4
|
|
||||||
|
|
||||||
extern HPROC _iodbcdm_gettrproc (void FAR * stm, int procid, int type);
|
|
||||||
|
|
||||||
#ifdef NO_TRACE
|
|
||||||
#define TRACE_CALL( stm, trace_on, procid, plist )
|
|
||||||
#else
|
|
||||||
#define TRACE_CALL( stm, trace_on, plist )\
|
|
||||||
{\
|
|
||||||
if( trace_on)\
|
|
||||||
{\
|
|
||||||
HPROC hproc;\
|
|
||||||
\
|
|
||||||
hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_APP2DM);\
|
|
||||||
\
|
|
||||||
if( hproc )\
|
|
||||||
hproc plist;\
|
|
||||||
}\
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_TRACE
|
|
||||||
#define TRACE_DM2DRV( stm, procid, plist )
|
|
||||||
#else
|
|
||||||
#define TRACE_DM2DRV( stm, procid, plist )\
|
|
||||||
{\
|
|
||||||
HPROC hproc;\
|
|
||||||
\
|
|
||||||
hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_DM2DRV);\
|
|
||||||
\
|
|
||||||
if( hproc )\
|
|
||||||
hproc plist;\
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_TRACE
|
|
||||||
#define TRACE_DRV2DM( stm, procid, plist )
|
|
||||||
#else
|
|
||||||
#define TRACE_DRV2DM( stm, procid, plist ) \
|
|
||||||
{\
|
|
||||||
HPROC hproc;\
|
|
||||||
\
|
|
||||||
hproc = _iodbcdm_gettrproc( stm, procid, TRACE_TYPE_DRV2DM);\
|
|
||||||
\
|
|
||||||
if( hproc )\
|
|
||||||
hproc plist;\
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_TRACE
|
|
||||||
#define TRACE_RETURN( stm, trace_on, ret )
|
|
||||||
#else
|
|
||||||
#define TRACE_RETURN( stm, trace_on, ret )\
|
|
||||||
{\
|
|
||||||
if( trace_on ) {\
|
|
||||||
HPROC hproc;\
|
|
||||||
\
|
|
||||||
hproc = _iodbcdm_gettrproc( stm, 0, TRACE_TYPE_RETURN);\
|
|
||||||
\
|
|
||||||
if( hproc )\
|
|
||||||
hproc( stm, ret );\
|
|
||||||
}\
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NO_TRACE
|
|
||||||
#define CALL_DRIVER( hdbc, ret, proc, procid, plist ) { ret = proc plist; }
|
|
||||||
#else
|
|
||||||
#define CALL_DRIVER( hdbc, ret, proc, procid, plist )\
|
|
||||||
{\
|
|
||||||
DBC_t FAR* pdbc = (DBC_t FAR*)(hdbc);\
|
|
||||||
\
|
|
||||||
if( pdbc->trace ) {\
|
|
||||||
TRACE_DM2DRV( pdbc->tstm, procid, plist )\
|
|
||||||
ret = proc plist;\
|
|
||||||
TRACE_DRV2DM( pdbc->tstm, procid, plist )\
|
|
||||||
TRACE_RETURN( pdbc->tstm, 1, ret )\
|
|
||||||
}\
|
|
||||||
else\
|
|
||||||
ret = proc plist;\
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
413
src/iodbc/misc.c
413
src/iodbc/misc.c
@@ -1,413 +0,0 @@
|
|||||||
/*
|
|
||||||
* misc.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Miscellaneous functions
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
upper_strneq (
|
|
||||||
char *s1,
|
|
||||||
char *s2,
|
|
||||||
int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char c1, c2;
|
|
||||||
|
|
||||||
for (i = 1; i < n; i++)
|
|
||||||
{
|
|
||||||
c1 = s1[i];
|
|
||||||
c2 = s2[i];
|
|
||||||
|
|
||||||
if (c1 >= 'a' && c1 <= 'z')
|
|
||||||
{
|
|
||||||
c1 += ('A' - 'a');
|
|
||||||
}
|
|
||||||
else if (c1 == '\n')
|
|
||||||
{
|
|
||||||
c1 = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c2 >= 'a' && c2 <= 'z')
|
|
||||||
{
|
|
||||||
c2 += ('A' - 'a');
|
|
||||||
}
|
|
||||||
else if (c2 == '\n')
|
|
||||||
{
|
|
||||||
c2 = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((c1 - c2) || !c1 || !c2)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (int) !(c1 - c2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char * /* return new position in input str */
|
|
||||||
readtoken (
|
|
||||||
char *istr, /* old position in input buf */
|
|
||||||
char *obuf) /* token string ( if "\0", then finished ) */
|
|
||||||
{
|
|
||||||
char *start = obuf;
|
|
||||||
|
|
||||||
/* Skip leading white space */
|
|
||||||
while (*istr == ' ' || *istr == '\t')
|
|
||||||
istr++;
|
|
||||||
|
|
||||||
for (; *istr && *istr != '\n'; istr++)
|
|
||||||
{
|
|
||||||
char c, nx;
|
|
||||||
|
|
||||||
c = *(istr);
|
|
||||||
nx = *(istr + 1);
|
|
||||||
|
|
||||||
if (c == ';')
|
|
||||||
{
|
|
||||||
for (; *istr && *istr != '\n'; istr++);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*obuf = c;
|
|
||||||
obuf++;
|
|
||||||
|
|
||||||
if (nx == ';' || nx == '=' || c == '=')
|
|
||||||
{
|
|
||||||
istr++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*obuf = '\0';
|
|
||||||
|
|
||||||
/* Trim end of token */
|
|
||||||
for (; obuf > start && (*(obuf - 1) == ' ' || *(obuf - 1) == '\t');)
|
|
||||||
*--obuf = '\0';
|
|
||||||
|
|
||||||
return istr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(WINDOWS) && !defined(WIN32) && !defined(OS2)
|
|
||||||
# include <pwd.h>
|
|
||||||
# define UNIX_PWD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *
|
|
||||||
_iodbcdm_getinifile (char *buf, int size)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char *ptr;
|
|
||||||
|
|
||||||
j = STRLEN ("/odbc.ini") + 1;
|
|
||||||
|
|
||||||
if (size < j)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !defined(UNIX_PWD)
|
|
||||||
|
|
||||||
i = GetWindowsDirectory ((LPSTR) buf, size);
|
|
||||||
|
|
||||||
if (i == 0 || i > size - j)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf (buf + i, "/odbc.ini");
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
#else
|
|
||||||
if ((ptr = getenv ("ODBCINI")) != NULL)
|
|
||||||
{
|
|
||||||
strcpy (buf, ptr);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ptr = getenv ("IODBCINI")) != NULL)
|
|
||||||
{
|
|
||||||
strcpy (buf, ptr);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ptr = getenv ("HOME")) == NULL)
|
|
||||||
{
|
|
||||||
ptr = (char *) getpwuid (getuid ());
|
|
||||||
|
|
||||||
if (ptr == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr = ((struct passwd *) ptr)->pw_dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ptr == NULL || *ptr == '\0')
|
|
||||||
{
|
|
||||||
ptr = "/home";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size < STRLEN (ptr) + j)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf (buf, "%s%s", ptr, "/.odbc.ini");
|
|
||||||
/* i.e. searching ~/.odbc.ini */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* read odbc init file to resolve the value of specified
|
|
||||||
* key from named or defaulted dsn section
|
|
||||||
*/
|
|
||||||
char *
|
|
||||||
_iodbcdm_getkeyvalbydsn (
|
|
||||||
char *dsn,
|
|
||||||
int dsnlen,
|
|
||||||
char *keywd,
|
|
||||||
char *value,
|
|
||||||
int size)
|
|
||||||
{
|
|
||||||
char buf[1024];
|
|
||||||
char dsntk[SQL_MAX_DSN_LENGTH + 3] = {'[', '\0'};
|
|
||||||
char token[1024]; /* large enough */
|
|
||||||
FILE *file;
|
|
||||||
char pathbuf[1024];
|
|
||||||
char *path;
|
|
||||||
|
|
||||||
#define DSN_NOMATCH 0
|
|
||||||
#define DSN_NAMED 1
|
|
||||||
#define DSN_DEFAULT 2
|
|
||||||
|
|
||||||
int dsnid = DSN_NOMATCH;
|
|
||||||
int defaultdsn = DSN_NOMATCH;
|
|
||||||
|
|
||||||
if (dsn == NULL || *dsn == 0)
|
|
||||||
{
|
|
||||||
dsn = "default";
|
|
||||||
dsnlen = STRLEN (dsn);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dsnlen == SQL_NTS)
|
|
||||||
{
|
|
||||||
dsnlen = STRLEN (dsn);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dsnlen <= 0 || keywd == NULL || buf == 0 || size <= 0)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dsnlen > sizeof (dsntk) - 2)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
value[0] = '\0';
|
|
||||||
|
|
||||||
STRNCAT (dsntk, dsn, dsnlen);
|
|
||||||
STRCAT (dsntk, "]");
|
|
||||||
|
|
||||||
dsnlen = dsnlen + 2;
|
|
||||||
|
|
||||||
path = _iodbcdm_getinifile (pathbuf, sizeof (pathbuf));
|
|
||||||
|
|
||||||
if (path == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = (FILE *) fopen (path, "r");
|
|
||||||
|
|
||||||
if (file == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
char *str;
|
|
||||||
|
|
||||||
str = fgets (buf, sizeof (buf), file);
|
|
||||||
|
|
||||||
if (str == NULL)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*str == '[')
|
|
||||||
{
|
|
||||||
if (upper_strneq (str, "[default]", STRLEN ("[default]")))
|
|
||||||
{
|
|
||||||
/* we only read first dsn default dsn
|
|
||||||
* section (as well as named dsn).
|
|
||||||
*/
|
|
||||||
if (defaultdsn == DSN_NOMATCH)
|
|
||||||
{
|
|
||||||
dsnid = DSN_DEFAULT;
|
|
||||||
defaultdsn = DSN_DEFAULT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dsnid = DSN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (upper_strneq (str, dsntk, dsnlen))
|
|
||||||
{
|
|
||||||
dsnid = DSN_NAMED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dsnid = DSN_NOMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (dsnid == DSN_NOMATCH)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
str = readtoken (str, token);
|
|
||||||
|
|
||||||
if (upper_strneq (keywd, token, STRLEN (keywd)))
|
|
||||||
{
|
|
||||||
str = readtoken (str, token);
|
|
||||||
|
|
||||||
if (!STREQ (token, "="))
|
|
||||||
/* something other than = */
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
str = readtoken (str, token);
|
|
||||||
|
|
||||||
if (STRLEN (token) > size - 1)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY (value, token, size);
|
|
||||||
/* copy the value(i.e. next token) to buf */
|
|
||||||
|
|
||||||
if (dsnid != DSN_DEFAULT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose (file);
|
|
||||||
|
|
||||||
return (*value) ? value : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
_iodbcdm_getkeyvalinstr (
|
|
||||||
char *cnstr,
|
|
||||||
int cnlen,
|
|
||||||
char *keywd,
|
|
||||||
char *value,
|
|
||||||
int size)
|
|
||||||
{
|
|
||||||
char token[1024] = {'\0'};
|
|
||||||
int flag = 0;
|
|
||||||
|
|
||||||
if (cnstr == NULL || value == NULL
|
|
||||||
|| keywd == NULL || size < 1)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cnlen == SQL_NTS)
|
|
||||||
{
|
|
||||||
cnlen = STRLEN (cnstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cnlen <= 0)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
cnstr = readtoken (cnstr, token);
|
|
||||||
|
|
||||||
if (*token == '\0')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (STREQ (token, ";"))
|
|
||||||
{
|
|
||||||
flag = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (flag)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
if (upper_strneq (token, keywd, strlen (keywd)))
|
|
||||||
{
|
|
||||||
flag = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
if (STREQ (token, "="))
|
|
||||||
{
|
|
||||||
flag = 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if (size < strlen (token) + 1)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
STRNCPY (value, token, size);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
@@ -1,525 +0,0 @@
|
|||||||
/*
|
|
||||||
* prepare.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Prepare a query
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLPrepare (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szSqlStr,
|
|
||||||
SDWORD cbSqlStr)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t *) hstmt;
|
|
||||||
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
/* not on asyn state */
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_Prepare)
|
|
||||||
{
|
|
||||||
/* asyn on other */
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (szSqlStr == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbSqlStr < 0 && cbSqlStr != SQL_NTS)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Prepare);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Prepare,
|
|
||||||
(pstmt->dhstmt, szSqlStr, cbSqlStr))
|
|
||||||
|
|
||||||
/* stmt state transition */
|
|
||||||
if (pstmt->asyn_on == en_Prepare)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
return retcode;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
pstmt->asyn_on = en_Prepare;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
pstmt->state = en_stmt_prepared;
|
|
||||||
pstmt->prep_state = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_ERROR:
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_executed:
|
|
||||||
pstmt->state = en_stmt_allocated;
|
|
||||||
pstmt->prep_state = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetCursorName (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szCursor,
|
|
||||||
SWORD cbCursor)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (szCursor == NULL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1009);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbCursor < 0 && cbCursor != SQL_NTS)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_executed:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
sqlstat = en_24000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case en_stmt_needdata:
|
|
||||||
case en_stmt_mustput:
|
|
||||||
case en_stmt_canput:
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetCursorName);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetCursorName,
|
|
||||||
(pstmt->dhstmt, szCursor, cbCursor))
|
|
||||||
|
|
||||||
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
|
|
||||||
{
|
|
||||||
pstmt->cursor_state = en_stmt_cursor_named;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLBindParameter (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD ipar,
|
|
||||||
SWORD fParamType,
|
|
||||||
SWORD fCType,
|
|
||||||
SWORD fSqlType,
|
|
||||||
UDWORD cbColDef,
|
|
||||||
SWORD ibScale,
|
|
||||||
PTR rgbValue,
|
|
||||||
SDWORD cbValueMax,
|
|
||||||
SDWORD FAR * pcbValue)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode = SQL_SUCCESS;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check param */
|
|
||||||
if (fSqlType > SQL_TYPE_MAX ||
|
|
||||||
(fSqlType < SQL_TYPE_MIN && fSqlType > SQL_TYPE_DRIVER_START))
|
|
||||||
/* Note: SQL_TYPE_DRIVER_START is a nagtive number
|
|
||||||
* So, we use ">" */
|
|
||||||
{
|
|
||||||
sqlstat = en_S1004;
|
|
||||||
}
|
|
||||||
else if (ipar < 1)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1093;
|
|
||||||
}
|
|
||||||
else if ((rgbValue == NULL && pcbValue == NULL)
|
|
||||||
&& fParamType != SQL_PARAM_OUTPUT)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1009;
|
|
||||||
/* This means, I allow output to nowhere
|
|
||||||
* (i.e. * junk output result). But I can't
|
|
||||||
* allow input from nowhere.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
/**********
|
|
||||||
else if( cbValueMax < 0L && cbValueMax != SQL_SETPARAM_VALUE_MAX )
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
}
|
|
||||||
**********/
|
|
||||||
else if (fParamType != SQL_PARAM_INPUT
|
|
||||||
&& fParamType != SQL_PARAM_OUTPUT
|
|
||||||
&& fParamType != SQL_PARAM_INPUT_OUTPUT)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1105;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (fCType)
|
|
||||||
{
|
|
||||||
case SQL_C_DEFAULT:
|
|
||||||
case SQL_C_CHAR:
|
|
||||||
case SQL_C_BINARY:
|
|
||||||
case SQL_C_BIT:
|
|
||||||
case SQL_C_TINYINT:
|
|
||||||
case SQL_C_STINYINT:
|
|
||||||
case SQL_C_UTINYINT:
|
|
||||||
case SQL_C_SHORT:
|
|
||||||
case SQL_C_SSHORT:
|
|
||||||
case SQL_C_USHORT:
|
|
||||||
case SQL_C_LONG:
|
|
||||||
case SQL_C_SLONG:
|
|
||||||
case SQL_C_ULONG:
|
|
||||||
case SQL_C_FLOAT:
|
|
||||||
case SQL_C_DOUBLE:
|
|
||||||
case SQL_C_DATE:
|
|
||||||
case SQL_C_TIME:
|
|
||||||
case SQL_C_TIMESTAMP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
sqlstat = en_S1003;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
retcode = SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_BindParameter);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_BindParameter,
|
|
||||||
(pstmt->dhstmt, ipar, fParamType, fCType, fSqlType, cbColDef,
|
|
||||||
ibScale, rgbValue, cbValueMax, pcbValue))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLParamOptions (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UDWORD crow,
|
|
||||||
UDWORD FAR * pirow)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crow == (UDWORD) 0UL)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1107);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ParamOptions);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ParamOptions,
|
|
||||||
(pstmt->dhstmt, crow, pirow))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetScrollOptions (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD fConcurrency,
|
|
||||||
SDWORD crowKeyset,
|
|
||||||
UWORD crowRowset)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if (crowRowset == (UWORD) 0)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1107;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crowKeyset > (SDWORD) 0L && crowKeyset < (SDWORD) crowRowset)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1107;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (crowKeyset < 1)
|
|
||||||
{
|
|
||||||
if (crowKeyset != SQL_SCROLL_FORWARD_ONLY
|
|
||||||
&& crowKeyset != SQL_SCROLL_STATIC
|
|
||||||
&& crowKeyset != SQL_SCROLL_KEYSET_DRIVEN
|
|
||||||
&& crowKeyset != SQL_SCROLL_DYNAMIC)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1107;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fConcurrency != SQL_CONCUR_READ_ONLY
|
|
||||||
&& fConcurrency != SQL_CONCUR_LOCK
|
|
||||||
&& fConcurrency != SQL_CONCUR_ROWVER
|
|
||||||
&& fConcurrency != SQL_CONCUR_VALUES)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1108;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state != en_stmt_allocated)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetScrollOptions);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
sqlstat = en_IM001;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlstat = en_00000;
|
|
||||||
if (1) /* turn off solaris warning message */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetScrollOptions,
|
|
||||||
(pstmt->dhstmt, fConcurrency, crowKeyset, crowRowset))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLSetParam (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD ipar,
|
|
||||||
SWORD fCType,
|
|
||||||
SWORD fSqlType,
|
|
||||||
UDWORD cbColDef,
|
|
||||||
SWORD ibScale,
|
|
||||||
PTR rgbValue,
|
|
||||||
SDWORD FAR * pcbValue)
|
|
||||||
{
|
|
||||||
return SQLBindParameter (hstmt,
|
|
||||||
ipar,
|
|
||||||
(SWORD) SQL_PARAM_INPUT_OUTPUT,
|
|
||||||
fCType,
|
|
||||||
fSqlType,
|
|
||||||
cbColDef,
|
|
||||||
ibScale,
|
|
||||||
rgbValue,
|
|
||||||
SQL_SETPARAM_VALUE_MAX,
|
|
||||||
pcbValue);
|
|
||||||
}
|
|
@@ -1,523 +0,0 @@
|
|||||||
/*
|
|
||||||
* result.c
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
*
|
|
||||||
* Prepare for getting query result
|
|
||||||
*
|
|
||||||
* The iODBC driver manager.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with this library; if not, write to the Free
|
|
||||||
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "isql.h"
|
|
||||||
#include "isqlext.h"
|
|
||||||
|
|
||||||
#include "dlproc.h"
|
|
||||||
|
|
||||||
#include "herr.h"
|
|
||||||
#include "henv.h"
|
|
||||||
#include "hdbc.h"
|
|
||||||
#include "hstmt.h"
|
|
||||||
|
|
||||||
#include "itrace.h"
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLBindCol (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD icol,
|
|
||||||
SWORD fCType,
|
|
||||||
PTR rgbValue,
|
|
||||||
SDWORD cbValueMax,
|
|
||||||
SDWORD FAR * pcbValue)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc = SQL_NULL_HPROC;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
switch (fCType)
|
|
||||||
{
|
|
||||||
case SQL_C_DEFAULT:
|
|
||||||
case SQL_C_CHAR:
|
|
||||||
case SQL_C_BINARY:
|
|
||||||
case SQL_C_BIT:
|
|
||||||
case SQL_C_TINYINT:
|
|
||||||
case SQL_C_STINYINT:
|
|
||||||
case SQL_C_UTINYINT:
|
|
||||||
case SQL_C_SHORT:
|
|
||||||
case SQL_C_SSHORT:
|
|
||||||
case SQL_C_USHORT:
|
|
||||||
case SQL_C_LONG:
|
|
||||||
case SQL_C_SLONG:
|
|
||||||
case SQL_C_ULONG:
|
|
||||||
case SQL_C_FLOAT:
|
|
||||||
case SQL_C_DOUBLE:
|
|
||||||
case SQL_C_DATE:
|
|
||||||
case SQL_C_TIME:
|
|
||||||
case SQL_C_TIMESTAMP:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1003);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbValueMax < 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state > en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver's function */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_BindCol);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_BindCol,
|
|
||||||
(pstmt->dhstmt, icol, fCType, rgbValue, cbValueMax, pcbValue))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLGetCursorName (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UCHAR FAR * szCursor,
|
|
||||||
SWORD cbCursorMax,
|
|
||||||
SWORD FAR * pcbCursor)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check argument */
|
|
||||||
if (cbCursorMax < (SWORD) 0)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1090);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pstmt->state < en_stmt_cursoropen
|
|
||||||
&& pstmt->cursor_state == en_stmt_cursor_no)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1015);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver's function */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetCursorName);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetCursorName,
|
|
||||||
(pstmt->dhstmt, szCursor, cbCursorMax, pcbCursor))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLRowCount (
|
|
||||||
HSTMT hstmt,
|
|
||||||
SDWORD FAR * pcrow)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->state >= en_stmt_needdata
|
|
||||||
|| pstmt->state <= en_stmt_prepared
|
|
||||||
|| pstmt->asyn_on != en_NullProc)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_RowCount);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_RowCount,
|
|
||||||
(pstmt->dhstmt, pcrow))
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLNumResultCols (
|
|
||||||
HSTMT hstmt,
|
|
||||||
SWORD FAR * pccol)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
SWORD ccol;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->state == en_stmt_allocated
|
|
||||||
|| pstmt->state >= en_stmt_needdata)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_NumResultCols)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_S1010);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_NumResultCols);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_NumResultCols,
|
|
||||||
(pstmt->dhstmt, &ccol))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_NumResultCols)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SQL_STILL_EXECUTING:
|
|
||||||
ccol = 0;
|
|
||||||
pstmt->asyn_on = en_NumResultCols;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ccol = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pccol)
|
|
||||||
{
|
|
||||||
*pccol = ccol;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLDescribeCol (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD icol,
|
|
||||||
UCHAR FAR * szColName,
|
|
||||||
SWORD cbColNameMax,
|
|
||||||
SWORD FAR * pcbColName,
|
|
||||||
SWORD FAR * pfSqlType,
|
|
||||||
UDWORD FAR * pcbColDef,
|
|
||||||
SWORD FAR * pibScale,
|
|
||||||
SWORD FAR * pfNullable)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT
|
|
||||||
|| pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check arguments */
|
|
||||||
if (icol == 0)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1002;
|
|
||||||
}
|
|
||||||
else if (cbColNameMax < 0)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->asyn_on == en_stmt_allocated
|
|
||||||
|| pstmt->asyn_on >= en_stmt_needdata)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_DescribeCol)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_DescribeCol);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_DescribeCol,
|
|
||||||
(pstmt->dhstmt, icol, szColName, cbColNameMax, pcbColName,
|
|
||||||
pfSqlType, pcbColDef, pibScale, pfNullable))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_DescribeCol)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_DescribeCol;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RETCODE SQL_API
|
|
||||||
SQLColAttributes (
|
|
||||||
HSTMT hstmt,
|
|
||||||
UWORD icol,
|
|
||||||
UWORD fDescType,
|
|
||||||
PTR rgbDesc,
|
|
||||||
SWORD cbDescMax,
|
|
||||||
SWORD FAR * pcbDesc,
|
|
||||||
SDWORD FAR * pfDesc)
|
|
||||||
{
|
|
||||||
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
|
|
||||||
HPROC hproc;
|
|
||||||
RETCODE retcode;
|
|
||||||
int sqlstat = en_00000;
|
|
||||||
|
|
||||||
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
|
|
||||||
{
|
|
||||||
return SQL_INVALID_HANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check arguments */
|
|
||||||
if (icol == 0 && fDescType != SQL_COLUMN_COUNT)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1002;
|
|
||||||
}
|
|
||||||
else if (cbDescMax < 0)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1090;
|
|
||||||
}
|
|
||||||
else if ( /* fDescType < SQL_COLATT_OPT_MIN || *//* turnoff warning */
|
|
||||||
(fDescType > SQL_COLATT_OPT_MAX
|
|
||||||
&& fDescType < SQL_COLUMN_DRIVER_START))
|
|
||||||
{
|
|
||||||
sqlstat = en_S1091;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check state */
|
|
||||||
if (pstmt->asyn_on == en_NullProc)
|
|
||||||
{
|
|
||||||
if (pstmt->asyn_on == en_stmt_allocated
|
|
||||||
|| pstmt->asyn_on >= en_stmt_needdata)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pstmt->asyn_on != en_ColAttributes)
|
|
||||||
{
|
|
||||||
sqlstat = en_S1010;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sqlstat != en_00000)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, sqlstat);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* call driver */
|
|
||||||
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ColAttributes);
|
|
||||||
|
|
||||||
if (hproc == SQL_NULL_HPROC)
|
|
||||||
{
|
|
||||||
PUSHSQLERR (pstmt->herr, en_IM001);
|
|
||||||
|
|
||||||
return SQL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ColAttributes,
|
|
||||||
(pstmt->dhstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc))
|
|
||||||
|
|
||||||
/* state transition */
|
|
||||||
if (pstmt->asyn_on == en_ColAttributes)
|
|
||||||
{
|
|
||||||
switch (retcode)
|
|
||||||
{
|
|
||||||
case SQL_SUCCESS:
|
|
||||||
case SQL_SUCCESS_WITH_INFO:
|
|
||||||
case SQL_ERROR:
|
|
||||||
pstmt->asyn_on = en_NullProc;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (pstmt->state)
|
|
||||||
{
|
|
||||||
case en_stmt_prepared:
|
|
||||||
case en_stmt_cursoropen:
|
|
||||||
case en_stmt_fetched:
|
|
||||||
case en_stmt_xfetched:
|
|
||||||
if (retcode == SQL_STILL_EXECUTING)
|
|
||||||
{
|
|
||||||
pstmt->asyn_on = en_ColAttributes;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retcode;
|
|
||||||
}
|
|
@@ -1,64 +0,0 @@
|
|||||||
SQLAllocEnv
|
|
||||||
SQLAllocConnect
|
|
||||||
SQLConnect
|
|
||||||
SQLDriverConnect
|
|
||||||
SQLBrowseConnect
|
|
||||||
|
|
||||||
SQLDataSources
|
|
||||||
SQLDrivers
|
|
||||||
SQLGetInfo
|
|
||||||
SQLGetFunctions
|
|
||||||
SQLGetTypeInfo
|
|
||||||
|
|
||||||
SQLSetConnectOption
|
|
||||||
SQLGetConnectOption
|
|
||||||
SQLSetStmtOption
|
|
||||||
SQLGetStmtOption
|
|
||||||
|
|
||||||
SQLAllocStmt
|
|
||||||
SQLPrepare
|
|
||||||
SQLBindParameter
|
|
||||||
SQLParamOptions
|
|
||||||
SQLGetCursorName
|
|
||||||
SQLSetCursorName
|
|
||||||
SQLSetScrollOptions
|
|
||||||
SQLSetParam
|
|
||||||
|
|
||||||
SQLExecute
|
|
||||||
SQLExecDirect
|
|
||||||
SQLNativeSql
|
|
||||||
SQLDescribeParam
|
|
||||||
SQLNumParams
|
|
||||||
SQLParamData
|
|
||||||
SQLPutData
|
|
||||||
|
|
||||||
SQLRowCount
|
|
||||||
SQLNumResultCols
|
|
||||||
SQLDescribeCol
|
|
||||||
SQLColAttributes
|
|
||||||
SQLBindCol
|
|
||||||
SQLFetch
|
|
||||||
SQLExtendedFetch
|
|
||||||
SQLGetData
|
|
||||||
SQLSetPos
|
|
||||||
SQLMoreResults
|
|
||||||
SQLError
|
|
||||||
|
|
||||||
SQLColumnPrivileges
|
|
||||||
SQLColumns
|
|
||||||
SQLForeignKeys
|
|
||||||
SQLPrimaryKeys
|
|
||||||
SQLProcedureColumns
|
|
||||||
SQLProcedures
|
|
||||||
SQLSpecialColumns
|
|
||||||
SQLStatistics
|
|
||||||
SQLTablePrivileges
|
|
||||||
SQLTables
|
|
||||||
|
|
||||||
SQLFreeStmt
|
|
||||||
SQLCancel
|
|
||||||
SQLTransact
|
|
||||||
|
|
||||||
SQLDisconnect
|
|
||||||
SQLFreeConnect
|
|
||||||
SQLFreeEnv
|
|
Reference in New Issue
Block a user