mirror of
https://github.com/gnustep/libs-gdl2.git
synced 2025-02-16 00:11:15 +00:00
*** empty log message ***
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@14993 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
commit
bf5ba60b07
165 changed files with 62782 additions and 0 deletions
4
AUTHORS
Normal file
4
AUTHORS
Normal file
|
@ -0,0 +1,4 @@
|
|||
Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Gerald Siebke <gerald@turbocat.de>
|
||||
Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
David Ayers <d.ayers@inode.at>
|
481
COPYING.LIB
Normal file
481
COPYING.LIB
Normal file
|
@ -0,0 +1,481 @@
|
|||
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!
|
751
ChangeLog
Normal file
751
ChangeLog
Normal file
|
@ -0,0 +1,751 @@
|
|||
2002-11-14 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
|
||||
* EOAcces/EODatabaseDataSource.m:
|
||||
o corrected bug in -description
|
||||
* EOAdaptors/Postgres95/Postgres95SQLExpression.m
|
||||
o change in +formatValue:forAttribute: to handle string value for dates
|
||||
|
||||
2002-11-14 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAdaptors/*, EOAccess/*, EOControl/*: removed some warnings.
|
||||
|
||||
2002-11-13 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAcces/EODatabaseContext.m:
|
||||
o corrected bug
|
||||
o logs
|
||||
* EOAccess/EODatabaseOperation.m:
|
||||
o -setDatabaseOperator: change to not update deleted objetcs
|
||||
* EOAccess/EOEntity.m:
|
||||
o -_attributesToFetch added exception handling
|
||||
* EOAccess/EOSQLExpression:
|
||||
o use sqlExpressionWithEntity instead of alloc/init
|
||||
* EOControl/EOEditingContext.m:
|
||||
o _processOwnedObjectsUsingChangeTable:deleteTable:
|
||||
bug correction in new/existing value handling
|
||||
o doc
|
||||
* EOControl/EOGenericRecord.m:
|
||||
o log changes
|
||||
* EOControl/EOKeyValueCoding.m:
|
||||
o added -takeStoredValue:forKeyPath:
|
||||
o added -storedValuesForKeyPaths:
|
||||
o corrected bug in NSArray -valueForKey:
|
||||
o corrected bugs in NSArray -valueForKeyPath:
|
||||
* EOAccess/EOUtilities.m
|
||||
o handle nil value in rawRowsMatchingValue:forKey:entityNamed:
|
||||
o handle nil value in objectsMatchingValue:forKey:entityNamed:
|
||||
o handle nil value in objectWithPrimaryKeyValue:entityNamed:
|
||||
* EOAccess/EOAttribute.m
|
||||
o destroy docComment in -dealloc
|
||||
* EOAdaptors/Postgres98/Postgres95Values.m:
|
||||
o comment
|
||||
o use stringWithCString.. instead of alloc/init/release
|
||||
* EOControl/EOMultipleKnownKeyDictionary.h
|
||||
o added -debugDescription
|
||||
* EOControl/EONull.m:
|
||||
o added -NSNull -valueForKey:
|
||||
* EOAccess/EOQualifier.m:
|
||||
o in getKey: autorelease key
|
||||
o in -qualifierWithQualifierFormat:varargList:
|
||||
user [NSMutableArray array] instead [NSMutableArray new]/DESTROY
|
||||
to avoid memory leak if an exception is raised
|
||||
|
||||
2002-11-04 David Ayers <d.ayers@inode.at>
|
||||
|
||||
* EOControl/EOSortOrdering.m:
|
||||
o changed -sortedArrayUsingKeyOrderArray:
|
||||
* EOControl/EOQualifier.m:
|
||||
o improved -qualifierWithQualifierFormat: parsing
|
||||
|
||||
2002-10-31 David Ayers <d.ayers@inode.at>
|
||||
|
||||
* EOControl/EOQualifier.m:
|
||||
o improved -qualifierWithQualifierFormat: parsing
|
||||
o added NSNumber -initWithString as EOQualiferExtra
|
||||
* EOControl/EOKeyValueQualifier.m:
|
||||
o changed -description
|
||||
* EOControl/EOKeyComparisonQualifier.m:
|
||||
o changed -description
|
||||
|
||||
2002-09-22 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* Makefile.postamble: install gdl2.make.
|
||||
|
||||
2002-09-22 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* configure.ac: added adaptors configuration.
|
||||
* config/postgres.m4: check for postgres db.
|
||||
* EOAdaptors/Postgres95/GNUmakefile.in: new file.
|
||||
* EOAdaptors/Postgres95/Makefile.preamble.in: new file.
|
||||
|
||||
2002-09-20 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* configure.ac: new file.
|
||||
* gdl2.make.in: new file.
|
||||
* config.h.in: new file.
|
||||
|
||||
2002-09-20 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* Indented all the sources and removed many warnings.
|
||||
* Moved EOCheapArray.m|h, EONSAddOns.m|h and EODebug.m|h to EOControl.
|
||||
* Moved EOUtilities.m|h to EOAccess.
|
||||
* Moved EOQualifierSQLGeneration in EOAccess/EOSQLQualifier
|
||||
|
||||
2002-06-03 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAdaptors/Postgres95/Postgres95SQLExpression.m:
|
||||
o NSWarn -> NSWarnLog
|
||||
* EOControl/EOKeyValueArchiver.m:
|
||||
o added -isThereValueForKey: in EOKeyValueUnarchiver
|
||||
* EOControl/EOKeyValueArchiver.h:
|
||||
o added -isThereValueForKey: in EOKeyValueUnarchiver
|
||||
* EOControl/EOSQLExpression.m:
|
||||
o changes for usesDistincts
|
||||
o logs
|
||||
* EOAccess/EODatabaseChannel.m:
|
||||
o fix for refetched objects
|
||||
* EOAccess/EODatabaseContext.m:
|
||||
o fixes in recordChangesInEditingContext
|
||||
* EOAccess/EODatabaseDataSource.m:
|
||||
o logs
|
||||
* EOAccess/EONSAddOns.h/.m
|
||||
o added NSArray -arrayExcludingObject:
|
||||
o added NSArray -containsIdenticalObjectsWithArray:
|
||||
* EOAccess/EORelationship.h/.m:
|
||||
o added isBidirectional: and associated methods (for use with smartTakeValue:forKey:)
|
||||
* EOControl/EOClassDescription.h/.m:
|
||||
o added -relationshipNamed:
|
||||
o added -anyRelationshipNamed:
|
||||
* EOControl/EOGenericRecord.m:
|
||||
o added -smartTakeValue:forKey:
|
||||
* EOControl/EOObjectStoreCoordinator.m:
|
||||
o logs
|
||||
|
||||
2002-05-14 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOControl/EOEditingContext.m:
|
||||
o changes in -saveChangesInEditingContext: to avoid return in the middle of the method
|
||||
o logs
|
||||
* EOAccess/EODatabaseContext.m:
|
||||
o add rollbackChanges on exception in -saveChangesInEditingContext:
|
||||
o corrected bug in initializeObject:row:entity:editingContext:
|
||||
o logs
|
||||
* EOControl/EOKeyValueQualifier.m:
|
||||
o implementation of flatten case in -schemaBasedQualifierWithRootEntity:
|
||||
o logs
|
||||
* EOControl/EODetailDataSource.m
|
||||
o correct bugs by using -decodeObjectForKey: in -initWithKeyValueUnarchiver:
|
||||
o changed _masterEntityName to _masterClassDescriptionName
|
||||
o added -classDescriptionForObjects
|
||||
o logs
|
||||
* EOControl/EODetailDataSource.h:
|
||||
o changed _masterEntityName to _masterClassDescriptionName
|
||||
o added -classDescriptionForObjects
|
||||
* EOControl/EODataSource.m:
|
||||
o logs
|
||||
* EOControl/EOGenericRecord.m:
|
||||
o added -willChange call in _setValueForKey:object:selector:type:size:offset:
|
||||
* EOControl/EOMutableKnownKeyDictionary.m:
|
||||
o corrected bug in -containsObjectsNotIdenticalTo:
|
||||
o logs
|
||||
* EOAccess/EOSQLExpression.m:
|
||||
o logs
|
||||
* EOAdaptors/Postgres95/Postgres95SQLExpression.m:
|
||||
o logs
|
||||
o corrected bugs for empty strings in +formatValue:forAttribute:
|
||||
* EOAccess/EODatabaseDataSource.m
|
||||
o logs
|
||||
* EOAccess/EOEntity.m
|
||||
o logs
|
||||
* EOControl/EOQualifier.m:
|
||||
o logs
|
||||
* EOControl/EOOrQualifier.m:
|
||||
o logs
|
||||
* EOControl/EOAndQualifier.m:
|
||||
o logs
|
||||
* EOControl/EOObserver.m:
|
||||
o logs
|
||||
* EOAccess/EODatabase.m:
|
||||
o logs
|
||||
o avoid fault access in -entityForObject:
|
||||
|
||||
2002-04-15 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAccess/EOFetchSpecification.m:
|
||||
o changed -fetchSpecification into +fetchSpecification
|
||||
* EOAccess/EOKeyValueCoding.m:
|
||||
o logs
|
||||
o corrected bug: added special case "count" in NSArray -valueForKeyPath:
|
||||
* EOAccess/EOGenericRecord.m:
|
||||
o logs
|
||||
* EOControl/EODetailDataSource.h:
|
||||
o added -initWithKeyValueUnarchiver:
|
||||
* EOControl/EODetailDataSource.m:
|
||||
o added -initWithKeyValueUnarchiver:
|
||||
* EOControl/EOKeyValueArcher.m:
|
||||
o added EOKeyValueArchivingContainer +keyValueArchivingContainer
|
||||
o corrected not autorelease bug in -_objectForPropertyList:
|
||||
o logs
|
||||
* EOControl/EODatabaseDataSource.m:
|
||||
o logs
|
||||
|
||||
2002-04-01 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAccess/EOModel.h:
|
||||
o added +version
|
||||
* EOAccess/EOStoredProcedure.h:
|
||||
o added +storedProcedureWithPropertyList:owner:
|
||||
* EOAccess/EOEntity.h:
|
||||
o added +entityWithPropertyList:owner:
|
||||
o added -setDocComment:
|
||||
o added +entityClassDescriptionWithEntity:
|
||||
* EOAccess/EOEntity.m:
|
||||
o corrected bug in _keyMapForIdenticalKeyRelationshipPath: (dictionary construction)
|
||||
* EOAccess/EOEntityPriv.h:
|
||||
o retyped -_parseDescription:isFormat:arguments:;
|
||||
* EOAccess/EORelationship.h:
|
||||
o added +relationshipWithPropertyList:owner:
|
||||
* EOAccess/EOAttribute.h:
|
||||
o added +attributeWithPropertyList:owner:
|
||||
o added -setInternalInfo:
|
||||
o added -_normalizeDefinition:path:
|
||||
|
||||
* EOAccess/EOAttribute.m:
|
||||
o use an id instead of a string for userInfo,...
|
||||
o added -setInternalInfo:
|
||||
* EOAccess/EOExpressionArray.h:
|
||||
o added -valueForSQLExpression:
|
||||
|
||||
2002-04-01 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOControl/EODetailDataSource.h/.m:
|
||||
o added +detailDataSourceWithMasterDataSource:detailKey:
|
||||
* EOAccess/EODatbaseDataSource.m:
|
||||
o changed allocations
|
||||
* EOAccess/EODatabase.m:
|
||||
o changed allocations
|
||||
* EOAccess/EOEntity.m:
|
||||
o changed allocations
|
||||
o corrected not autorelease bug in EOEntity -classDescriptionForInstances
|
||||
* EOControl/EOGlobalID.h/.m:
|
||||
o added EOTemporaryGlobalID +temporaryGlobalID
|
||||
* EOControl/EIEditingContext.m:
|
||||
o changed allocations
|
||||
* EOControl/EOKeyValueQualifier.m:
|
||||
o changed allocations
|
||||
* EOControl/EOObjectStoreCoordinator.m:
|
||||
o changed allocations
|
||||
* EOKeyComparisonQualifier.m:
|
||||
o added +qualifierWithLeftKey:operatorSelector:rightKey:
|
||||
* EONotQualifier.m:
|
||||
o added +qualifierWithQualifier:
|
||||
* EOQualifier.m:
|
||||
o changed allocations
|
||||
* EOAccess/EOAdaptorContext.h/.m:
|
||||
o added +adaptorContextWithAdaptor:
|
||||
* EOAdaptors/Postgres95/Postgres9Adaptor.m:
|
||||
o changed allocations
|
||||
* EOAdaptors/Postgres95/Postgres9Channel.m:
|
||||
o changed allocations
|
||||
* EOAdaptors/Postgres95/Postgres9Context.m:
|
||||
o changed allocations
|
||||
* EOAccess/EOModel.h/.m:
|
||||
o added +model
|
||||
* EOAccess/EOAdaptorChannel.h/.m
|
||||
o added +adaptorChannelWithAdaptorContext:
|
||||
* EOAdaptors/Postgres95/Postgres9Values.m:
|
||||
o changed allocations
|
||||
|
||||
2002-03-29 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAccess/EODatabaseOperation.m
|
||||
o logs
|
||||
* EOAccess/EODatabaseContext.h/.m
|
||||
o logs
|
||||
o added +databaseContextWithDatabase:
|
||||
o change allocations
|
||||
* EOAccess/EORelationship.m
|
||||
o logs
|
||||
o corrected not autorelease bug in _foreignKeyForSourceRow:
|
||||
o added +relationshipWithPropertyList:owner:
|
||||
* EOAccess/EOJoin.h/.m:
|
||||
o added +joinWithSourceAttribute:destinationAttribute:
|
||||
|
||||
* EOAccess/EOSQLExpression.m:
|
||||
o added +sqlExpressionWithEntity:
|
||||
* EOAccess/EOAttribute.m:
|
||||
o added +attributeWithPropertyList:owner:
|
||||
|
||||
* EOAdaptors/Postgres95/Postgres95Channel.m
|
||||
o logs
|
||||
* EOAccess/EODatabaseChannel.m
|
||||
o logs
|
||||
o added +databaseChannelWithDatabaseContext:
|
||||
* EOAccess/EOFault.m:
|
||||
o logs
|
||||
* EOAccess/EOFetchSpecification.m/.h
|
||||
o added +fetchSpecification
|
||||
* EOControl/EOUtilities.m:
|
||||
o corrected not autorelease bug in -objectsMatchingValues:entityNamed:
|
||||
o change qualifiers allocations
|
||||
* EOAccess/EOAndQualifier.m:
|
||||
o added EOAndQualifier +qualifierWithQualifierArray:
|
||||
o added EOAndQualifier +qualifierWithQualifiers:
|
||||
* EOAccess/EOOrQualifier.m:
|
||||
o added EOOrQualifier +qualifierWithQualifierArray:
|
||||
* EOAccess/EOQualifier.h
|
||||
o added EOAndQualifier +qualifierWithQualifierArray:
|
||||
o added EOOrQualifier +qualifierWithQualifierArray:
|
||||
* EOAccess/EOEntity.m:
|
||||
o changed EOMutableKnownKeyDictionary allocation in -_dictionaryForProperties
|
||||
* EOAccess/EOMutableKnownKeyDictionary.h/.m:
|
||||
o added +dictionaryFromDictionary:subsetMapping:
|
||||
* EOAccess/EOModel.h/.m
|
||||
o added +modelWithContentsOfFile:
|
||||
o corrected not autorelease bug
|
||||
o allocation changes
|
||||
* EOAccess/EOModelGroup.m:
|
||||
o Changed EOModel allocation
|
||||
* EOAccess/EODatabase.h/.m:
|
||||
o added +databaseWithModel:
|
||||
* EOAccess/EOAccessFault.h/.m
|
||||
o added EOAccessFaultHandler +accessFaultHandlerWithGlobalID:databaseContext:editingContext:
|
||||
o added EOAccessArrayFaultHandler
|
||||
+accessArrayFaultHandlerWithSourceGlobalID:relationshipName:databaseContext:editingContext:
|
||||
* EOAccess/EODatabaseOperation.h/.m:
|
||||
o added EODatabaseOperation +databaseOperationWithGlobalID:object:entity:
|
||||
* EOAccess/EOAdaptorOperation.h/.m:
|
||||
o added EOAdaptorOperation +adaptorOperationWithEntity:
|
||||
* EOAccess/EODatabaseDataSource.m:
|
||||
o allocation changes
|
||||
* EOAccess/EOStoredProcedure.m:
|
||||
o corrected not autorelease bug in -initWithPropertyList:owner:
|
||||
|
||||
|
||||
2002-03-28 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAccess/EODatabaseChannel.m
|
||||
o removed logs
|
||||
o changed logs
|
||||
* EOAdaptors/Postgres95/Postgres95Channel.m
|
||||
o removed logs
|
||||
* EOAccess/EORelationship.m:
|
||||
o NSAssert
|
||||
o added _docComment and associated methods
|
||||
* EOAccess/EORelationship.h:
|
||||
o added _docComment and associated methods
|
||||
* EOAccess/EOSQLExpression.m:
|
||||
o NSAssert
|
||||
o logs
|
||||
* EOAccess/EOEntity.m:
|
||||
o doc
|
||||
o logs
|
||||
o added _docComment and associated methods
|
||||
* EOAccess/EOEntity.h:
|
||||
o added _docComment and associated methods
|
||||
|
||||
* EOAccess/EOModel.h/.m:
|
||||
o added -adaptorClassname
|
||||
o added _version and -version
|
||||
o added _docComment and associated methods
|
||||
* EOAccess/EOAttribute.h/.m:
|
||||
o added _docComment and associated methods
|
||||
|
||||
* EOAccess/EOAdaptorChannel.m
|
||||
o logs
|
||||
* EOAdaptors/Postgres95/Postgres95SQLExpression.m:
|
||||
o corrected bug in formatValue:forAttribute:
|
||||
* added Tools/
|
||||
|
||||
2002-03-25 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
* EOAccess/GNUmakefile:
|
||||
o removed -SystemProjects System
|
||||
o added -Declared EOAccess
|
||||
* EOControl/GNUmakefile:
|
||||
o removed -SystemProjects System
|
||||
o added -Declared EOControl
|
||||
* EOAdaptors/Postgres95/GNUmakefile:
|
||||
o removed -SystemProjects System
|
||||
o added -Declared EOAdaptors/PostgreSQL
|
||||
* EOControl/EOGenericRecord.m: logs
|
||||
* EOAccess/EODebug.h: added EOFLOGClassFnStartCond EOFLOGClassFnStopCond
|
||||
* EOAccess/EODatabaseChannel.m: logs
|
||||
* EOAccess/EORelationship.m:
|
||||
o setDefinition
|
||||
o corrected bug in _makeFlattenedInverseRelationship
|
||||
* EOAccess/EOEntity.m
|
||||
o logs
|
||||
* EOControl/EOQualifier.h
|
||||
o added qualifierWithKey:operatorSelector:value:
|
||||
* EOControl/EOKeyValueQualifier.m:
|
||||
o added qualifierWithKey:operatorSelector:value:
|
||||
* EOAccess/EOModel.m:
|
||||
o removed assert for non EOGenericRecord class in -_classDescriptionNeeded:
|
||||
|
||||
2002-03-07 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Too much changes
|
||||
|
||||
2001-04-10 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOSQLExpression.m ([EOSQLExpression
|
||||
+foreignKeyConstraintStatementsForRelationship:]): implemented.
|
||||
|
||||
2001-04-07 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOKeyValueCoding.m: import EOControl.h
|
||||
* EOControl/EONull.m: likewise.
|
||||
* EOAccess/EOModel.m ([EOModel -writeToFile:]): implemented.
|
||||
([EOModel -encodeTableOfContentsInfoPropertyList:]): implemented.
|
||||
* EOAccess/EORelationship.m ([EORelationship -setEntity:]): remove self
|
||||
from previous entity.
|
||||
([EORelationship -setDefinition:]): remove joins.
|
||||
|
||||
2001-01-12 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOModeler: new library.
|
||||
* EOModeler/EOModelExtensions.m/.h: EOModeler categories needed by
|
||||
eogenerator.
|
||||
* EOControl/EOKeyValueCoding.m ([NSArray -valueForKey:]): fixed @x key.
|
||||
|
||||
2001-01-06 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOControl.h: defined FOUNDATION_HAS_KVC to use Foundation
|
||||
key value coding.
|
||||
* EOAccess/EOAttribute.m ([EOAttribute
|
||||
-adaptorValueByConvertingAttributeValue:]): use EONull null object.
|
||||
* EOAccess/EOSQLExpression.m ([EOSQLExpression -sqlStringForSelector:
|
||||
value:]): likewise.
|
||||
* EOControl/EOKeyValueCoding.m ([NSObject -takeValuesFromDictionary:]):
|
||||
([NSObject -takeStoredValuesFromDictionary:]): likewise.
|
||||
defined FOUNDATION_HAS_KVC to use Foundation key value coding.
|
||||
|
||||
2001-01-03 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-faultForGlobalID:editingContext:]): use the correct class property
|
||||
array.
|
||||
|
||||
2000-12-23 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOEntity.m ([EOEntity -isPrimaryKeyValidInObject:]): fixed.
|
||||
Do not returns from inside an exception handler.
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-prepareForSaveWithCoordinator:editingContext:]): bug fix. Do not
|
||||
release an autoreleased object.
|
||||
* EOAccess/EODatabaseDataSource.m ([EODatabaseDataSource
|
||||
-fetchSpecificationForFetch]): fixed fetch qualifier.
|
||||
* EOControl/EOKeyValueQualifier.m ([EOKeyValueQualifier
|
||||
-copyWithZone:]): do not copy _value.
|
||||
* EOControl/EOAndQualifier.m ([EOAndQualifier -copyWithZone:]): use
|
||||
correct zone.
|
||||
* EOControl/EOOrQualifier.m ([EOOrQualifier -copyWithZone:]): likewise.
|
||||
* EOControl/EOKeyComparisonQualifier.m ([EOKeyComparisonQualifier
|
||||
-copyWithZone:]): likewise.
|
||||
|
||||
2000-12-20 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-_recordChangesForObjects:operator:]): create dbOperation with the
|
||||
correct entity for to-many relationship objects.
|
||||
|
||||
2000-12-11 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOModel.m ([EOModel -_registerClassDescForClass:]):
|
||||
check for NULL _entitiesByClass
|
||||
([EOModel -dealloc]): release _entitiesByClass
|
||||
([EOModel -removeEntity:]): bug fix.
|
||||
|
||||
* EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres
|
||||
-_evaluateCommandsUntilAFetch]): raise an exception on error.
|
||||
|
||||
2000-12-10 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOKeyValueCoding.m (newGetStoredBinding): fixed value of
|
||||
class variable.
|
||||
|
||||
2000-12-09 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOModel.m ([EOModel -_registerClassDescForClass:]): fixed
|
||||
class description registration.
|
||||
([EOModel -_registerClassDescForEntityName:]): likewise.
|
||||
([EOModel -addEntity:]), ([EOModel -removeEntity:]): save EOEntity in
|
||||
_entitiesByClass.
|
||||
|
||||
2000-12-08 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-prepareForSaveWithCoordinator:editingContext:]): get the object value
|
||||
if the key is a class property.
|
||||
Added code to handle propagatesPrimaryKey for to many relationships.
|
||||
Fixed code that merges pk values.
|
||||
* EOControl/EOClassDescription.m ([EOClassDescription -awakeObject:
|
||||
fromInsertionInEditingContext:]): use NSMutableArray for to many
|
||||
relationships.
|
||||
|
||||
2000-12-08 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext -faultForGlobalID:
|
||||
editingContext:]): set only class property's object values.
|
||||
([EODatabaseContext -faultForRawRow:entityNamed:editingContext:]):
|
||||
likewise.
|
||||
([EODatabaseContext -_recordChangesForObjects:operator:]): likewise.
|
||||
([EODatabaseContext -batchFetchRelationship:forSourceObjects:
|
||||
editingContext:]): get key value from snapshot rather than in the
|
||||
object.
|
||||
|
||||
2000-12-06 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOKeyValueCoding.m ([NSObject
|
||||
-handleQueryWithUnboundKey:]): raise an EOUnknownKeyException with
|
||||
the correct userInfo.
|
||||
([NSObject -handleTakeValue:forUnboundKey:]): likewise.
|
||||
* EOAccess/EOEntity.m ([EOEntity -isPrimaryKeyValidInObject:]):
|
||||
check valueForKey: exception.
|
||||
* EOControl/EOClassDescription.m ([NSObject -changesFromSnapshot:]):
|
||||
check for EONull values as toMany relationship array.
|
||||
* EOControl/EOEditingContext.m ([EOEditingContext
|
||||
-processRecentChanges]): check for EONull values in dictionary.
|
||||
* EOAccess/EOModel.m ([EOModel -initWithPropertyList:owner:]): check
|
||||
for an exception in the entity awakeWithPropertyList method.
|
||||
* EOAccess/EOJoin.m ([EOJoin -initWithSourceAttribute:
|
||||
destinationAttribute:]): raise exception if source or destination is
|
||||
nil.
|
||||
|
||||
2000-12-05 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseChannel.m ([EODatabaseChannel -fetchObject]):
|
||||
fixed refreshing objects.
|
||||
* EOControl/EOKeyValueCoding.m ([NSArray -valueForKey:]): fixed array
|
||||
and string selector.
|
||||
* EOAccess/EOUtilities.m ([EOEditingContext -objectsForEntityNamed:]):
|
||||
([EOEditingContext -primaryKeyForObject:]), ([EOEditingContext
|
||||
-entityForObject:]): implemented.
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-prepareForSaveWithCoordinator:editingContext:]): lock the database
|
||||
context.
|
||||
([EODatabaseContext -commitChanges]), ([EODatabaseContext
|
||||
-rollbackChanges]): unlock the database context
|
||||
([EODatabaseContext -registerLockedObjectWithGlobalID:]): fixed zone
|
||||
size.
|
||||
|
||||
2000-12-04 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-_recordChangesForObjects:operator:]): when updating relationship keys
|
||||
look also in the object snapshot.
|
||||
|
||||
2000-12-03 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOSQLExpression.m ([EOSQLExpression
|
||||
-sqlStringForKeyValueQualifier:]): bug fix.
|
||||
* EOAccess/EOUtilities.m ([EOEditingContext -objectsMatchingValue:
|
||||
forKey:entityNamed:]): implemented.
|
||||
|
||||
2000-12-01 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EOUtilities.m/.h: new files.
|
||||
* EOAccess/EOAccess.h: addes EOUtilities.h
|
||||
|
||||
2000-11-23 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOEditingContext.m ([EOEditingContext
|
||||
-initializeObject:withGlobalID:editingContext:]): ensure that the next
|
||||
'willChange' notification will be processed for the initialized object.
|
||||
* EOAccess/EOEntity.m ([EOEntity -globalIDForRow:]): fixed globalID
|
||||
values order for compound PKs.
|
||||
|
||||
2000-11-22 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAccess/EODatabaseOperationPriv.h: new file.
|
||||
* EOAccess/EODatabaseOperation.m ([EODatabaseOperation
|
||||
-_setGlobalID:]): new method.
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-prepareForSaveWithCoordinator:editingContext:]): fixed propagates
|
||||
primary key code.
|
||||
([EODatabaseContext -_recordChangesForObjects:operator:]): in toOne rel
|
||||
discard PK to PK joins. Discard 'empty' toOne rels.
|
||||
([EODatabaseContext -_setGlobalID:forDatabaseOperation:): new method.
|
||||
It replaces the globalID for the gived operation.
|
||||
* EOAccess/EORelationship.m ([EORelationship
|
||||
-initWithPropertyList:owner:]): check for 'propagatesPrimaryKey'.
|
||||
* EOAccess/EOSQLExpression.m ([EOSQLExpression
|
||||
-addOrderByAttributeOrdering:]): use compare selector defines. Call
|
||||
-sqlStringForAttributeNamed: for the sortOrdering key.
|
||||
|
||||
2000-11-19 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOFault.m ([EOFault +makeObjectIntoFault:withHandler:]):
|
||||
do not turn into fault the nil object.
|
||||
* EOControl/EOEditingContext.m ([EOEditingContext
|
||||
-refaultObject:withGlobalID:editingContext:]): does nothing if objects
|
||||
is nil.
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-refaultObject:withGlobalID:editingContext:]): likewise.
|
||||
([EODatabaseContext -refaultObject:withGlobalID:editingContext:]): does
|
||||
not remove the snapshot.
|
||||
([EODatabaseChannel -fetchObject]): fix for refreshing object.
|
||||
* EOControl/EOSortOrdering.m ([NSMutableArray
|
||||
-_sortUsingKeyOrder:fromIndex:count:]): use defined value for compare
|
||||
selectors. Fix when aValue or bValue are nil.
|
||||
([EONull -compareAscending:]), ([EONull -compareDescending:]),
|
||||
([EONull -compareCaseInsensitiveAscending:]): ([EONull
|
||||
-compareCaseInsensitiveDescending:]): if value to be compared is be
|
||||
treat it as EONull.
|
||||
|
||||
2000-11-18 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOEditingContext.m ([EOEditingContext
|
||||
-processRecentChanges]): get toOne and toMany keys from object instead
|
||||
of the editingContext.
|
||||
|
||||
* EOAccess/EODatabaseContext.m ([EODatabaseContext
|
||||
-_recordChangesForObjects:operator:]): new method. Fixed foreign key
|
||||
update for inserted objects of toOne relationships. Fixed dictionary
|
||||
and foreign key update for toMany relationships.
|
||||
([EODatabaseContext -recordChangesInEditingContext]): moved code into
|
||||
-_recordChangesForObjects:operator: and check changes also in inserted
|
||||
objects.
|
||||
([EODatabaseContext -_dbOperationWithObject:operator:]): new method.
|
||||
Find db operation for the given object and operator.
|
||||
([EODatabaseContext -commitChanges]), ([EODatabaseContext
|
||||
-rollbackChanges]): reset ivars if no transaction in progress.
|
||||
|
||||
2000-11-16 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOEditingContext.m ([EOEditingContext
|
||||
-_handleObjectsChangedInStoreNotification:]): refault updated objects.
|
||||
|
||||
* EOAccess/EODatabaseChannel.m ([EODatabaseChannel -fetchObject]):
|
||||
fixed notification for refreshed objects.
|
||||
* EOAccess/EOSQLExpression.m ([EOSQLExpression
|
||||
-sqlStringForAttribute:]): fix id attribute is derived.
|
||||
* EOAccess/EOEntity.m ([EOEntity -setAttributesUsedForLocking:]): fix
|
||||
release of the array when no valid attributes are found.
|
||||
([EOEntity -setPrimaryKeyAttributes:]): likewise.
|
||||
* EOAccess/EODatabase.m ([EODatabase -forgetSnapshotsForGlobalIDs:]):
|
||||
([EODatabase -forgetSnapshotForGlobalID:]): use defined userInfo string
|
||||
instead of an hardcoded one.
|
||||
|
||||
2000-11-05 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOSortOrdering.m ([NSArray
|
||||
-sortedArrayUsingKeyOrderArray:]): implemented.
|
||||
([NSMutableArray -sortUsingKeyOrderArray:]): not fully implemented.
|
||||
([NSMutableArray -_sortUsingKeyOrder:fromIndex:count:]): modified
|
||||
gnustep-base shell sort.
|
||||
([EOSortOrdering -initWithCoder:]): fixed.
|
||||
([EONull -compareAscending:]): implemented.
|
||||
([EONull -compareDescending:]): implemented.
|
||||
([EONull -compareCaseInsensitiveAscending:]): implemented.
|
||||
([EONull -compareCaseInsensitiveDescending:]): implemented.
|
||||
|
||||
* EOAdaptors/Postgres95/Postgres95Channel.m ([Postgres
|
||||
-_describeResults]): does not coerce attribute className.
|
||||
* EOAdaptors/Postgres95/Postgres95Values.m: fixed pg calendar format.
|
||||
* EOAdaptors/Postgres95/Postgres95SQLExpression.m ([Postgres -assembleSelectStatementWithAttributes:lock:qualifier:fetchOrder:selectString:columnList:tableList:whereClause:joinClause:orderByClause:lockClause:]): does not return
|
||||
mutableCopy of the string.
|
||||
([Postgres +formatValue:forAttribute:]): implemented. Added code from
|
||||
Turbocat's development.
|
||||
|
||||
* EOAccess/EOSQLExpression.m: does not return mutableCopy of a string.
|
||||
([EOSQLExpression +formatValue:forAttribute:]): return value unchanged.
|
||||
([EOSQLExpression -sqlStringForValue:attributeNamed:]): bug fix ?
|
||||
moved code from +[formatValue:forAttribute:]
|
||||
|
||||
* EOControl/EOAndQualifier.m ([EOAndQualifier
|
||||
-sqlStringForSQLExpression:]): doesn't return mutableCopy of a string.
|
||||
* EOControl/EOOrQualifier.m ([EOOrQualifier
|
||||
-sqlStringForSQLExpression:]): likewise.
|
||||
|
||||
* EOControl/EODetailDataSource.m ([EODetailDataSource
|
||||
-initWithMasterClassDescription:detailKey:]): set
|
||||
masterClassDescription.
|
||||
|
||||
* EOAccess/EOSQLExpression.m
|
||||
([EOSQLExpression -addCreateClauseForAttribute:]):
|
||||
([EOSQLExpression -allowsNullClauseForConstraint:]):
|
||||
([EOSQLExpression -columnTypeStringForAttribute:]):
|
||||
([EOSQLExpression +dropTableStatementsForEntityGroup:]):
|
||||
([EOSQLExpression +createTableStatementsForEntityGroup:]):
|
||||
([EOSQLExpression +primaryKeyConstraintStatementsForEntityGroup:]):
|
||||
([EOSQLExpression +primaryKeySupportStatementsForEntityGroup:]):
|
||||
([EOSQLExpression +dropPrimaryKeySupportStatementsForEntityGroup:]):
|
||||
([EOSQLExpression +createTableStatementsForEntityGroups:]):
|
||||
([EOSQLExpression +dropTableStatementsForEntityGroups:]):
|
||||
([EOSQLExpression +primaryKeyConstraintStatementsForEntityGroups:]):
|
||||
([EOSQLExpression +primaryKeySupportStatementsForEntityGroups:]):
|
||||
([EOSQLExpression +dropPrimaryKeySupportStatementsForEntityGroups:]):
|
||||
([EOSQLExpression +appendExpression:toScript:]):
|
||||
([EOSQLExpression +schemaCreationScriptForEntities:options:]):
|
||||
([EOSQLExpression +schemaCreationStatementsForEntities:options:]):
|
||||
([EOSQLExpression -prepareConstraintStatementForRelationship:
|
||||
sourceColumns:destinationColumns:]):
|
||||
([EOSQLExpression +createDatabaseStatementsForConnectionDictionary:
|
||||
administrativeConnectionDictionary:]):
|
||||
([EOSQLExpression +dropDatabaseStatementsForConnectionDictionary:
|
||||
administrativeConnectionDictionary:]):
|
||||
([EOSQLExpression +selectStatementForContainerOptions]): implemented.
|
||||
|
||||
* EOAccess/EOEntity.m ([EOEntity -primaryKeyRootName]): bug fix: calls
|
||||
-primaryKeyRootName on the _parent entity instead of -externalName.
|
||||
|
||||
* EOAccess/EOSchemaGeneration.h: new file.
|
||||
|
||||
* EOAccess/EOAccess.h: added EOSchemaGeneration.h
|
||||
|
||||
* EOAccess/EOModel.m ([EOModel -initWithContentsOfFile:]):,
|
||||
([EOModel -initWithTableOfContentsPropertyList:path:]): fixed _name and
|
||||
_path.
|
||||
([EOModel -initWithPropertyList:owner:]): use _path instead of _name.
|
||||
|
||||
* EOAccess/EOModelGroup.m ([EOModelGroup +globalModelGroup]): search
|
||||
models in bundles and frameworks.
|
||||
|
||||
* EOAccess/EOAdaptor.m ([EOAdaptor +adaptorWithName:]): changed adaptor
|
||||
from bundle to framework. Looks for <name>EOAdaptor.framework
|
||||
([EOAdaptor -createDatabaseWithAdministrativeConnectionDictionary:]):
|
||||
([EOAdaptor -dropDatabaseWithAdministrativeConnectionDictionary:]):
|
||||
new methods.
|
||||
* EOAccess/EOAdaptor.h: added include file
|
||||
|
||||
* EOAccess/GNUmakefile: added LIBRARIES_DEPEND_UPON
|
||||
* EOControl/GNUmakefile: Likewise.
|
||||
|
||||
2000-10-05 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
|
||||
* EOAccess/EODatabaseChannel.m: added NSDebugMLog and NSAssert
|
||||
* EOAccess/EODatabaseDataSource.m: added NSDebugMLog and NSAssert
|
||||
* EOAccess/EOEntity.m: added NSDebugMLog and NSAssert
|
||||
* EOAccess/EOModel.m: modified -init
|
||||
* EOControl/EOFetchSpecification.h/.m: added EOKeyValueUnarchiver support
|
||||
* EOControl/EOKeyValueArchiver.h/.m: implemented EOKeyValueUnarchiver
|
||||
* EOControl/GNUmakefile: added EOKeyValueArchiver
|
||||
|
||||
2000-09-28 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
|
||||
* EOAccess/EODatabaseContext.m: added NSDebugMLog and NSAssert
|
||||
* EOAccess/EODatabaseChannel.m: added NSDebugMLog and NSAssert
|
||||
* EOAdaptors/Postgres95/Postgres95Channel.m : added NSDebugMLog
|
||||
and NSAssert
|
||||
* EOAccess/EODatabase.m: added NSDebugMLog and NSAssert
|
||||
|
||||
2000-09-24 Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
|
||||
* config.mak: added include directories in POSTGRES95_CFLAGS
|
||||
|
||||
2000-09-23 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOControl/EOQualifier.m (getKey): fixed pointer in key-value parsing.
|
||||
|
||||
2000-09-17 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
* EOAdaptors/Postgres95/GNUmakefile: remove Postgres95Exceptions.h
|
||||
|
||||
2000-09-17 Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
|
||||
Patches by David Wetzel <dave@turbocat.de>
|
||||
* EOAccess/EOAdaptorContext.m ([EOAdaptorContext -initWithAdaptor:]):
|
||||
set default debug.
|
||||
|
||||
* EOAccess/EOModel.m ([EOModel +findPathForModelNamed:]): look also
|
||||
in the current dir.
|
||||
|
||||
* EOControl/EOObjectStoreCoordinator.m ([EOObjectStoreCoordinator
|
||||
-objectStoreForGlobalID:]), ([EOObjectStoreCoordinator
|
||||
-objectStoreForObject:]), ([EOObjectStoreCoordinator
|
||||
-objectStoreForFetchSpecification:]): bug fix: changed notification
|
||||
object.
|
||||
|
||||
|
73
EOAccess/EOAccess.h
Normal file
73
EOAccess/EOAccess.h
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
EOAccess.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAccess_h__
|
||||
#define __EOAccess_h__
|
||||
|
||||
#import <extensions/objc-runtime.h>
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSCharacterSet.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSNotification.h>
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSPathUtilities.h>
|
||||
#import <Foundation/NSRange.h>
|
||||
#import <Foundation/NSScanner.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSZone.h>
|
||||
#import <Foundation/NSCoder.h>
|
||||
#import <Foundation/NSArchiver.h>
|
||||
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EODatabase.h>
|
||||
#import <EOAccess/EODatabaseChannel.h>
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOJoin.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOModelGroup.h>
|
||||
#import <EOAccess/EORelationship.h>
|
||||
#import <EOAccess/EOStoredProcedure.h>
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
#import <EOAccess/EOSQLQualifier.h>
|
||||
#import <EOAccess/EODatabaseDataSource.h>
|
||||
#import <EOAccess/EOSchemaGeneration.h>
|
||||
#import <EOAccess/EOUtilities.h>
|
||||
|
||||
|
||||
#endif /* __EOAccess_h__ */
|
114
EOAccess/EOAccessFault.h
Normal file
114
EOAccess/EOAccessFault.h
Normal file
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
EOAccessFault.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAccessFault_h__
|
||||
#define __EOAccessFault_h__
|
||||
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
|
||||
@class EODatabaseContext;
|
||||
@class EOKeyGlobalID;
|
||||
|
||||
|
||||
@interface EOAccessGenericFaultHandler:EOFaultHandler
|
||||
{
|
||||
unsigned int _generation;
|
||||
EOAccessGenericFaultHandler *_next;
|
||||
EOAccessGenericFaultHandler *_prev;
|
||||
}
|
||||
|
||||
- (void)linkAfter: (EOAccessGenericFaultHandler *)faultHandler
|
||||
usingGeneration: (unsigned int)gen;
|
||||
- (EOAccessGenericFaultHandler *)next;
|
||||
- (EOAccessGenericFaultHandler *)previous;
|
||||
- (unsigned int)generation;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAccessFaultHandler:EOAccessGenericFaultHandler
|
||||
{
|
||||
EOKeyGlobalID *gid;
|
||||
EODatabaseContext *databaseContext;
|
||||
EOEditingContext *editingContext;
|
||||
}
|
||||
|
||||
+ (EOAccessFaultHandler *)accessFaultHandlerWithGlobalID: (EOKeyGlobalID *)globalID
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec;
|
||||
|
||||
- initWithGlobalID: (EOKeyGlobalID *)globalID
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec;
|
||||
|
||||
- (EOKeyGlobalID *)globalID;
|
||||
- (EODatabaseContext *)databaseContext;
|
||||
- (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAccessArrayFaultHandler:EOAccessGenericFaultHandler
|
||||
{
|
||||
EOKeyGlobalID *sgid;
|
||||
NSString *relationshipName;
|
||||
EODatabaseContext *databaseContext;
|
||||
EOEditingContext *editingContext;
|
||||
id copy;
|
||||
}
|
||||
|
||||
+ (EOAccessArrayFaultHandler *)accessArrayFaultHandlerWithSourceGlobalID: (EOKeyGlobalID *)sourceGID
|
||||
relationshipName: (NSString *)relationshipName
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec;
|
||||
|
||||
- initWithSourceGlobalID: (EOKeyGlobalID *)sourceGID
|
||||
relationshipName: (NSString *)relationshipName
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec;
|
||||
|
||||
- (EOKeyGlobalID *)sourceGlobalID;
|
||||
- (NSString *)relationshipName;
|
||||
- (EODatabaseContext *)databaseContext;
|
||||
- (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOAccessFaultUnableToFaultToOne)
|
||||
|
||||
- (void)unableToFaultObject:(id)object
|
||||
databaseContext:(EODatabaseContext *)context;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
extern NSString *EOAccessFaultObjectNotAvailableException;
|
||||
|
||||
|
||||
#endif
|
324
EOAccess/EOAccessFault.m
Normal file
324
EOAccess/EOAccessFault.m
Normal file
|
@ -0,0 +1,324 @@
|
|||
/**
|
||||
EOAccessFault.m <title>EOAccessFault Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
|
||||
#import <EOAccess/EOAccessFault.h>
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
#import <EOAccess/EODatabaseContextPriv.h>
|
||||
|
||||
#import <EOControl/EOCheapArray.h>
|
||||
|
||||
|
||||
NSString *EOAccessFaultObjectNotAvailableException = @"EOAccessFaultObjectNotAvailableException";
|
||||
|
||||
|
||||
@implementation EOAccessGenericFaultHandler
|
||||
|
||||
- (void)linkAfter: (EOAccessGenericFaultHandler *)faultHandler
|
||||
usingGeneration: (unsigned int)gen
|
||||
{
|
||||
_generation = gen;
|
||||
|
||||
_prev = faultHandler;
|
||||
_next = faultHandler->_next;
|
||||
|
||||
faultHandler->_next = self;
|
||||
|
||||
if(_next)
|
||||
_next->_prev = self;
|
||||
}
|
||||
|
||||
- (void)_linkNext: (EOAccessGenericFaultHandler *)next
|
||||
{
|
||||
if(_next)
|
||||
_next->_prev = nil;
|
||||
|
||||
_next = next;
|
||||
|
||||
if(next)
|
||||
next->_prev = self;
|
||||
}
|
||||
|
||||
- (void)_linkPrev: (EOAccessGenericFaultHandler *)prev
|
||||
{
|
||||
if(_prev)
|
||||
_prev->_next = nil;
|
||||
|
||||
_prev = prev;
|
||||
|
||||
if(prev)
|
||||
prev->_next = self;
|
||||
}
|
||||
|
||||
- (EOAccessGenericFaultHandler *)next
|
||||
{
|
||||
return _next;
|
||||
}
|
||||
|
||||
- (EOAccessGenericFaultHandler *)previous
|
||||
{
|
||||
return _prev;
|
||||
}
|
||||
|
||||
- (unsigned int)generation
|
||||
{
|
||||
return _generation;
|
||||
}
|
||||
|
||||
- (void)faultWillFire: (id)object
|
||||
{
|
||||
//TODO change le prev, met à 0
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@implementation EOAccessFaultHandler
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (EOAccessFaultHandler *)accessFaultHandlerWithGlobalID: (EOKeyGlobalID *)globalID
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec
|
||||
{
|
||||
return [[[self alloc] initWithGlobalID: globalID
|
||||
databaseContext: dbcontext
|
||||
editingContext: ec] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithGlobalID: (EOKeyGlobalID *)globalID
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
EOFLOGObjectFnStartOrCond(@"EOAccesFaultHandler");
|
||||
|
||||
ASSIGNCOPY(gid, globalID);
|
||||
ASSIGN(databaseContext, dbcontext);
|
||||
ASSIGN(editingContext, ec);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
EOFLOGObjectFnStopOrCond(@"EOAccesFaultHandler");
|
||||
|
||||
DESTROY(gid);
|
||||
DESTROY(databaseContext);
|
||||
DESTROY(editingContext);
|
||||
}
|
||||
|
||||
- (EOKeyGlobalID *)globalID
|
||||
{
|
||||
#ifdef DEBUG
|
||||
EOFLOGObjectFnStartOrCond(@"EOAccesFaultHandler");
|
||||
EOFLOGObjectFnStopOrCond(@"EOAccesFaultHandler");
|
||||
#endif
|
||||
|
||||
return gid;
|
||||
}
|
||||
|
||||
- (EODatabaseContext *)databaseContext
|
||||
{
|
||||
return databaseContext;
|
||||
}
|
||||
|
||||
- (EOEditingContext *)editingContext
|
||||
{
|
||||
return editingContext;
|
||||
}
|
||||
|
||||
- (void)completeInitializationOfObject:(id)anObject
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
[databaseContext _fireFault: anObject];
|
||||
|
||||
//MIRKO: replaced
|
||||
/*
|
||||
[databaseContext _batchToOne:anObject
|
||||
withHandler:self];
|
||||
*/
|
||||
|
||||
if ([EOFault isFault: anObject] == YES)
|
||||
{
|
||||
NSDebugMLLog(@"error", @"UnableToFaultObject: %p of class %@",
|
||||
anObject,
|
||||
[EOFault targetClassForFault: anObject]);
|
||||
[self unableToFaultObject: anObject
|
||||
databaseContext: databaseContext];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)shouldPerformInvocation: (NSInvocation *)invocation
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSObject (EOAccessFaultUnableToFaultToOne)
|
||||
|
||||
- (void)unableToFaultObject: (id)object
|
||||
databaseContext: (EODatabaseContext *)context
|
||||
{
|
||||
EOFaultHandler *handler = [EOFault handlerForFault:object];
|
||||
EOGlobalID *globalID = nil;
|
||||
|
||||
if ([handler respondsToSelector: @selector(globalID)])
|
||||
globalID = [(EOAccessFaultHandler *)handler globalID];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"Fault Handler=%@ (%@)", handler, [handler class]);
|
||||
|
||||
[NSException raise: EOAccessFaultObjectNotAvailableException
|
||||
format: @"%@ -- %@ 0x%x: cannot fault to-one for object %@ of class %@ databaseContext %@ handler %@ (globalID=%@)",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
object,
|
||||
[EOFault targetClassForFault: object],
|
||||
context,
|
||||
handler,
|
||||
globalID];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAccessArrayFaultHandler
|
||||
|
||||
+ (EOAccessArrayFaultHandler *)accessArrayFaultHandlerWithSourceGlobalID: (EOKeyGlobalID *)sourceGID
|
||||
relationshipName: (NSString *)aRelationshipName
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec
|
||||
{
|
||||
return [[[self alloc] initWithSourceGlobalID: sourceGID
|
||||
relationshipName: aRelationshipName
|
||||
databaseContext: dbcontext
|
||||
editingContext: ec] autorelease];
|
||||
}
|
||||
|
||||
- initWithSourceGlobalID: (EOKeyGlobalID *)sourceGID
|
||||
relationshipName: (NSString *)relName
|
||||
databaseContext: (EODatabaseContext *)dbcontext
|
||||
editingContext: (EOEditingContext *)ec
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(sgid, sourceGID);
|
||||
ASSIGN(relationshipName, relName);
|
||||
ASSIGN(databaseContext, dbcontext);
|
||||
ASSIGN(editingContext, ec);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(sgid);
|
||||
DESTROY(relationshipName);
|
||||
DESTROY(databaseContext);
|
||||
DESTROY(editingContext);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (EOKeyGlobalID *)sourceGlobalID
|
||||
{
|
||||
return sgid;
|
||||
}
|
||||
|
||||
- (NSString *)relationshipName
|
||||
{
|
||||
return relationshipName;
|
||||
}
|
||||
|
||||
- (EODatabaseContext *)databaseContext
|
||||
{
|
||||
return databaseContext;
|
||||
}
|
||||
|
||||
- (EOEditingContext *)editingContext
|
||||
{
|
||||
return editingContext;
|
||||
}
|
||||
|
||||
- (void)completeInitializationOfObject: (id)anObject
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
[databaseContext _fireArrayFault: anObject];
|
||||
[(EOCheapCopyMutableArray *)anObject _setCopy: NO];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"anObject %p=%@", anObject, anObject);
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
/*MIRKO replaced
|
||||
[databaseContext _batchToMany:anObject
|
||||
withHandler:self];
|
||||
*/
|
||||
}
|
||||
|
||||
- (id) descriptionForObject: (id)object
|
||||
{
|
||||
//OK
|
||||
return [NSString stringWithFormat: @"<ArrayFault(%p) source: %@ relationship: %@>",
|
||||
object,
|
||||
sgid,
|
||||
relationshipName];
|
||||
}
|
||||
|
||||
- (BOOL)shouldPerformInvocation: (NSInvocation *)invocation
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
37
EOAccess/EOAccessFaultPriv.h
Normal file
37
EOAccess/EOAccessFaultPriv.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
EOAccessFaultPriv.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAccessFaultPriv_h__
|
||||
#define __EOAccessFaultPriv_h__
|
||||
|
||||
@interface EOAccessGenericFaultHandler (EOAccessFaultPrivate)
|
||||
|
||||
- (void)_linkNext: (EOAccessGenericFaultHandler *)next;
|
||||
- (void)_linkPrev: (EOAccessGenericFaultHandler *)prev;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
172
EOAccess/EOAdaptor.h
Normal file
172
EOAccess/EOAdaptor.h
Normal file
|
@ -0,0 +1,172 @@
|
|||
/*
|
||||
EOAdaptor.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAdaptor_h__
|
||||
#define __EOAdaptor_h__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
|
||||
@class NSMutableArray;
|
||||
@class NSDictionary;
|
||||
@class NSString;
|
||||
@class NSNumber;
|
||||
|
||||
@class EOModel;
|
||||
@class EOAttribute;
|
||||
@class EOAdaptorContext;
|
||||
@class EOLoginPanel;
|
||||
@class EOEntity;
|
||||
|
||||
extern NSString *EOGeneralAdaptorException;
|
||||
|
||||
|
||||
@interface EOAdaptor : NSObject
|
||||
{
|
||||
EOModel *_model;//Not in EOFD
|
||||
|
||||
NSString *_name;
|
||||
NSDictionary *_connectionDictionary;
|
||||
NSMutableArray *_contexts; // values with contexts
|
||||
NSString *_expressionClassName;
|
||||
Class _expressionClass;
|
||||
id _delegate; // not retained
|
||||
|
||||
struct {
|
||||
unsigned processValue:1;
|
||||
} _delegateRespondsTo;
|
||||
}
|
||||
|
||||
/* Creating an EOAdaptor */
|
||||
+ (EOAdaptor *)adaptorWithModel: (EOModel *)model;
|
||||
+ (EOAdaptor *)adaptorWithName: (NSString *)name;
|
||||
|
||||
+ (void)setExpressionClassName: (NSString *)sqlExpressionClassName
|
||||
adaptorClassName: (NSString *)adaptorClassName;
|
||||
+ (EOLoginPanel *)sharedLoginPanelInstance;
|
||||
|
||||
+ (NSArray *)availableAdaptorNames;
|
||||
+ (NSArray *)prototypes;
|
||||
|
||||
- initWithName:(NSString *)name;
|
||||
|
||||
/* Getting an adaptor's name */
|
||||
- (NSString *)name;
|
||||
|
||||
/* Creating and removing an adaptor context */
|
||||
- (EOAdaptorContext *)createAdaptorContext;
|
||||
- (NSArray *)contexts;
|
||||
|
||||
/* Setting the model */
|
||||
- (void)setModel: (EOModel*)aModel;//Not in EOFD
|
||||
- (EOModel*)model;//Not in EOFD
|
||||
|
||||
/* Checking connection status */
|
||||
- (BOOL)hasOpenChannels;
|
||||
|
||||
/* Getting adaptor-specific information */
|
||||
- (Class)expressionClass;
|
||||
- (Class)defaultExpressionClass;
|
||||
|
||||
/* Reconnection to database */
|
||||
- (void)handleDroppedConnection;
|
||||
- (BOOL)isDroppedConnectionException: (NSException *)exception;
|
||||
|
||||
/* Setting connection information */
|
||||
- (void)setConnectionDictionary: (NSDictionary*)aDictionary;
|
||||
- (NSDictionary *)connectionDictionary;
|
||||
- (void)assertConnectionDictionaryIsValid;
|
||||
|
||||
- (BOOL)canServiceModel: (EOModel *)model;
|
||||
|
||||
- (NSStringEncoding)databaseEncoding;
|
||||
|
||||
- (id)fetchedValueForValue: (id)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
- (NSString *)fetchedValueForStringValue: (NSString *)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
- (NSNumber *)fetchedValueForNumberValue: (NSNumber *)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
- (NSCalendarDate *)fetchedValueForDateValue: (NSCalendarDate *)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
- (NSData *)fetchedValueForDataValue: (NSData *)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
/* Setting the delegate */
|
||||
- (id)delegate;
|
||||
- (void)setDelegate: delegate;
|
||||
|
||||
@end /* EOAdaptor */
|
||||
|
||||
|
||||
@interface EOAdaptor (EOAdaptorLoginPanel)
|
||||
|
||||
- (BOOL)runLoginPanelAndValidateConnectionDictionary;
|
||||
- (NSDictionary *)runLoginPanel;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAdaptor (EOExternalTypeMapping)
|
||||
|
||||
+ (NSString *)internalTypeForExternalType: (NSString *)extType
|
||||
model: (EOModel *)model;
|
||||
+ (NSArray *)externalTypesWithModel: (EOModel *)model;
|
||||
+ (void)assignExternalTypeForAttribute: (EOAttribute *)attribute;
|
||||
+ (void)assignExternalInfoForAttribute: (EOAttribute *)attribute;
|
||||
+ (void)assignExternalInfoForEntity: (EOEntity *)entity;
|
||||
+ (void)assignExternalInfoForEntireModel: (EOModel *)model;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAdaptor (EOSchemaGenerationExtensions)
|
||||
|
||||
- (void)dropDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)administrativeConnectionDictionary;
|
||||
- (void)createDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)administrativeConnectionDictionary;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOLoginPanel : NSObject
|
||||
|
||||
- (NSDictionary *)runPanelForAdaptor: (EOAdaptor *)adaptor validate: (BOOL)yn;
|
||||
- (NSDictionary *)administraticeConnectionDictionaryForAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOAdaptorDelegate)
|
||||
|
||||
- (id)adaptor: (EOAdaptor *)adaptor
|
||||
fetchedValueForValue: (id)value
|
||||
attribute: (EOAttribute *)attribute;
|
||||
- (NSDictionary *)reconnectionDictionaryForAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
@end /* NSObject (EOAdaptorDelegate) */
|
||||
|
||||
|
||||
#endif /* __EOAdaptor_h__*/
|
719
EOAccess/EOAdaptor.m
Normal file
719
EOAccess/EOAdaptor.m
Normal file
|
@ -0,0 +1,719 @@
|
|||
/**
|
||||
EOAdaptor.m <title>EOAdaptor Class</title>
|
||||
|
||||
Copyright (C) 1996-2001 Free Software Foundation, Inc.
|
||||
|
||||
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
|
||||
Date: October 1996
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#if HAVE_LIBC_H
|
||||
# include <libc.h>
|
||||
#else
|
||||
#ifndef __WIN32__
|
||||
# include <unistd.h>
|
||||
#endif /* !__WIN32__ */
|
||||
#endif
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSPathUtilities.h>
|
||||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorPriv.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
NSString *EOGeneralAdaptorException = @"EOGeneralAdaptorException";
|
||||
|
||||
|
||||
@implementation EOAdaptor
|
||||
|
||||
|
||||
+ (id)adaptorWithModel: (EOModel *)model
|
||||
{
|
||||
//OK
|
||||
/* Check first to see if the adaptor class exists in the running program
|
||||
by testing the existence of [_model adaptorClassName]. */
|
||||
EOAdaptor *adaptor = nil;
|
||||
|
||||
if(!model)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: no model specified",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
else
|
||||
{
|
||||
NSString *adaptorName = [model adaptorName];
|
||||
|
||||
if (!adaptorName)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: no adaptor name in model named %@",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
[model name]];
|
||||
else
|
||||
{
|
||||
Class adaptorClass = NSClassFromString([NSString stringWithFormat: @"%@%@", adaptorName, @"Adaptor"]);
|
||||
|
||||
if(adaptorClass)
|
||||
adaptor = [[[adaptorClass alloc] initWithName: adaptorName]
|
||||
autorelease];
|
||||
else
|
||||
adaptor = [self adaptorWithName: adaptorName];
|
||||
|
||||
[adaptor setModel: model];
|
||||
[adaptor setConnectionDictionary: [model connectionDictionary]];
|
||||
}
|
||||
}
|
||||
|
||||
return adaptor;
|
||||
}
|
||||
|
||||
+ (id) adaptorWithName: (NSString *)adaptorName
|
||||
{
|
||||
//OK
|
||||
NSBundle *bundle = [NSBundle mainBundle];
|
||||
NSString *adaptorBundlePath;
|
||||
NSMutableArray *paths;
|
||||
Class adaptorClass;
|
||||
NSString *adaptorClassName;
|
||||
NSProcessInfo *pInfo;
|
||||
NSDictionary *env;
|
||||
NSMutableString *user, *local, *system;
|
||||
int i, count;
|
||||
|
||||
/* Check error */
|
||||
if ([adaptorName length] == 0)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: adaptor name can't be nil",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
// append EOAdaptor
|
||||
adaptorName = [adaptorName stringByAppendingString: @"EOAdaptor"];
|
||||
|
||||
/* Look in application bundle */
|
||||
adaptorBundlePath = [bundle pathForResource: adaptorName
|
||||
ofType: @"framework"];
|
||||
// should be NSString *path=[NSBundle pathForLibraryResource:libraryResource type:@"framework" directory:@"Frameworks"]; ?
|
||||
|
||||
/* Look in standard paths */
|
||||
if (!adaptorBundlePath)
|
||||
{
|
||||
/*
|
||||
The path of where to search for the adaptor files
|
||||
is based upon environment variables.
|
||||
GDL_ADAPTORS_PATH
|
||||
GNUSTEP_USER_ROOT
|
||||
GNUSTEP_LOCAL_ROOT
|
||||
GNUSTEP_SYSTEM_ROOT
|
||||
*/
|
||||
pInfo = [NSProcessInfo processInfo];
|
||||
env = [pInfo environment];
|
||||
paths = [NSMutableArray array];
|
||||
|
||||
user = [[[env objectForKey: @"GNUSTEP_USER_ROOT"]
|
||||
mutableCopy] autorelease];
|
||||
[user appendString: @"/Libraries/Frameworks"];
|
||||
|
||||
if (user)
|
||||
[paths addObject: user];
|
||||
|
||||
local = [[[env objectForKey: @"GNUSTEP_LOCAL_ROOT"]
|
||||
mutableCopy] autorelease];
|
||||
[local appendString: @"/Libraries/Frameworks"];
|
||||
|
||||
if (local)
|
||||
[paths addObject: local];
|
||||
|
||||
local = [[[env objectForKey: @"GNUSTEP_LOCAL_ROOT"]
|
||||
mutableCopy] autorelease];
|
||||
[local appendString: @"/Library/Frameworks"];
|
||||
|
||||
if (local)
|
||||
[paths addObject: local];
|
||||
|
||||
system = [[[env objectForKey: @"GNUSTEP_SYSTEM_ROOT"]
|
||||
mutableCopy] autorelease];
|
||||
[system appendString: @"/Libraries/Frameworks"];
|
||||
|
||||
if (system)
|
||||
[paths addObject: system];
|
||||
|
||||
/* Loop through the paths and check each one */
|
||||
for(i = 0, count = [paths count]; i < count; i++)
|
||||
{
|
||||
bundle = [NSBundle bundleWithPath: [paths objectAtIndex: i]];
|
||||
adaptorBundlePath = [bundle pathForResource: adaptorName
|
||||
ofType: @"framework"];
|
||||
|
||||
if(adaptorBundlePath && [adaptorBundlePath length])
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Make adaptor bundle */
|
||||
if(adaptorBundlePath)
|
||||
bundle = [NSBundle bundleWithPath: adaptorBundlePath];
|
||||
else
|
||||
bundle = nil;
|
||||
|
||||
/* Check bundle */
|
||||
if (!bundle)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: the adaptor bundle '%@' does not exist",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
adaptorName];
|
||||
|
||||
/* Get the adaptor bundle "infoDictionary", and pricipal class, ie. the
|
||||
adaptor class. Other info about the adaptor should be put in the
|
||||
bundle's "Info.plist" file (property list format - see NSBundle class
|
||||
documentation for details about reserved keys in this dictionary
|
||||
property list containing one entry whose key is adaptorClassName. It
|
||||
identifies the actual adaptor class from the bundle. */
|
||||
|
||||
adaptorClass = [bundle principalClass]; //NSString* adaptorClassName=[infoDictionary objectForKey:@"EOAdaptorClassName"]; ??
|
||||
|
||||
if (adaptorClass == Nil) {
|
||||
adaptorClassName = [[bundle infoDictionary] objectForKey: @"EOAdaptorClassName"];
|
||||
|
||||
NSLog(@"adaptorClassName is %@", adaptorClassName);
|
||||
|
||||
adaptorClass = NSClassFromString(adaptorClassName);
|
||||
}
|
||||
|
||||
if(!adaptorClass)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: the adaptor bundle '%@' doesn't contain a principal class",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
adaptorName];
|
||||
|
||||
return [[[adaptorClass alloc] initWithName: adaptorName] autorelease];
|
||||
}
|
||||
|
||||
+ (void)setExpressionClassName: (NSString *)sqlExpressionClassName
|
||||
adaptorClassName: (NSString *)adaptorClassName
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
+ (EOLoginPanel *)sharedLoginPanelInstance
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (NSArray *)availableAdaptorNames
|
||||
{
|
||||
NSArray *pathArray = NSStandardLibraryPaths();
|
||||
NSEnumerator *pathEnum = [pathArray objectEnumerator];
|
||||
NSString *searchPath;
|
||||
NSFileManager *defaultManager = [NSFileManager defaultManager];
|
||||
NSArray *fileNames;
|
||||
NSEnumerator *filesEnum;
|
||||
NSString *fileName;
|
||||
NSMutableArray *adaptorNames = [[NSMutableArray new] autorelease];
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
|
||||
while ((searchPath = [pathEnum nextObject]))
|
||||
{
|
||||
fileNames = [defaultManager
|
||||
directoryContentsAtPath:
|
||||
[searchPath stringByAppendingPathComponent:@"Frameworks"]];
|
||||
filesEnum = [fileNames objectEnumerator];
|
||||
|
||||
//NSLog(@"EOAdaptor : availableAdaptorNames, path = %@", searchPath);
|
||||
|
||||
while ((fileName = [filesEnum nextObject]))
|
||||
{
|
||||
//NSLog(@"EOAdaptor : availableAdaptorNames, fileName = %@", fileName);
|
||||
if ([fileName hasSuffix:@"EOAdaptor.framework"]) {
|
||||
[adaptorNames addObject:
|
||||
[fileName substringToIndex:
|
||||
([fileName length]
|
||||
- [@"EOAdaptor.framework" length])]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
|
||||
return adaptorNames;
|
||||
}
|
||||
|
||||
+ (NSArray *)prototypes
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- initWithName:(NSString *)name
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_name, name);
|
||||
_contexts = [NSMutableArray new];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_model);
|
||||
DESTROY(_name);
|
||||
DESTROY(_connectionDictionary);
|
||||
DESTROY(_contexts);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)setConnectionDictionary: (NSDictionary *)dictionary
|
||||
{
|
||||
//OK
|
||||
if ([self hasOpenChannels])
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: cannot set the connection dictionary while the adaptor is connected!",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
ASSIGN(_connectionDictionary, dictionary);
|
||||
// [model setConnectionDictionary:dictionary]; // TODO ??
|
||||
}
|
||||
|
||||
- (void)assertConnectionDictionaryIsValid
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
- (EOAdaptorContext *)createAdaptorContext
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *)contexts
|
||||
{
|
||||
return _contexts;
|
||||
}
|
||||
|
||||
- (BOOL)hasOpenChannels
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = [_contexts count] - 1; i >= 0; i--)
|
||||
{
|
||||
EOAdaptorContext *ctx = [[_contexts objectAtIndex: i]
|
||||
nonretainedObjectValue];
|
||||
|
||||
if([ctx hasOpenChannels] == YES)
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)setDelegate:delegate
|
||||
{
|
||||
_delegate = delegate;
|
||||
|
||||
_delegateRespondsTo.processValue
|
||||
= [delegate respondsToSelector:
|
||||
@selector(adaptor:fetchedValueForValue:attribute:)];
|
||||
}
|
||||
|
||||
- (void)setModel: (EOModel *)model
|
||||
{
|
||||
ASSIGN(_model, model);
|
||||
}
|
||||
|
||||
- (NSString *)name
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
- (NSDictionary *)connectionDictionary
|
||||
{
|
||||
return _connectionDictionary;
|
||||
}
|
||||
|
||||
- (EOModel *)model
|
||||
{
|
||||
return _model;
|
||||
}
|
||||
|
||||
- delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (Class)expressionClass
|
||||
{
|
||||
Class expressionClass = Nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
/* retrieve EOAdaptorQuotesExternalNames from ? or from user default */
|
||||
|
||||
expressionClass = _expressionClass;
|
||||
|
||||
if(!expressionClass)
|
||||
expressionClass = [self defaultExpressionClass];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return expressionClass;
|
||||
}
|
||||
|
||||
- (Class)defaultExpressionClass
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return Nil; //TODO vedere setExpressionClass
|
||||
}
|
||||
|
||||
- (BOOL)canServiceModel: (EOModel *)model
|
||||
{
|
||||
return [_connectionDictionary isEqual: [model connectionDictionary]];
|
||||
}
|
||||
|
||||
- (NSStringEncoding)databaseEncoding
|
||||
{
|
||||
NSString *encodingString=nil;
|
||||
NSDictionary *encodingsDict = [self connectionDictionary];
|
||||
NSStringEncoding *availableEncodingsArray;
|
||||
int count = 0;
|
||||
NSStringEncoding availableEncodingValue;
|
||||
NSString *availableEncodingString;
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"AdaptorLevel",@"EOAdaptor");
|
||||
|
||||
if (encodingsDict
|
||||
&& (encodingString = [encodingsDict objectForKey: @"databaseEncoding"]))
|
||||
{
|
||||
availableEncodingsArray = [NSString availableStringEncodings];
|
||||
|
||||
while (availableEncodingsArray[count] != 0)
|
||||
{
|
||||
availableEncodingValue = availableEncodingsArray[count++];
|
||||
|
||||
availableEncodingString = (NSString *)GetEncodingName(availableEncodingValue);
|
||||
|
||||
if (availableEncodingString)
|
||||
{
|
||||
if ([availableEncodingString isEqual: encodingString])
|
||||
{
|
||||
EOFLOGObjectFnStopOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
|
||||
return availableEncodingValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
|
||||
return [NSString defaultCStringEncoding];
|
||||
}
|
||||
|
||||
- (id)fetchedValueForValue: (id)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
//Should be OK
|
||||
SEL valueFactoryMethod;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
NSDebugMLLog(@"gsdb", @"value=%@", value);
|
||||
NSDebugMLLog(@"gsdb", @"attribute=%@", attribute);
|
||||
|
||||
valueFactoryMethod = [attribute valueFactoryMethod];
|
||||
|
||||
if (valueFactoryMethod)
|
||||
{
|
||||
NSEmitTODO();
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([value isKindOfClass: [NSString class]])
|
||||
[self fetchedValueForStringValue: value
|
||||
attribute: attribute];
|
||||
else if ([value isKindOfClass: [NSNumber class]])
|
||||
value = [self fetchedValueForNumberValue: value
|
||||
attribute: attribute];
|
||||
else if ([value isKindOfClass: [NSDate class]])
|
||||
value = [self fetchedValueForDateValue: value
|
||||
attribute: attribute];
|
||||
else if ([value isKindOfClass: [NSData class]])
|
||||
value = [self fetchedValueForDataValue: value
|
||||
attribute: attribute];
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"value=%@",value);
|
||||
}
|
||||
|
||||
if(_delegateRespondsTo.processValue)
|
||||
value = [_delegate adaptor: self
|
||||
fetchedValueForValue: value
|
||||
attribute: attribute];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"value=%@", value);
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
- (NSString *)fetchedValueForStringValue: (NSString *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
NSString *resultValue = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
NSDebugMLLog(@"gsdb", @"value=%@", value);
|
||||
NSDebugMLLog(@"gsdb", @"attribute=%@", attribute);
|
||||
|
||||
if([value length]>0)
|
||||
{
|
||||
//TODO-NOW: correct this code which loop!
|
||||
/*
|
||||
const char *cstr=NULL;
|
||||
int i=0, spc=0;
|
||||
cstr = [value cString];
|
||||
while(*cstr)
|
||||
{
|
||||
if(*cstr == ' ')
|
||||
spc++;
|
||||
else
|
||||
spc = 0;
|
||||
i++;
|
||||
}
|
||||
cstr = &cstr[-i];
|
||||
|
||||
if(!spc)
|
||||
resultValue=value;
|
||||
else if(!(&cstr[i-spc]-cstr))
|
||||
resultValue=nil;
|
||||
else
|
||||
resultValue=[NSString stringWithCString:cstr
|
||||
length:&cstr[i-spc]-cstr];
|
||||
*/
|
||||
resultValue = value;
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return resultValue;
|
||||
}
|
||||
|
||||
- (NSNumber *)fetchedValueForNumberValue: (NSNumber *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
- (NSCalendarDate *)fetchedValueForDateValue: (NSCalendarDate *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
- (NSData *)fetchedValueForDataValue: (NSData *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Reconnection to database */
|
||||
- (void)handleDroppedConnection
|
||||
{
|
||||
NSDictionary *newConnectionDictionary = nil;
|
||||
int i;
|
||||
|
||||
for (i = [_contexts count] - 1; i >= 0; i--)
|
||||
{
|
||||
EOAdaptorContext *ctx = [[_contexts objectAtIndex:i]
|
||||
nonretainedObjectValue];
|
||||
|
||||
[ctx handleDroppedConnection];
|
||||
}
|
||||
|
||||
[_contexts removeAllObjects];
|
||||
|
||||
if (_delegate
|
||||
&& [_delegate
|
||||
respondsToSelector: @selector(reconnectionDictionaryForAdaptor:)])
|
||||
{
|
||||
if ((newConnectionDictionary = [_delegate
|
||||
reconnectionDictionaryForAdaptor: self]))
|
||||
{
|
||||
[self setConnectionDictionary: newConnectionDictionary];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isDroppedConnectionException: (NSException *)exception
|
||||
{
|
||||
EOFLOGObjectFnStartOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
EOFLOGObjectFnStopOrCond2(@"AdaptorLevel", @"EOAdaptor");
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
//NOT in EOF
|
||||
- (void)createDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)connectionDictionary
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
//NOT in EOF
|
||||
- (void)dropDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)connectionDictionary
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
@end /* EOAdaptor */
|
||||
|
||||
|
||||
@implementation EOAdaptor (EOAdaptorLoginPanel)
|
||||
|
||||
- (BOOL)runLoginPanelAndValidateConnectionDictionary
|
||||
{
|
||||
// TODO
|
||||
NSEmitTODO();
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSDictionary *)runLoginPanel
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAdaptor (EOExternalTypeMapping)
|
||||
|
||||
+ (NSString *)internalTypeForExternalType: (NSString *)extType
|
||||
model: (EOModel *)model
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (NSArray *)externalTypesWithModel: (EOModel *)model
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (void)assignExternalTypeForAttribute: (EOAttribute *)attribute
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
+ (void)assignExternalInfoForAttribute: (EOAttribute *)attribute
|
||||
{
|
||||
// TODO
|
||||
NSEmitTODO();
|
||||
[self assignExternalTypeForAttribute: attribute];
|
||||
}
|
||||
|
||||
+ (void)assignExternalInfoForEntity: (EOEntity *)entity
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
+ (void)assignExternalInfoForEntireModel: (EOModel *)model
|
||||
{
|
||||
// TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAdaptor (EOAdaptorPrivate)
|
||||
|
||||
- (void) _requestConcreteImplementationForSelector: (SEL)param0
|
||||
{
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (void) _unregisterAdaptorContext: (EOAdaptorContext*)adaptorContext
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for (i = [_contexts count] - 1; i >= 0; i--)
|
||||
{
|
||||
if ([[_contexts objectAtIndex: i] nonretainedObjectValue]
|
||||
== adaptorContext)
|
||||
{
|
||||
[_contexts removeObjectAtIndex: i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void) _registerAdaptorContext: (EOAdaptorContext*)adaptorContext
|
||||
{
|
||||
[_contexts addObject: [NSValue valueWithNonretainedObject: adaptorContext]];
|
||||
}
|
||||
|
||||
@end
|
233
EOAccess/EOAdaptorChannel.h
Normal file
233
EOAccess/EOAdaptorChannel.h
Normal file
|
@ -0,0 +1,233 @@
|
|||
/*
|
||||
EOAdaptorChannel.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAdaptorChannel_h__
|
||||
#define __EOAdaptorChannel_h__
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
|
||||
|
||||
@class NSArray;
|
||||
@class NSMutableArray;
|
||||
@class NSDictionary;
|
||||
@class NSMutableDictionary;
|
||||
@class NSString;
|
||||
@class NSMutableString;
|
||||
@class NSCalendarDate;
|
||||
|
||||
@class EOModel;
|
||||
@class EOEntity;
|
||||
@class EOAttribute;
|
||||
@class EOQualifier;
|
||||
@class EOStoredProcedure;
|
||||
@class EOAdaptorOperation;
|
||||
@class EOSQLExpression;
|
||||
|
||||
/* The EOAdaptorChannel class could be overriden for a concrete database
|
||||
adaptor. You have to override only those methods marked in this header
|
||||
with `override'.
|
||||
*/
|
||||
|
||||
@interface EOAdaptorChannel : NSObject
|
||||
{
|
||||
EOAdaptorContext *_context;
|
||||
id _delegate; // not retained
|
||||
|
||||
BOOL _debug;
|
||||
|
||||
/* Flags used to check if the delegate responds to several messages */
|
||||
struct {
|
||||
unsigned willPerformOperations:1;
|
||||
unsigned didPerformOperations:1;
|
||||
unsigned shouldSelectAttributes:1;
|
||||
unsigned didSelectAttributes:1;
|
||||
unsigned willFetchRow:1;
|
||||
unsigned didFetchRow:1;
|
||||
unsigned didChangeResultSet:1;
|
||||
unsigned didFinishFetching:1;
|
||||
unsigned shouldEvaluateExpression:1;
|
||||
unsigned didEvaluateExpression:1;
|
||||
unsigned shouldExecuteStoredProcedure:1;
|
||||
unsigned didExecuteStoredProcedure:1;
|
||||
unsigned shouldConstructStoredProcedureReturnValues:1;
|
||||
unsigned shouldReturnValuesForStoredProcedure:1;
|
||||
} _delegateRespondsTo;
|
||||
}
|
||||
|
||||
+ (EOAdaptorChannel *)adaptorChannelWithAdaptorContext: (EOAdaptorContext *)adaptorContext;
|
||||
|
||||
/* Initializing an adaptor context */
|
||||
- initWithAdaptorContext: (EOAdaptorContext *)adaptorContext;
|
||||
|
||||
/* Getting the adaptor context */
|
||||
- (EOAdaptorContext *)adaptorContext;
|
||||
|
||||
/* Opening and closing a channel */
|
||||
- (BOOL)isOpen;
|
||||
- (void)openChannel;
|
||||
- (void)closeChannel;
|
||||
|
||||
/* Modifying rows */
|
||||
- (void)insertRow: (NSDictionary *)row forEntity: (EOEntity *)entity;
|
||||
- (void)updateValues: (NSDictionary *)values
|
||||
inRowDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity;
|
||||
- (unsigned)updateValues: (NSDictionary *)values
|
||||
inRowsDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity;
|
||||
- (void)deleteRowDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity;
|
||||
- (unsigned)deleteRowsDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
/* Fetching rows */
|
||||
- (void)selectAttributes: (NSArray *)attributes
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
lock: (BOOL)aLockFlag
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- (void)lockRowComparingAttributes: (NSArray *)atts
|
||||
entity: (EOEntity *)entity
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
snapshot: (NSDictionary *)snapshot;
|
||||
|
||||
- (void)evaluateExpression: (EOSQLExpression *)expression;
|
||||
|
||||
- (BOOL)isFetchInProgress;
|
||||
|
||||
- (NSArray *)describeResults;
|
||||
|
||||
- (NSMutableDictionary *)fetchRowWithZone: (NSZone *)zone;
|
||||
|
||||
- (void)setAttributesToFetch: (NSArray *)attributes;
|
||||
|
||||
- (NSArray *)attributesToFetch;
|
||||
|
||||
- (void)cancelFetch;
|
||||
|
||||
- (NSDictionary *)primaryKeyForNewRowWithEntity: (EOEntity *)entity;
|
||||
|
||||
- (NSArray *)describeTableNames;
|
||||
|
||||
- (NSArray *)describeStoredProcedureNames;
|
||||
|
||||
- (EOModel *)describeModelWithTableNames: (NSArray *)tableNames;
|
||||
|
||||
- (void)addStoredProceduresNamed: (NSArray *)storedProcedureNames
|
||||
toModel: (EOModel *)model;
|
||||
|
||||
- (void)setDebugEnabled:(BOOL)yn;
|
||||
- (BOOL)isDebugEnabled;
|
||||
|
||||
- (id)delegate;
|
||||
- (void)setDelegate:(id)delegate;
|
||||
|
||||
- (NSMutableDictionary *)dictionaryWithObjects: (id *)objects
|
||||
forAttributes: (NSArray *)attributes
|
||||
zone: (NSZone *)zone;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAdaptorChannel (EOStoredProcedures)
|
||||
|
||||
- (void)executeStoredProcedure: (EOStoredProcedure *)storedProcedure
|
||||
withValues: (NSDictionary *)values;
|
||||
- (NSDictionary *)returnValuesForLastStoredProcedureInvocation;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAdaptorChannel (EOBatchProcessing)
|
||||
|
||||
- (void)performAdaptorOperation: (EOAdaptorOperation *)adaptorOperation;
|
||||
- (void)performAdaptorOperations: (NSArray *)adaptorOperations;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOAdaptorChannelDelegation)
|
||||
|
||||
- (NSArray *)adaptorChannel: channel
|
||||
willPerformOperations: (NSArray *)operations;
|
||||
|
||||
- (NSException *)adaptorChannel: channel
|
||||
didPerformOperations: (NSArray *)operations
|
||||
exception: (NSException *)exception;
|
||||
|
||||
- (BOOL)adaptorChannel: channel
|
||||
shouldSelectAttributes: (NSArray *)attributes
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
lock: (BOOL)flag
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- (void)adaptorChannel: channel
|
||||
didSelectAttributes: (NSArray *)attributes
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
lock:(BOOL) flag
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- (void)adaptorChannelWillFetchRow: channel;
|
||||
|
||||
- (void)adaptorChannel: channel didFetchRow: (NSMutableDictionary *)row;
|
||||
|
||||
- (void)adaptorChannelDidChangeResultSet: channel;
|
||||
|
||||
- (void)adaptorChannelDidFinishFetching: channel;
|
||||
|
||||
- (BOOL)adaptorChannel: channel
|
||||
shouldEvaluateExpression: (EOSQLExpression *)expression;
|
||||
|
||||
- (void)adaptorChannel: channel
|
||||
didEvaluateExpression: (EOSQLExpression *)expression;
|
||||
|
||||
- (NSDictionary *)adaptorChannel: channel
|
||||
shouldExecuteStoredProcedure: (EOStoredProcedure *)procedure
|
||||
withValues: (NSDictionary *)values;
|
||||
|
||||
- (void)adaptorChannel: channel
|
||||
didExecuteStoredProcedure: (EOStoredProcedure *)procedure
|
||||
withValues: (NSDictionary *)values;
|
||||
|
||||
- (NSDictionary *)adaptorChannelShouldConstructStoredProcedureReturnValues: channel;
|
||||
|
||||
- (NSDictionary *)adaptorChannel: channel
|
||||
shouldReturnValuesForStoredProcedure: (NSDictionary *)returnValues;
|
||||
|
||||
@end /* NSObject(EOAdaptorChannelDelegation) */
|
||||
|
||||
|
||||
extern NSString *EOAdaptorOperationsKey;
|
||||
extern NSString *EOFailedAdaptorOperationKey;
|
||||
extern NSString *EOAdaptorFailureKey;
|
||||
extern NSString *EOAdaptorOptimisticLockingFailure;
|
||||
|
||||
|
||||
#endif /* __EOAdaptorChannel_h__ */
|
609
EOAccess/EOAdaptorChannel.m
Normal file
609
EOAccess/EOAdaptorChannel.m
Normal file
|
@ -0,0 +1,609 @@
|
|||
/**
|
||||
EOAdaptorChannel.m <title>EOAdaptorChannel</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
#import <EOAccess/EODatabaseOperation.h>
|
||||
|
||||
#import <EOControl/EOMutableKnownKeyDictionary.h>
|
||||
#import <EOControl/EONSAddOns.h>
|
||||
|
||||
|
||||
NSString *EOAdaptorOperationsKey = @"EOAdaptorOperationsKey";
|
||||
NSString *EOFailedAdaptorOperationKey = @"EOFailedAdaptorOperationKey";
|
||||
NSString *EOAdaptorFailureKey = @"EOAdaptorFailureKey";
|
||||
NSString *EOAdaptorOptimisticLockingFailure = @"EOAdaptorOptimisticLockingFailure";
|
||||
|
||||
|
||||
@implementation EOAdaptorChannel
|
||||
|
||||
+ (EOAdaptorChannel *)adaptorChannelWithAdaptorContext: (EOAdaptorContext *)adaptorContext
|
||||
{
|
||||
return [[[self alloc] initWithAdaptorContext: adaptorContext] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithAdaptorContext: (EOAdaptorContext *)adaptorContext
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_context, adaptorContext);
|
||||
[_context _channelDidInit: self]; //TODO it's _registerAdaptorChannel:
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_context _channelWillDealloc: self];
|
||||
DESTROY(_context);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)openChannel
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)closeChannel
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)insertRow: (NSDictionary *)row
|
||||
forEntity: (EOEntity *)entity
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)updateValues: (NSDictionary *)row
|
||||
inRowDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
int rows;
|
||||
|
||||
rows = [self updateValues: row
|
||||
inRowsDescribedByQualifier: qualifier
|
||||
entity: entity];
|
||||
|
||||
if(rows != 1)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: updated %d rows",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
rows];
|
||||
}
|
||||
|
||||
- (unsigned)updateValues: (NSDictionary *)values
|
||||
inRowsDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (void)deleteRowDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
int rows = 0;
|
||||
|
||||
rows = [self deleteRowsDescribedByQualifier: qualifier
|
||||
entity: entity];
|
||||
|
||||
if (rows != 1)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: deleted %d rows",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
rows];
|
||||
}
|
||||
|
||||
- (unsigned)deleteRowsDescribedByQualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (void)selectAttributes: (NSArray *)attributes
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
lock: (BOOL)flag
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)lockRowComparingAttributes: (NSArray *)attrs
|
||||
entity: (EOEntity *)entity
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
snapshot: (NSDictionary *)snapshot
|
||||
{
|
||||
EOFetchSpecification *fetch = nil;
|
||||
NSDictionary *row = nil;
|
||||
NSEnumerator *attrsEnum = nil;
|
||||
EOAttribute *attr = nil;
|
||||
NSMutableArray *attributes = nil;
|
||||
BOOL isEqual = YES;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
NSDebugMLLog(@"gsdb", @"attrs=%@", attrs);
|
||||
NSDebugMLLog(@"gsdb", @"entity=%@", entity);
|
||||
NSDebugMLLog(@"gsdb", @"qualifier=%@" ,qualifier);
|
||||
NSDebugMLLog(@"gsdb", @"snapshot=%@", snapshot);
|
||||
|
||||
if (attrs)
|
||||
attributes = [[attrs mutableCopy] autorelease];
|
||||
|
||||
if(attributes == nil)
|
||||
attributes = [NSMutableArray array];
|
||||
|
||||
[attributes removeObjectsInArray: [entity primaryKeyAttributes]];
|
||||
[attributes addObjectsFromArray: [entity primaryKeyAttributes]];
|
||||
|
||||
fetch = [EOFetchSpecification fetchSpecificationWithEntityName: [entity name]
|
||||
qualifier: qualifier
|
||||
sortOrderings: nil];
|
||||
|
||||
[self selectAttributes: attributes
|
||||
fetchSpecification: fetch
|
||||
lock: YES
|
||||
entity: entity];
|
||||
|
||||
row = [self fetchRowWithZone: NULL];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"row=%@", row);
|
||||
|
||||
if(row == nil || [self fetchRowWithZone: NULL] != nil)
|
||||
{
|
||||
[NSException raise: EOGeneralAdaptorException
|
||||
format: @"%@ -- %@ 0x%x: cannot lock row for entity '%@' with qualifier: %@",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
[entity name],
|
||||
qualifier];
|
||||
}
|
||||
|
||||
attrsEnum = [attributes objectEnumerator];
|
||||
|
||||
while((attr = [attrsEnum nextObject]))
|
||||
{
|
||||
NSString *name;
|
||||
|
||||
name = [attr name];
|
||||
if([[row objectForKey: name]
|
||||
isEqual: [snapshot objectForKey:name]] == NO)
|
||||
{
|
||||
isEqual = NO;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(isEqual == NO)
|
||||
{
|
||||
[NSException raise: EOGeneralAdaptorException
|
||||
format: @"%@ -- %@ 0x%x: cannot lock row for entity '%@' with qualifier: %@",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
[entity name],
|
||||
qualifier];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)evaluateExpression: (EOSQLExpression *)expression
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (BOOL)isFetchInProgress
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSArray *)describeResults
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSMutableDictionary *)fetchRowWithZone: (NSZone *)zone
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setAttributesToFetch: (NSArray *)attributes
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (NSArray *)attributesToFetch
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)cancelFetch
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (NSDictionary *)primaryKeyForNewRowWithEntity: (EOEntity *)entity
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return nil;//no or subclass respo ?
|
||||
}
|
||||
|
||||
- (NSArray *)describeTableNames
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *)describeStoredProcedureNames
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOModel *)describeModelWithTableNames: (NSArray *)tableNames
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)addStoredProceduresNamed: (NSArray *)storedProcedureNames
|
||||
toModel: (EOModel *)model
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)setDebugEnabled: (BOOL)flag
|
||||
{
|
||||
_debug = flag;
|
||||
}
|
||||
|
||||
- (BOOL)isDebugEnabled
|
||||
{
|
||||
return _debug;
|
||||
}
|
||||
|
||||
- delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (void)setDelegate:delegate
|
||||
{
|
||||
_delegate = delegate;
|
||||
|
||||
_delegateRespondsTo.willPerformOperations =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:willPerformOperations:)];
|
||||
_delegateRespondsTo.didPerformOperations =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:didPerformOperations:exception:)];
|
||||
_delegateRespondsTo.shouldSelectAttributes =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:shouldSelectAttributes:fetchSpecification:lock:)];
|
||||
_delegateRespondsTo.didSelectAttributes =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:didSelectAttributes:fetchSpecification:lock:)];
|
||||
_delegateRespondsTo.willFetchRow =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannelWillFetchRow:)];
|
||||
_delegateRespondsTo.didFetchRow =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:didFetchRow:)];
|
||||
_delegateRespondsTo.didChangeResultSet =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannelDidChangeResultSet:)];
|
||||
_delegateRespondsTo.didFinishFetching =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannelDidFinishFetching:)];
|
||||
_delegateRespondsTo.shouldEvaluateExpression =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:shouldEvaluateExpression:)];
|
||||
_delegateRespondsTo.didEvaluateExpression =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:didEvaluateExpression:)];
|
||||
_delegateRespondsTo.shouldExecuteStoredProcedure =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:shouldExecuteStoredProcedure:withValues:)];
|
||||
_delegateRespondsTo.didExecuteStoredProcedure =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannelDidExecuteStoredProcedure:withValues:)];
|
||||
_delegateRespondsTo.shouldConstructStoredProcedureReturnValues =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannelShouldConstructStoredProcedureReturnValues:)];
|
||||
_delegateRespondsTo.shouldReturnValuesForStoredProcedure =
|
||||
[_delegate respondsToSelector:
|
||||
@selector(adaptorChannel:shouldReturnValuesForStoredProcedure:)];
|
||||
}
|
||||
|
||||
- (NSMutableDictionary *)dictionaryWithObjects: (id *)objects
|
||||
forAttributes: (NSArray *)attributes
|
||||
zone: (NSZone *)zone
|
||||
{
|
||||
//OK (can be improved by calling EOMutableKnownKeyDictionary iini with objects but the order may be different
|
||||
EOMutableKnownKeyDictionary *dict=nil;
|
||||
EOAttribute *anAttribute=[attributes firstObject];
|
||||
|
||||
NSAssert(anAttribute, @"No attribute");
|
||||
|
||||
if (anAttribute)
|
||||
{
|
||||
EOEntity *entity = [anAttribute entity];
|
||||
|
||||
NSAssert1(entity,@"No entity for attribute %@",anAttribute);
|
||||
|
||||
if (entity)
|
||||
{
|
||||
NSArray *attributesToFetch = [entity _attributesToFetch];
|
||||
EOMKKDInitializer *initializer = [entity _adaptorDictionaryInitializer];
|
||||
int i = 0;
|
||||
int count = [attributes count];
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"\ndictionaryWithObjects:forAttributes:zone: attributes=%@ objects=%p\n",attributes,objects);
|
||||
NSAssert(initializer,@"No initializer");
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"initializer=%@",initializer);
|
||||
|
||||
dict = [[[EOMutableKnownKeyDictionary allocWithZone: zone]
|
||||
initWithInitializer:initializer] autorelease];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"dict=%@", dict);
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
EOAttribute *attribute = (EOAttribute *)[attributes objectAtIndex: i];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"Attribute=%@ value=%@", attribute, objects[i]);
|
||||
|
||||
[dict setObject: objects[i]
|
||||
forKey: [attribute name]];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dict;
|
||||
}
|
||||
|
||||
- (EOAdaptorContext *)adaptorContext
|
||||
{
|
||||
return _context;
|
||||
}
|
||||
|
||||
- (BOOL)isOpen
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end /* EOAdaptorChannel */
|
||||
|
||||
|
||||
@implementation EOAdaptorChannel (EOStoredProcedures)
|
||||
|
||||
- (void)executeStoredProcedure: (EOStoredProcedure *)storedProcedure
|
||||
withValues: (NSDictionary *)values
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (NSDictionary *)returnValuesForLastStoredProcedureInvocation
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAdaptorChannel (EOBatchProcessing)
|
||||
|
||||
- (void)performAdaptorOperation: (EOAdaptorOperation *)adaptorOperation
|
||||
{
|
||||
EOAdaptorContext *adaptorContext = nil;
|
||||
EOEntity *entity = nil;
|
||||
EOAdaptorOperator operator;
|
||||
NSDictionary *changedValues=nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
adaptorContext = [self adaptorContext];
|
||||
//adaptorcontext transactionNestingLevel
|
||||
//2fois
|
||||
//...
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"adaptorOperation=%@", adaptorOperation);
|
||||
|
||||
entity = [adaptorOperation entity];
|
||||
operator = [adaptorOperation adaptorOperator];
|
||||
changedValues = [adaptorOperation changedValues];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"ad op: %d %@", operator, [entity name]);
|
||||
NSDebugMLLog(@"gsdb", @"ad op: %@ %@", [adaptorOperation changedValues], [adaptorOperation qualifier]);
|
||||
|
||||
NS_DURING
|
||||
switch(operator)
|
||||
{
|
||||
case EOAdaptorLockOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorLockOperator");
|
||||
|
||||
[self lockRowComparingAttributes: [adaptorOperation attributes]
|
||||
entity: entity
|
||||
qualifier: [adaptorOperation qualifier]
|
||||
snapshot: changedValues];
|
||||
break;
|
||||
|
||||
case EOAdaptorInsertOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorInsertOperator");
|
||||
/*
|
||||
//self adaptorContext
|
||||
//adaptorcontext transactionNestingLevel
|
||||
NSArray* attributes=[entity attributes];
|
||||
|
||||
forech: externaltype
|
||||
name
|
||||
|
||||
PostgreSQLExpression initWithEntity:
|
||||
//called from ??: expr setUseAliases:NO
|
||||
prepareInsertExpressionWithRow:changedValues
|
||||
[expr staement];
|
||||
*/
|
||||
[self insertRow: [adaptorOperation changedValues]
|
||||
forEntity: entity];
|
||||
break;
|
||||
|
||||
case EOAdaptorUpdateOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorUpdateOperator");
|
||||
//OK
|
||||
[self updateValues: [adaptorOperation changedValues]
|
||||
inRowDescribedByQualifier: [adaptorOperation qualifier]
|
||||
entity: entity];
|
||||
break;
|
||||
|
||||
case EOAdaptorDeleteOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorDeleteOperator");
|
||||
[self deleteRowDescribedByQualifier: [adaptorOperation qualifier]
|
||||
entity: entity];
|
||||
break;
|
||||
|
||||
case EOAdaptorStoredProcedureOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorStoredProcedureOperator");
|
||||
[self executeStoredProcedure: [adaptorOperation storedProcedure]
|
||||
withValues: [adaptorOperation changedValues]];
|
||||
break;
|
||||
|
||||
case EOAdaptorUndefinedOperator:
|
||||
NSDebugMLLog(@"gsdb", @"EOAdaptorUndefinedOperator");
|
||||
|
||||
default:
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: Operator %d is not defined",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
(int)operator];
|
||||
break;
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSDebugMLog(@"EXCEPTION %@", localException);
|
||||
[adaptorOperation setException: localException];
|
||||
[localException raise];
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
|
||||
//end
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)performAdaptorOperations: (NSArray *)adaptorOperations
|
||||
{
|
||||
int i = 0;
|
||||
int count = 0;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
count=[adaptorOperations count];
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
EOAdaptorOperation *operation = [adaptorOperations objectAtIndex:i];
|
||||
|
||||
NS_DURING
|
||||
[self performAdaptorOperation: operation];
|
||||
NS_HANDLER
|
||||
{
|
||||
NSException *exp = nil;
|
||||
NSMutableDictionary *userInfo = nil;
|
||||
EOAdaptorOperator operator = 0;
|
||||
|
||||
NSDebugMLog(@"EXCEPTION %@", localException);
|
||||
|
||||
operator = [operation adaptorOperator];
|
||||
|
||||
userInfo = [NSMutableDictionary dictionaryWithCapacity: 3];
|
||||
|
||||
[userInfo setObject: adaptorOperations
|
||||
forKey: EOAdaptorOperationsKey];
|
||||
[userInfo setObject: operation
|
||||
forKey: EOFailedAdaptorOperationKey];
|
||||
|
||||
if(operator == EOAdaptorLockOperator
|
||||
|| operator == EOAdaptorUpdateOperator)
|
||||
[userInfo setObject: EOAdaptorOptimisticLockingFailure
|
||||
forKey: EOAdaptorFailureKey];
|
||||
|
||||
exp = [NSException exceptionWithName: EOGeneralAdaptorException
|
||||
reason: [NSString stringWithFormat:@"%@ -- %@ 0x%x: failed with exception name:%@ reason:\"%@\"",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
[localException name],
|
||||
[localException reason]]
|
||||
userInfo: userInfo];
|
||||
[exp raise];
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
@end
|
135
EOAccess/EOAdaptorContext.h
Normal file
135
EOAccess/EOAdaptorContext.h
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
EOAdaptorContext.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAdaptorContext_h__
|
||||
#define __EOAdaptorContext_h__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSMutableArray;
|
||||
|
||||
@class EOAdaptor;
|
||||
@class EOAdaptorChannel;
|
||||
|
||||
typedef enum {
|
||||
EODelegateRejects,
|
||||
EODelegateApproves,
|
||||
EODelegateOverrides
|
||||
} EODelegateResponse;
|
||||
|
||||
/* The EOAdaptorContext class could be overriden for a concrete database
|
||||
adaptor. You have to override only those methods marked in this header
|
||||
with `override'.
|
||||
*/
|
||||
|
||||
@interface EOAdaptorContext : NSObject
|
||||
{
|
||||
EOAdaptor *_adaptor;
|
||||
NSMutableArray *_channels; // values with channels
|
||||
id _delegate; // not retained
|
||||
|
||||
unsigned short _transactionNestingLevel;
|
||||
BOOL _debug;
|
||||
|
||||
/* Flags used to check if the delegate responds to several messages */
|
||||
struct {
|
||||
unsigned shouldConnect:1;
|
||||
unsigned shouldBegin:1;
|
||||
unsigned didBegin:1;
|
||||
unsigned shouldCommit:1;
|
||||
unsigned didCommit:1;
|
||||
unsigned shouldRollback:1;
|
||||
unsigned didRollback:1;
|
||||
} _delegateRespondsTo;
|
||||
}
|
||||
|
||||
+ (EOAdaptorContext *)adaptorContextWithAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
- initWithAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
- (EOAdaptor*)adaptor;
|
||||
|
||||
- (EOAdaptorChannel *)createAdaptorChannel; // override
|
||||
|
||||
- (BOOL)hasOpenChannels;
|
||||
- (BOOL)hasBusyChannels;
|
||||
|
||||
- delegate;
|
||||
- (void)setDelegate:aDelegate;
|
||||
|
||||
- (void)handleDroppedConnection;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAdaptorContext (EOTransactions)
|
||||
|
||||
- (void)beginTransaction;
|
||||
- (void)commitTransaction;
|
||||
- (void)rollbackTransaction;
|
||||
|
||||
- (void)transactionDidBegin;
|
||||
- (void)transactionDidCommit;
|
||||
- (void)transactionDidRollback;
|
||||
|
||||
- (BOOL)hasOpenTransaction;
|
||||
|
||||
- (BOOL)canNestTransactions; // override
|
||||
- (unsigned)transactionNestingLevel;
|
||||
|
||||
+ (void)setDebugEnabledDefault: (BOOL)yn;
|
||||
+ (BOOL)debugEnabledDefault;
|
||||
- (void)setDebugEnabled: (BOOL)debugEnabled;
|
||||
- (BOOL)isDebugEnabled;
|
||||
|
||||
@end /* EOAdaptorContext (EOTransactions) */
|
||||
|
||||
|
||||
@interface EOAdaptorContext(Private)
|
||||
|
||||
- (void)_channelDidInit: aChannel;
|
||||
- (void)_channelWillDealloc: aChannel;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOAdaptorContextDelegation)
|
||||
|
||||
- (BOOL)adaptorContextShouldConnect: context;
|
||||
- (BOOL)adaptorContextShouldBegin: context;
|
||||
- (void)adaptorContextDidBegin: context;
|
||||
- (BOOL)adaptorContextShouldCommit: context;
|
||||
- (void)adaptorContextDidCommit: context;
|
||||
- (BOOL)adaptorContextShouldRollback: context;
|
||||
- (void)adaptorContextDidRollback: context;
|
||||
|
||||
@end /* NSObject(EOAdaptorContextDelegate) */
|
||||
|
||||
extern NSString *EOAdaptorContextBeginTransactionNotification;
|
||||
extern NSString *EOAdaptorContextCommitTransactionNotification;
|
||||
extern NSString *EOAdaptorContextRollbackTransactionNotification;
|
||||
|
||||
#endif /* __EOAdaptorContext_h__*/
|
277
EOAccess/EOAdaptorContext.m
Normal file
277
EOAccess/EOAdaptorContext.m
Normal file
|
@ -0,0 +1,277 @@
|
|||
/**
|
||||
EOAdaptorContext.m <title>EOAdaptorContext Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSNotification.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
|
||||
NSString *EOAdaptorContextBeginTransactionNotification = @"EOAdaptorContextBeginTransactionNotofication";
|
||||
NSString *EOAdaptorContextCommitTransactionNotification = @"EOAdaptorContextCommitTransactionNotofication";
|
||||
NSString *EOAdaptorContextRollbackTransactionNotification = @"EOAdaptorContextRollbackTransactionNotofication";
|
||||
|
||||
|
||||
@implementation EOAdaptorContext
|
||||
|
||||
+ (EOAdaptorContext *)adaptorContextWithAdaptor: (EOAdaptor *)adaptor
|
||||
{
|
||||
return [[[self alloc] initWithAdaptor: adaptor] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithAdaptor: (EOAdaptor *)adaptor
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
[adaptor _registerAdaptorContext: self];
|
||||
|
||||
ASSIGN(_adaptor, adaptor);
|
||||
_channels = [NSMutableArray new];
|
||||
_transactionNestingLevel = 0;
|
||||
|
||||
[self setDebugEnabled: [[self class] debugEnabledDefault]];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_adaptor _unregisterAdaptorContext: self];
|
||||
|
||||
DESTROY(_adaptor);
|
||||
DESTROY(_channels);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (EOAdaptorChannel *)createAdaptorChannel
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)hasOpenChannels
|
||||
{
|
||||
int i, count = [_channels count];
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
if ([[[_channels objectAtIndex: i] nonretainedObjectValue] isOpen])
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)hasBusyChannels
|
||||
{
|
||||
int i, count = [_channels count];
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
if ([[[_channels objectAtIndex: i] nonretainedObjectValue]
|
||||
isFetchInProgress])
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)setDelegate:delegate
|
||||
{
|
||||
_delegate = delegate;
|
||||
|
||||
_delegateRespondsTo.shouldConnect =
|
||||
[delegate respondsToSelector:@selector(adaptorContextShouldConnect:)];
|
||||
_delegateRespondsTo.shouldBegin =
|
||||
[delegate respondsToSelector:@selector(adaptorContextShouldBegin:)];
|
||||
_delegateRespondsTo.didBegin =
|
||||
[delegate respondsToSelector:@selector(adaptorContextDidBegin:)];
|
||||
_delegateRespondsTo.shouldCommit =
|
||||
[delegate respondsToSelector:@selector(adaptorContextShouldCommit:)];
|
||||
_delegateRespondsTo.didCommit =
|
||||
[delegate respondsToSelector:@selector(adaptorContextDidCommit:)];
|
||||
_delegateRespondsTo.shouldRollback =
|
||||
[delegate respondsToSelector:@selector(adaptorContextShouldRollback:)];
|
||||
_delegateRespondsTo.didRollback =
|
||||
[delegate respondsToSelector:@selector(adaptorContextDidRollback:)];
|
||||
}
|
||||
|
||||
- (EOAdaptor *)adaptor
|
||||
{
|
||||
return _adaptor;
|
||||
}
|
||||
|
||||
- delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (void)handleDroppedConnection
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAdaptorContext (EOTransactions)
|
||||
|
||||
- (void)beginTransaction
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)commitTransaction
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)rollbackTransaction
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)transactionDidBegin
|
||||
{
|
||||
// Increment the transaction scope
|
||||
_transactionNestingLevel++;
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOAdaptorContextBeginTransactionNotification
|
||||
object: self];
|
||||
//the notification call dbcontext _beginTransaction
|
||||
}
|
||||
|
||||
- (void)transactionDidCommit
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
// Decrement the transaction scope
|
||||
_transactionNestingLevel--;//OK
|
||||
|
||||
//OK
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOAdaptorContextCommitTransactionNotification
|
||||
object: self];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)transactionDidRollback
|
||||
{
|
||||
// Decrement the transaction scope
|
||||
_transactionNestingLevel--;
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOAdaptorContextRollbackTransactionNotification
|
||||
object: self];
|
||||
}
|
||||
|
||||
- (BOOL)hasOpenTransaction
|
||||
{
|
||||
if (_transactionNestingLevel > 0)
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)canNestTransactions
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (unsigned)transactionNestingLevel
|
||||
{
|
||||
return _transactionNestingLevel;
|
||||
}
|
||||
|
||||
+ (void)setDebugEnabledDefault: (BOOL)flag
|
||||
{
|
||||
NSString *yn = (flag ? @"YES" : @"NO");
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] setObject: yn
|
||||
forKey: @"EOAdaptorDebugEnabled"];
|
||||
}
|
||||
|
||||
+ (BOOL)debugEnabledDefault
|
||||
{
|
||||
//OK
|
||||
return [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey: @"EOAdaptorDebugEnabled"];
|
||||
}
|
||||
|
||||
- (void)setDebugEnabled:(BOOL)debugEnabled
|
||||
{
|
||||
_debug = debugEnabled;
|
||||
}
|
||||
|
||||
- (BOOL)isDebugEnabled
|
||||
{
|
||||
return _debug;
|
||||
}
|
||||
|
||||
@end /* EOAdaptorContext (EOTransactions) */
|
||||
|
||||
|
||||
@implementation EOAdaptorContext (EOAdaptorContextPrivate)
|
||||
|
||||
//_registerAdaptorChannel:
|
||||
- (void)_channelDidInit: channel
|
||||
{
|
||||
[_channels addObject: [NSValue valueWithNonretainedObject: channel]];
|
||||
|
||||
[channel setDebugEnabled: [self isDebugEnabled]];
|
||||
//call self delegate
|
||||
//call channel setDelegate: returned ?
|
||||
}
|
||||
|
||||
- (void)_channelWillDealloc:channel
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = [_channels count] - 1; i >= 0; i--)
|
||||
{
|
||||
if ([[_channels objectAtIndex: i] nonretainedObjectValue] == channel)
|
||||
{
|
||||
[_channels removeObjectAtIndex: i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
215
EOAccess/EOAdaptorOperation.m
Normal file
215
EOAccess/EOAdaptorOperation.m
Normal file
|
@ -0,0 +1,215 @@
|
|||
/**
|
||||
EOAdaptorOperation.m <title>EOAdaptorOperation Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EODatabaseOperation.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
|
||||
#import <EOControl/EOSortOrdering.h>
|
||||
|
||||
|
||||
@implementation EOAdaptorOperation
|
||||
|
||||
+ (EOAdaptorOperation *)adaptorOperationWithEntity: (EOEntity *)entity
|
||||
{
|
||||
return [[[self alloc] initWithEntity: entity] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithEntity: (EOEntity *)entity
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(_entity, entity);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_entity);
|
||||
DESTROY(_qualifier);
|
||||
DESTROY(_changedValues);
|
||||
DESTROY(_attributes);
|
||||
DESTROY(_storedProcedure);
|
||||
DESTROY(_exception);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (EOAdaptorOperator)adaptorOperator
|
||||
{
|
||||
return _adaptorOperator;
|
||||
}
|
||||
|
||||
- (void)setAdaptorOperator: (EOAdaptorOperator)adaptorOperator
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"adaptorOperator=%d", adaptorOperator);
|
||||
|
||||
_adaptorOperator = adaptorOperator;
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_adaptorOperator=%d", _adaptorOperator);
|
||||
}
|
||||
|
||||
- (EOEntity *)entity
|
||||
{
|
||||
return _entity;
|
||||
}
|
||||
|
||||
- (EOQualifier *)qualifier
|
||||
{
|
||||
return _qualifier;
|
||||
}
|
||||
|
||||
- (void)setQualifier: (EOQualifier *)qualifier
|
||||
{
|
||||
ASSIGN(_qualifier, qualifier);
|
||||
}
|
||||
|
||||
- (NSDictionary *)changedValues
|
||||
{
|
||||
return _changedValues;
|
||||
}
|
||||
|
||||
- (void)setChangedValues: (NSDictionary *)changedValues
|
||||
{
|
||||
ASSIGN(_changedValues, changedValues);
|
||||
}
|
||||
|
||||
- (NSArray *)attributes
|
||||
{
|
||||
return _attributes;
|
||||
}
|
||||
|
||||
- (void)setAttributes: (NSArray *)attributes
|
||||
{
|
||||
ASSIGN(_attributes, attributes);
|
||||
}
|
||||
|
||||
- (EOStoredProcedure *)storedProcedure
|
||||
{
|
||||
return _storedProcedure;
|
||||
}
|
||||
|
||||
- (void)setStoredProcedure: (EOStoredProcedure *)storedProcedure
|
||||
{
|
||||
ASSIGN(_storedProcedure, storedProcedure);
|
||||
}
|
||||
|
||||
- (NSException *)exception
|
||||
{
|
||||
return _exception;
|
||||
}
|
||||
|
||||
- (void)setException: (NSException *)exception
|
||||
{
|
||||
ASSIGN(_exception, exception);
|
||||
}
|
||||
|
||||
- (NSComparisonResult)compareAdaptorOperation: (EOAdaptorOperation *)adaptorOp
|
||||
{
|
||||
NSComparisonResult res;
|
||||
EOAdaptorOperator otherOp = [adaptorOp adaptorOperator];
|
||||
|
||||
res = [[_entity name] compare: [[adaptorOp entity] name]];
|
||||
|
||||
if(res == NSOrderedSame)
|
||||
{
|
||||
if(_adaptorOperator == otherOp)
|
||||
res = NSOrderedSame;
|
||||
else if(_adaptorOperator < otherOp)
|
||||
res = NSOrderedAscending;
|
||||
else
|
||||
res = NSOrderedDescending;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
//TODO revoir
|
||||
NSString *operatorString = nil;
|
||||
NSString *desc = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
switch(_adaptorOperator)
|
||||
{
|
||||
case EOAdaptorUndefinedOperator:
|
||||
operatorString = @"EOAdaptorUndefinedOperator";
|
||||
break;
|
||||
case EOAdaptorLockOperator:
|
||||
operatorString = @"EOAdaptorLockOperator";
|
||||
break;
|
||||
case EOAdaptorInsertOperator:
|
||||
operatorString = @"EOAdaptorInsertOperator";
|
||||
break;
|
||||
case EOAdaptorUpdateOperator:
|
||||
operatorString = @"EOAdaptorUpdateOperator";
|
||||
break;
|
||||
case EOAdaptorDeleteOperator:
|
||||
operatorString = @"EOAdaptorDeleteOperator";
|
||||
break;
|
||||
case EOAdaptorStoredProcedureOperator:
|
||||
operatorString = @"EOAdaptorStoredProcedureOperator";
|
||||
break;
|
||||
default:
|
||||
operatorString = @"Unknwon";
|
||||
break;
|
||||
}
|
||||
|
||||
desc = [NSString stringWithFormat: @"<%s %p : operator: %@ entity: %@ qualifier:%@\nchangedValues: %@\nattributes:%@\nstoredProcedure: %@\nexception: %@>",
|
||||
object_get_class_name(self),
|
||||
(void*)self,
|
||||
operatorString,
|
||||
[_entity name],
|
||||
_qualifier,
|
||||
_changedValues,
|
||||
_attributes,
|
||||
_storedProcedure,
|
||||
_exception];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
@end
|
40
EOAccess/EOAdaptorPriv.h
Normal file
40
EOAccess/EOAdaptorPriv.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
EOAdaptorPriv.h
|
||||
|
||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: Nov 2002
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAdaptorPriv_h__
|
||||
#define __EOAdaptorPriv_h__
|
||||
|
||||
|
||||
@interface EOAdaptor(EOAdaptorPrivate)
|
||||
|
||||
- (void) _requestConcreteImplementationForSelector: (SEL)param0;
|
||||
- (void) _unregisterAdaptorContext: (EOAdaptorContext*)adaptorContext;
|
||||
- (void) _registerAdaptorContext: (EOAdaptorContext*)adaptorContext;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#endif /* __EOAdaptorPriv_h__ */
|
282
EOAccess/EOAttribute.h
Normal file
282
EOAccess/EOAttribute.h
Normal file
|
@ -0,0 +1,282 @@
|
|||
/*
|
||||
EOAttribute.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: Feb 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAttribute_h__
|
||||
#define __EOAttribute_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
|
||||
#import <extensions/GCObject.h>
|
||||
#import <extensions/GCArray.h>
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOPropertyListEncoding.h>
|
||||
|
||||
|
||||
@class EOEntity;
|
||||
@class EOExpressionArray;
|
||||
@class EOStoredProcedure;
|
||||
|
||||
|
||||
typedef enum {
|
||||
EOFactoryMethodArgumentIsNSData = 0,
|
||||
EOFactoryMethodArgumentIsNSString,
|
||||
EOFactoryMethodArgumentIsBytes
|
||||
} EOFactoryMethodArgumentType;
|
||||
|
||||
typedef enum {
|
||||
EOAdaptorNumberType = 0,
|
||||
EOAdaptorCharactersType,
|
||||
EOAdaptorBytesType,
|
||||
EOAdaptorDateType
|
||||
} EOAdaptorValueType;
|
||||
|
||||
typedef enum {
|
||||
EOVoid = 0,
|
||||
EOInParameter,
|
||||
EOOutParameter,
|
||||
EOInOutParameter
|
||||
} EOParameterDirection;
|
||||
|
||||
|
||||
@interface EOAttribute : GCObject <EOPropertyListEncoding>
|
||||
{
|
||||
NSString *_name;
|
||||
NSString *_prototypeName;
|
||||
NSString *_columnName;
|
||||
NSString *_externalType;
|
||||
NSString *_valueType;
|
||||
NSString *_valueClassName;
|
||||
NSString *_readFormat;
|
||||
NSString *_writeFormat;
|
||||
NSTimeZone *_serverTimeZone;
|
||||
unsigned int _width;
|
||||
unsigned short _precision;
|
||||
short _scale;
|
||||
Class _valueClass;
|
||||
EOFactoryMethodArgumentType _argumentType;
|
||||
NSString *_valueFactoryMethodName;
|
||||
NSString *_adaptorValueConversionMethodName;
|
||||
SEL _valueFactoryMethod;
|
||||
SEL _adaptorValueConversionMethod;
|
||||
struct {
|
||||
unsigned int allowsNull:1;
|
||||
unsigned int isReadOnly:1;
|
||||
unsigned int isParentAnEOEntity:1;
|
||||
unsigned int protoOverride:17;
|
||||
unsigned int unused : 12;
|
||||
unsigned int extraRefCount;
|
||||
} _flags;
|
||||
|
||||
NSDictionary *_sourceToDestinationKeyMap;
|
||||
EOParameterDirection _parameterDirection;
|
||||
NSDictionary *_userInfo;
|
||||
NSDictionary *_internalInfo;
|
||||
NSString *_docComment;
|
||||
|
||||
/* Garbage collectable objects */
|
||||
// EOEntity *_entity;
|
||||
// GCMutableArray *_definitionArray; // These variables are meaningful only
|
||||
id _parent;
|
||||
EOAttribute *_prototype;
|
||||
EOExpressionArray *_definitionArray;
|
||||
EOAttribute *_realAttribute; // if the attribute is flattened //Not in EOF !
|
||||
}
|
||||
|
||||
/** returns an autoreleased attribute owned by onwer and built from propertyList **/
|
||||
+ (id) attributeWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner;
|
||||
|
||||
/* Accessing the entity */
|
||||
- (NSString *)name;
|
||||
|
||||
- (EOEntity *)entity;
|
||||
|
||||
- (EOStoredProcedure *)storedProcedure;
|
||||
|
||||
- (id)parent;
|
||||
|
||||
- (NSString *)prototypeName;
|
||||
- (EOAttribute *)prototype;
|
||||
|
||||
- (NSString *)externalType;
|
||||
|
||||
- (NSString *)columnName;
|
||||
|
||||
- (NSString *)definition;
|
||||
|
||||
- (BOOL)isFlattened;
|
||||
|
||||
- (BOOL)isDerived;
|
||||
|
||||
- (BOOL)isReadOnly;
|
||||
|
||||
- (NSString *)valueClassName;
|
||||
|
||||
- (NSString *)valueType;
|
||||
|
||||
- (unsigned)width;
|
||||
|
||||
- (unsigned)precision;
|
||||
|
||||
- (int)scale;
|
||||
|
||||
- (BOOL)allowsNull;
|
||||
|
||||
- (NSString *)writeFormat;
|
||||
- (NSString *)readFormat;
|
||||
|
||||
- (EOParameterDirection)parameterDirection;
|
||||
|
||||
- (NSDictionary *)userInfo;
|
||||
|
||||
- (NSString *)docComment;
|
||||
|
||||
- (BOOL)isKeyDefinedByPrototype: (NSString *)key;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAttribute (EOAttributeEditing)
|
||||
|
||||
- (NSException *)validateName: (NSString *)name;
|
||||
|
||||
- (void)setName: (NSString *)name;
|
||||
|
||||
- (void)setPrototypeName: (NSString *)prototypeName;
|
||||
|
||||
- (void)setReadOnly: (BOOL)yn;
|
||||
|
||||
- (void)setColumnName: (NSString *)columnName;
|
||||
|
||||
- (void)setDefinition: (NSString *)definition;
|
||||
|
||||
- (void)setExternalType: (NSString *)type;
|
||||
|
||||
- (void)setValueType: (NSString *)type;
|
||||
|
||||
- (void)setValueClassName: (NSString *)name;
|
||||
|
||||
- (void)setWidth: (unsigned)length;
|
||||
|
||||
- (void)setPrecision: (unsigned)precision;
|
||||
|
||||
- (void)setScale: (int)scale;
|
||||
|
||||
- (void)setAllowsNull: (BOOL)allowsNull;
|
||||
|
||||
- (void)setWriteFormat: (NSString *)string;
|
||||
|
||||
- (void)setReadFormat: (NSString *)string;
|
||||
|
||||
- (void)setParameterDirection: (EOParameterDirection)parameterDirection;
|
||||
|
||||
- (void)setUserInfo: (NSDictionary *)dictionary;
|
||||
|
||||
- (void)setInternalInfo: (NSDictionary *)dictionary;
|
||||
|
||||
- (void)setDocComment: (NSString *)docComment;
|
||||
|
||||
- (id)_normalizeDefinition: (EOExpressionArray*)definition
|
||||
path: (id)path;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAttribute(EOModelBeautifier)
|
||||
- (void)beautifyName;
|
||||
@end
|
||||
|
||||
@interface EOAttribute (NSCalendarDateSupport)
|
||||
- (NSTimeZone *)serverTimeZone;
|
||||
@end
|
||||
|
||||
@interface EOAttribute(NSCalendarDateSupportEditing)
|
||||
- (void)setServerTimeZone: (NSTimeZone *)tz;
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAttribute (EOAttributeValueCreation)
|
||||
|
||||
- (id)newValueForBytes: (const void *)bytes
|
||||
length: (int)length;
|
||||
|
||||
- (id)newValueForBytes: (const void *)bytes
|
||||
length: (int)length
|
||||
encoding: (NSStringEncoding)encoding;
|
||||
|
||||
- (NSCalendarDate *)newDateForYear: (int)year
|
||||
month: (unsigned)month
|
||||
day: (unsigned)day
|
||||
hour: (unsigned)hour
|
||||
minute: (unsigned)minute
|
||||
second: (unsigned)second
|
||||
millisecond: (unsigned)millisecond
|
||||
timezone: (NSTimeZone *)timezone
|
||||
zone: (NSZone *)zone;
|
||||
|
||||
- (NSString *)valueFactoryMethodName;
|
||||
|
||||
- (SEL)valueFactoryMethod;
|
||||
|
||||
- (id)adaptorValueByConvertingAttributeValue: (id)value;
|
||||
|
||||
- (NSString *)adaptorValueConversionMethodName;
|
||||
|
||||
- (SEL)adaptorValueConversionMethod;
|
||||
|
||||
- (EOAdaptorValueType)adaptorValueType;
|
||||
|
||||
- (EOFactoryMethodArgumentType)factoryMethodArgumentType;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAttribute(EOAttributeValueCreationEditing)
|
||||
|
||||
- (void)setValueFactoryMethodName: (NSString *)factoryMethodName;
|
||||
|
||||
- (void)setAdaptorValueConversionMethodName: (NSString *)conversionMethodName;
|
||||
|
||||
- (void)setFactoryMethodArgumentType: (EOFactoryMethodArgumentType)argumentType;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOAttribute(EOAttributeValueMapping)
|
||||
- (NSException *)validateValue: (id *)valueP;
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOCustomClassArchiving)
|
||||
|
||||
+ objectWithArchiveData: (NSData *)data;
|
||||
- (NSData *)archiveData;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOAttribute_h__ */
|
1285
EOAccess/EOAttribute.m
Normal file
1285
EOAccess/EOAttribute.m
Normal file
File diff suppressed because it is too large
Load diff
50
EOAccess/EOAttributePriv.h
Normal file
50
EOAccess/EOAttributePriv.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
EOAttributePriv.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOAttributePriv_h__
|
||||
#define __EOAttributePriv_h__
|
||||
|
||||
@interface EOAttribute (EOAttributePrivate)
|
||||
|
||||
- (GCMutableArray *)_definitionArray;
|
||||
|
||||
- (void)setParent: (id)parent;
|
||||
- (EOAttribute *)realAttribute;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOAttribute (EOAttributePrivate2)
|
||||
|
||||
- (BOOL) _hasAnyOverrides;
|
||||
- (void) _resetPrototype;
|
||||
- (void) _updateFromPrototype;
|
||||
- (void) _setOverrideForKeyEnum: (int)keyEnum;
|
||||
- (BOOL) _isKeyEnumOverriden: (int)param0;
|
||||
- (BOOL) _isKeyEnumDefinedByPrototype: (int)param0;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOAttributePriv_h__ */
|
113
EOAccess/EODatabase.h
Normal file
113
EOAccess/EODatabase.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
EODatabase.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: Jun 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabase_h__
|
||||
#define __EODatabase_h__
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
@class EOAdaptor;
|
||||
@class EOModel;
|
||||
@class EOEntity;
|
||||
|
||||
@class EODatabaseContext;
|
||||
@class EOGlobalID;
|
||||
@class EOEditingContext;
|
||||
|
||||
|
||||
extern NSString *EOGeneralDatabaseException;
|
||||
|
||||
|
||||
@interface EODatabase : NSObject
|
||||
{
|
||||
NSMutableArray *_registeredContexts;
|
||||
NSMutableDictionary *_snapshots;
|
||||
NSMutableArray *_models;
|
||||
NSMutableDictionary *_entityCache;
|
||||
EOAdaptor *_adaptor;
|
||||
NSMutableDictionary *_toManySnapshots;
|
||||
}
|
||||
|
||||
+ (EODatabase *)databaseWithModel: (EOModel *)model;
|
||||
|
||||
- initWithAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
- initWithModel: (EOModel *)model;
|
||||
|
||||
- (NSArray *)registeredContexts;
|
||||
|
||||
- (void)registerContext: (EODatabaseContext *)context;
|
||||
- (void)unregisterContext: (EODatabaseContext *)context;
|
||||
|
||||
- (EOAdaptor *)adaptor;
|
||||
|
||||
- (void)addModel: (EOModel *)model;
|
||||
- (void)removeModel: (EOModel *)model;
|
||||
- (BOOL)addModelIfCompatible: (EOModel *)model;
|
||||
|
||||
- (NSArray *)models;
|
||||
|
||||
- (EOEntity *)entityNamed: (NSString *)entityName;
|
||||
|
||||
- (EOEntity *)entityForObject: (id)object;
|
||||
|
||||
- (NSArray *)resultCacheForEntityNamed: (NSString *)name;
|
||||
- (void)setResultCache: (NSArray *)cache forEntityNamed: (NSString *)name;
|
||||
- (void)invalidateResultCacheForEntityNamed: (NSString *)name;
|
||||
- (void)invalidateResultCache;
|
||||
- (void)handleDroppedConnection;
|
||||
@end
|
||||
|
||||
|
||||
@interface EODatabase (EOUniquing)
|
||||
|
||||
- (void)recordSnapshot: (NSDictionary *)snapshot forGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
- (NSDictionary *)snapshotForGlobalID:(EOGlobalID *)gid;
|
||||
|
||||
- (void)recordSnapshot:(NSArray *)gids
|
||||
forSourceGlobalID:(EOGlobalID *)gid
|
||||
relationshipName:(NSString *)name;
|
||||
|
||||
- (NSArray *)snapshotForSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName: (NSString *)name;
|
||||
|
||||
- (void)forgetSnapshotForGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
- (void)forgetSnapshotsForGlobalIDs: (NSArray *)array;
|
||||
|
||||
- (void)forgetAllSnapshots;
|
||||
|
||||
- (void)recordSnapshots: (NSDictionary *)snapshots;
|
||||
|
||||
- (void)recordToManySnapshots: (NSDictionary *)snapshots;
|
||||
|
||||
- (NSDictionary *)snapshots;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#endif /* __EODatabase_h__ */
|
617
EOAccess/EODatabase.m
Normal file
617
EOAccess/EODatabase.m
Normal file
|
@ -0,0 +1,617 @@
|
|||
/**
|
||||
EODatabase.m <title>EODatabase Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOAccessFault.h>
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
|
||||
#import <EOAccess/EODatabase.h>
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
|
||||
#import <EOControl/EOObjectStore.h>
|
||||
|
||||
/* TODO
|
||||
|
||||
Controllare il resultCache, ad ogni forget/invalidate deve essere
|
||||
updatato.
|
||||
*/
|
||||
|
||||
NSString *EOGeneralDatabaseException = @"EOGeneralDatabaseException";
|
||||
|
||||
|
||||
@implementation EODatabase
|
||||
|
||||
/*
|
||||
* Database Global Methods
|
||||
*/
|
||||
|
||||
static NSMutableArray *databaseInstances;
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
// THREAD
|
||||
databaseInstances = [NSMutableArray new];
|
||||
}
|
||||
|
||||
+ (void)makeAllDatabasesPerform: (SEL)aSelector withObject: anObject
|
||||
{
|
||||
int i;
|
||||
|
||||
// THREAD
|
||||
for (i = [databaseInstances count] - 1; i >= 0; i--)
|
||||
[[[databaseInstances objectAtIndex: i] nonretainedObjectValue]
|
||||
performSelector: aSelector withObject: anObject];
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializing new instances
|
||||
*/
|
||||
//OK
|
||||
- initWithAdaptor: (EOAdaptor *)adaptor
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if (!adaptor)
|
||||
{
|
||||
[self autorelease];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if ((self = [super init]))
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver: self
|
||||
selector: @selector(_globalIDChanged:)
|
||||
name: @"EOGlobalIDChangedNotification"
|
||||
object: nil];
|
||||
// [databaseInstances addObject:[NSValue valueWithNonretainedObject:self]];
|
||||
ASSIGN(_adaptor,adaptor);
|
||||
|
||||
_registeredContexts = [NSMutableArray new];
|
||||
_snapshots = [NSMutableDictionary new];
|
||||
_models = [NSMutableArray new];
|
||||
_entityCache = [NSMutableDictionary new];
|
||||
_toManySnapshots = [NSMutableDictionary new];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (EODatabase *)databaseWithModel: (EOModel *)model
|
||||
{
|
||||
return [[[self alloc] initWithModel: model] autorelease];
|
||||
}
|
||||
|
||||
- (id)initWithModel: (EOModel *)model
|
||||
{
|
||||
EOAdaptor *adaptor = [EOAdaptor adaptorWithModel:model]; //Handle exception to deallocate self ?
|
||||
|
||||
if ((self = [self initWithAdaptor: adaptor]))
|
||||
{
|
||||
[self addModel: model];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_adaptor release];
|
||||
[_registeredContexts release];
|
||||
[_snapshots release];
|
||||
[_models release];
|
||||
[_entityCache release];
|
||||
[_toManySnapshots release];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSArray *)registeredContexts
|
||||
{
|
||||
NSMutableArray *array = [NSMutableArray array];
|
||||
int i, n;
|
||||
|
||||
for (i = 0, n = [_registeredContexts count]; i < n; i++)
|
||||
[array addObject: [[_registeredContexts objectAtIndex: i]
|
||||
nonretainedObjectValue]];
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
- (unsigned int) _indexOfRegisteredContext: (EODatabaseContext *)context
|
||||
{
|
||||
int i;
|
||||
|
||||
for( i = [_registeredContexts count]-1; i >= 0; i--)
|
||||
if ([[_registeredContexts objectAtIndex: i]
|
||||
nonretainedObjectValue] == context)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
- (void)registerContext: (EODatabaseContext *)context
|
||||
{
|
||||
unsigned int index=0;
|
||||
|
||||
//OK
|
||||
|
||||
NSAssert(([context database] == self),@"Database context is not me");
|
||||
|
||||
index = [self _indexOfRegisteredContext:context];
|
||||
|
||||
NSAssert(index == (unsigned int) -1 , @"DatabaseContext already registred");
|
||||
|
||||
[_registeredContexts addObject:
|
||||
[NSValue valueWithNonretainedObject: context]];
|
||||
}
|
||||
|
||||
- (void)unregisterContext: (EODatabaseContext *)context
|
||||
{
|
||||
//OK
|
||||
unsigned int index = [self _indexOfRegisteredContext:context];
|
||||
|
||||
NSAssert(index != (unsigned int) -1, @"DatabaseContext wasn't registred");
|
||||
|
||||
[_registeredContexts removeObjectAtIndex:index];
|
||||
}
|
||||
|
||||
- (EOAdaptor *)adaptor
|
||||
{
|
||||
return _adaptor;
|
||||
}
|
||||
|
||||
- (void)addModel: (EOModel *)model
|
||||
{
|
||||
[_models addObject: model];
|
||||
}
|
||||
|
||||
- (void)removeModel: (EOModel *)model
|
||||
{
|
||||
[_models removeObject: model];
|
||||
}
|
||||
|
||||
- (BOOL)addModelIfCompatible: (EOModel *)model;
|
||||
{
|
||||
BOOL modelOk = NO;
|
||||
|
||||
NSAssert(model, @"No model");//WO simply return NO (doesn't handle this case).
|
||||
|
||||
if ([_models containsObject:model] == YES)
|
||||
modelOk = YES;
|
||||
else
|
||||
{
|
||||
EOAdaptor *adaptor = [self adaptor];
|
||||
|
||||
if ([[model adaptorName] isEqualToString: [adaptor name]] == YES
|
||||
|| [_adaptor canServiceModel: model] == YES)
|
||||
{
|
||||
[_models addObject: model];
|
||||
modelOk = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return modelOk;
|
||||
}
|
||||
|
||||
- (NSArray *)models
|
||||
{
|
||||
return _models;
|
||||
}
|
||||
|
||||
- (EOEntity *)entityNamed: (NSString *)entityName
|
||||
{
|
||||
//OK
|
||||
EOEntity *entity=nil;
|
||||
int i = 0;
|
||||
int count = 0;
|
||||
|
||||
NSAssert(entityName, @"No entity name");
|
||||
|
||||
count = [_models count];
|
||||
|
||||
for(i = 0; !entity && i < count; i++)
|
||||
{
|
||||
EOModel *model = [_models objectAtIndex: i];
|
||||
|
||||
entity = [model entityNamed: entityName];
|
||||
}
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
- (EOEntity *)entityForObject: (id)object
|
||||
{
|
||||
//OK
|
||||
EOEntity *entity = nil;
|
||||
NSString *entityName = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"object=%p (of class %@)",
|
||||
object, [object class]);
|
||||
NSAssert(object, @"No object");
|
||||
|
||||
if ([EOFault isFault: object])
|
||||
{
|
||||
EOFaultHandler *faultHandler = [EOFault handlerForFault: object];
|
||||
EOKeyGlobalID *gid;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"faultHandler=%p (of class %@)",
|
||||
faultHandler, [faultHandler class]);
|
||||
|
||||
gid = [(EOAccessFaultHandler *)faultHandler globalID];
|
||||
|
||||
NSAssert3(gid, @"No gid for fault handler %p for object %p of class %@",
|
||||
faultHandler, object, [object class]);
|
||||
entityName = [gid entityName];
|
||||
}
|
||||
else
|
||||
entityName = [object entityName];
|
||||
|
||||
NSAssert2(entityName, @"No object entity name for object %@ of class %@",
|
||||
object, [object class]);
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"entityName=%@", entityName);
|
||||
|
||||
entity = [self entityNamed: entityName];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"entity=%p", entity);
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
- (NSArray *)resultCacheForEntityNamed: (NSString *)name
|
||||
{
|
||||
return [_entityCache objectForKey: name];
|
||||
}
|
||||
|
||||
- (void)setResultCache: (NSArray *)cache
|
||||
forEntityNamed: (NSString *)name
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
[_entityCache setObject: cache
|
||||
forKey: name];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)invalidateResultCacheForEntityNamed: (NSString *)name
|
||||
{
|
||||
[_entityCache removeObjectForKey: name];//??
|
||||
}
|
||||
|
||||
- (void)invalidateResultCache
|
||||
{
|
||||
[_entityCache removeAllObjects];
|
||||
}
|
||||
|
||||
- (void)handleDroppedConnection
|
||||
{
|
||||
NSArray *dbContextArray;
|
||||
NSEnumerator *contextEnum;
|
||||
EODatabaseContext *dbContext;
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"DatabaseLevel", @"EODatabase");
|
||||
|
||||
[_adaptor handleDroppedConnection];
|
||||
|
||||
dbContextArray = [self registeredContexts];
|
||||
contextEnum = [dbContextArray objectEnumerator];
|
||||
|
||||
while ((dbContext = [contextEnum nextObject]))
|
||||
[dbContext handleDroppedConnection];
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"DatabaseLevel", @"EODatabase");
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EODatabase (EOUniquing)
|
||||
|
||||
- (void)recordSnapshot: (NSDictionary *)snapshot
|
||||
forGlobalID: (EOGlobalID *)gid
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"snapshot %p %@", snapshot, snapshot);
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"gid=%@", gid);
|
||||
|
||||
NSAssert(gid, @"No gid");
|
||||
NSAssert(snapshot, @"No snapshot");
|
||||
NSAssert(_snapshots, @"No _snapshots");
|
||||
|
||||
[_snapshots setObject: snapshot
|
||||
forKey: gid];
|
||||
|
||||
NSAssert([_snapshots objectForKey: gid], @"SNAPSHOT not save !!");
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
//"Receive EOGlobalIDChangedNotification notification"
|
||||
- (void)_globalIDChanged: (NSNotification *)notification
|
||||
{
|
||||
NSDictionary *snapshot = nil;
|
||||
NSDictionary *userInfo = nil;
|
||||
NSEnumerator *enumerator = nil;
|
||||
EOGlobalID *tempGID = nil;
|
||||
EOGlobalID *gid = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
userInfo = [notification userInfo];
|
||||
enumerator = [userInfo keyEnumerator];
|
||||
|
||||
while ((tempGID = [enumerator nextObject]))
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"tempGID=%@", tempGID);
|
||||
|
||||
gid = [userInfo objectForKey: tempGID];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"gid=%@", gid);
|
||||
|
||||
//OK ?
|
||||
snapshot = [_snapshots objectForKey: tempGID];
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"_snapshots snapshot=%@", snapshot);
|
||||
|
||||
if (snapshot)
|
||||
{
|
||||
[_snapshots removeObjectForKey: tempGID];
|
||||
[_snapshots setObject: snapshot
|
||||
forKey: gid];
|
||||
}
|
||||
|
||||
//OK ?
|
||||
snapshot = [_toManySnapshots objectForKey: tempGID];
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"_toManySnapshots snapshot=%@",
|
||||
snapshot);
|
||||
|
||||
if (snapshot)
|
||||
{
|
||||
[_toManySnapshots removeObjectForKey: tempGID];
|
||||
[_toManySnapshots setObject: snapshot
|
||||
forKey: gid];
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (NSDictionary *)snapshotForGlobalID: (EOGlobalID *)gid
|
||||
{
|
||||
//seems OK
|
||||
NSDictionary *snapshot = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSAssert(gid, @"No gid");
|
||||
|
||||
snapshot = [_snapshots objectForKey: gid];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
- (void)recordSnapshot: (NSArray*)gids
|
||||
forSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName: (NSString *)name
|
||||
{
|
||||
//OK
|
||||
NSMutableDictionary *toMany = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSAssert(gid,@"No snapshot");
|
||||
NSAssert(gid,@"No Source Global ID");
|
||||
NSAssert(name,@"No relationship name");
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"self=%p snapshot gids=%@", self, gids);
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"SourceGlobalID gid=%@", gid);
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"relationshipName=%@", name);
|
||||
|
||||
toMany = [_toManySnapshots objectForKey: gid];
|
||||
|
||||
if (!toMany)
|
||||
{
|
||||
toMany = [NSMutableDictionary dictionaryWithCapacity: 10];
|
||||
[_toManySnapshots setObject: toMany
|
||||
forKey: gid];
|
||||
}
|
||||
|
||||
[toMany setObject: gids
|
||||
forKey: name];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (NSArray *)snapshotForSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName: (NSString *)name
|
||||
{
|
||||
NSAssert(gid, @"No Source Global ID");
|
||||
NSAssert(name, @"No relationship name");
|
||||
|
||||
return [[_toManySnapshots objectForKey: gid] objectForKey: name];
|
||||
}
|
||||
|
||||
- (void)forgetSnapshotForGlobalID: (EOGlobalID *)gid
|
||||
{
|
||||
//Seems OK
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSAssert(gid,@"No Global ID");
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"gid=%@", gid);
|
||||
|
||||
[_snapshots removeObjectForKey: gid];
|
||||
[_toManySnapshots removeObjectForKey: gid];
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOObjectsChangedInStoreNotification
|
||||
object: self
|
||||
userInfo: [NSDictionary dictionaryWithObject:
|
||||
[NSArray arrayWithObject: gid]
|
||||
forKey: EOInvalidatedKey]];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
};
|
||||
|
||||
- (void)forgetSnapshotsForGlobalIDs: (NSArray*)ids
|
||||
{
|
||||
NSEnumerator *gidEnum = nil;
|
||||
id gid = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSAssert(ids, @"No Global IDs");
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"ids=%@", ids);
|
||||
|
||||
gidEnum = [ids objectEnumerator];
|
||||
|
||||
while ((gid = [gidEnum nextObject]))
|
||||
{
|
||||
[_snapshots removeObjectForKey: gid];
|
||||
[_toManySnapshots removeObjectForKey: gid];
|
||||
}
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOObjectsChangedInStoreNotification
|
||||
object: self
|
||||
userInfo: [NSDictionary dictionaryWithObject: ids
|
||||
forKey: EOInvalidatedKey]];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)forgetAllSnapshots
|
||||
{
|
||||
NSMutableSet *gidSet = [NSMutableSet new];
|
||||
NSMutableArray *gidArray = [NSMutableArray array];
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"DatabaseLevel", @"EODatabase");
|
||||
|
||||
[gidSet addObjectsFromArray: [_snapshots allKeys]];
|
||||
[gidSet addObjectsFromArray: [_toManySnapshots allKeys]];
|
||||
[gidArray addObjectsFromArray: [gidSet allObjects]];
|
||||
[gidSet release];
|
||||
[_snapshots removeAllObjects];
|
||||
[_toManySnapshots removeAllObjects];
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOObjectsChangedInStoreNotification
|
||||
object:self
|
||||
userInfo: [NSDictionary dictionaryWithObject: gidArray
|
||||
forKey: EOInvalidatedKey]];
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"DatabaseLevel", @"EODatabase");
|
||||
}
|
||||
|
||||
- (void)recordSnapshots: (NSDictionary *)snapshots
|
||||
{
|
||||
//OK
|
||||
//VERIFY: be sure to replace all anapshot entries if any !
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
[_snapshots addEntriesFromDictionary: snapshots];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"self=%p _snapshots=%@",
|
||||
self, _snapshots);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)recordToManySnapshots: (NSDictionary *)snapshots
|
||||
{
|
||||
//Seems OK
|
||||
NSEnumerator *keyEnum = nil;
|
||||
id key = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"snapshots=%@", snapshots);
|
||||
NSAssert(snapshots, @"No snapshots");
|
||||
|
||||
keyEnum = [snapshots keyEnumerator];
|
||||
|
||||
while ((key = [keyEnum nextObject]))
|
||||
{
|
||||
NSMutableDictionary *toMany = nil;
|
||||
|
||||
toMany = [_toManySnapshots objectForKey: key]; // look if already exists
|
||||
|
||||
if (!toMany)
|
||||
{
|
||||
toMany = [NSMutableDictionary dictionaryWithCapacity: 10];
|
||||
[_toManySnapshots setObject: toMany
|
||||
forKey: key];
|
||||
}
|
||||
|
||||
[toMany addEntriesFromDictionary: [snapshots objectForKey: key]];
|
||||
}
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODatabaseContext", @"snapshots=%@", snapshots);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (NSDictionary *)snapshots
|
||||
{
|
||||
return _snapshots;
|
||||
}
|
||||
|
||||
@end /* EODatabase (EOUniquing) */
|
||||
|
92
EOAccess/EODatabaseChannel.h
Normal file
92
EOAccess/EODatabaseChannel.h
Normal file
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
EODatabaseChannel.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseChannel_h__
|
||||
#define __EODatabaseChannel_h__
|
||||
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
@class EOAdaptorChannel;
|
||||
@class EORelationship;
|
||||
@class EODatabaseContext;
|
||||
|
||||
|
||||
@interface EODatabaseChannel : NSObject
|
||||
{
|
||||
EODatabaseContext *_databaseContext;
|
||||
id _delegate;
|
||||
EOAdaptorChannel *_adaptorChannel;
|
||||
EOEntity *_currentEntity;
|
||||
EOEditingContext *_currentEditingContext;
|
||||
NSMutableArray *_fetchProperties;
|
||||
NSMutableArray *_fetchSpecifications;
|
||||
BOOL _isLocking;
|
||||
BOOL _isRefreshingObjects;
|
||||
|
||||
struct {
|
||||
unsigned int shouldSelectObjects:1;
|
||||
unsigned int didSelectObjects:1;
|
||||
unsigned int shouldUsePessimisticLock:1;
|
||||
unsigned int shouldUpdateSnapshot:1;
|
||||
unsigned int _reserved:28;
|
||||
} _delegateRespondsTo;
|
||||
}
|
||||
|
||||
+ (EODatabaseChannel*)databaseChannelWithDatabaseContext: (EODatabaseContext *)databaseContext;
|
||||
|
||||
- initWithDatabaseContext: (EODatabaseContext *)databaseContext;
|
||||
|
||||
- (void)setCurrentEntity: (EOEntity *)entity;
|
||||
- (void) setEntity: (EOEntity *)entity;
|
||||
|
||||
- (void)setCurrentEditingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)selectObjectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (id)fetchObject;
|
||||
|
||||
- (BOOL)isFetchInProgress;
|
||||
|
||||
- (void)cancelFetch;
|
||||
|
||||
- (EODatabaseContext *)databaseContext;
|
||||
|
||||
- (EOAdaptorChannel *)adaptorChannel;
|
||||
|
||||
- (BOOL)isRefreshingObjects;
|
||||
- (void)setIsRefreshingObjects: (BOOL)yn;
|
||||
|
||||
- (BOOL)isLocking;
|
||||
- (void)setIsLocking: (BOOL)isLocking;
|
||||
|
||||
- (void)setDelegate: (id)delegate;
|
||||
- (id) delegate;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EODatabaseChannel_h__ */
|
792
EOAccess/EODatabaseChannel.m
Normal file
792
EOAccess/EODatabaseChannel.m
Normal file
|
@ -0,0 +1,792 @@
|
|||
/**
|
||||
EODatabaseChannel.m <title>EODatabaseChannel</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: October 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EODatabaseChannel.h>
|
||||
#import <EOAccess/EODatabaseChannelPriv.h>
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
#import <EOAccess/EODatabaseContextPriv.h>
|
||||
#import <EOAccess/EODatabase.h>
|
||||
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EORelationship.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOAccessFault.h>
|
||||
|
||||
#import <EOControl/EOEditingContext.h>
|
||||
#import <EOControl/EOKeyValueCoding.h>
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
#import <EOControl/EOGlobalID.h>
|
||||
#import <EOControl/EOObjectStore.h>
|
||||
|
||||
@implementation EODatabaseChannel
|
||||
|
||||
+ (void)load
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver: self
|
||||
selector: @selector(_registerDatabaseChannel:)
|
||||
name: EODatabaseChannelNeededNotification
|
||||
object: nil];
|
||||
}
|
||||
|
||||
+ (void)_registerDatabaseChannel: (NSNotification *)notification
|
||||
{
|
||||
// TODO who release it ?
|
||||
[[EODatabaseChannel alloc] initWithDatabaseContext: [notification object]];
|
||||
}
|
||||
|
||||
+ (EODatabaseChannel*)databaseChannelWithDatabaseContext: (EODatabaseContext *)databaseContext
|
||||
{
|
||||
return [[[self alloc] initWithDatabaseContext: databaseContext] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithDatabaseContext:(EODatabaseContext *)databaseContext
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_databaseContext, databaseContext);
|
||||
ASSIGN(_adaptorChannel, [[_databaseContext adaptorContext]
|
||||
createAdaptorChannel]);
|
||||
//TODO NO<<<<
|
||||
[_adaptorChannel openChannel];
|
||||
|
||||
_fetchProperties = [NSMutableArray new];
|
||||
_fetchSpecifications = [NSMutableArray new];
|
||||
//NO>>>>>>>
|
||||
[_databaseContext registerChannel: self];//should be in caller
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_databaseContext unregisterChannel: self];
|
||||
|
||||
DESTROY(_databaseContext);
|
||||
[_adaptorChannel closeChannel];
|
||||
|
||||
DESTROY(_adaptorChannel);
|
||||
DESTROY(_currentEntity);
|
||||
DESTROY(_currentEditingContext);
|
||||
DESTROY(_fetchProperties);
|
||||
DESTROY(_fetchSpecifications);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)setCurrentEntity: (EOEntity *)entity
|
||||
{
|
||||
//OK
|
||||
ASSIGN(_currentEntity, entity);
|
||||
[self setEntity: entity];
|
||||
}
|
||||
|
||||
- (void) setEntity: (EOEntity *)entity
|
||||
{
|
||||
//Near OK
|
||||
NSArray *relationships = [entity relationships];
|
||||
int i = 0;
|
||||
int count = [relationships count];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"relationships=%@", relationships);
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
EORelationship *relationship = [relationships objectAtIndex:i];
|
||||
EOEntity *destinationEntity = [relationship destinationEntity];
|
||||
EOModel *destinationEntityModel = [destinationEntity model];
|
||||
EOEntity *entity = [relationship entity];
|
||||
EOModel *entityModel = [entity model];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"relationship=%@", relationship);
|
||||
NSDebugMLLog(@"gsdb", @"destinationEntity=%@", [destinationEntity name]);
|
||||
|
||||
NSAssert2(destinationEntity, @"No destinationEntity in relationship: %@ of entity %@",
|
||||
relationship, [entity name]); //TODO: flattened relationship
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"entity=%@", [entity name]);
|
||||
NSDebugMLLog(@"gsdb", @"destinationEntityModel=%p", destinationEntityModel);
|
||||
NSDebugMLLog(@"gsdb", @"entityModel=%p", entityModel);
|
||||
|
||||
//If different: try to add destinationEntityModel
|
||||
if (destinationEntityModel != entityModel)
|
||||
{
|
||||
EOEditingContext *editingContext = [self currentEditingContext];
|
||||
//EODatabaseContext *databaseContext = [self databaseContext];
|
||||
EOObjectStore *rootObjectStore = [editingContext rootObjectStore];
|
||||
NSArray *cooperatingObjectStores =
|
||||
[(EOObjectStoreCoordinator *)rootObjectStore
|
||||
cooperatingObjectStores];
|
||||
int cosCount = [cooperatingObjectStores count];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < cosCount; i++)
|
||||
{
|
||||
id objectStore = [cooperatingObjectStores objectAtIndex: i];
|
||||
EODatabase *objectStoreDatabase = [objectStore database];
|
||||
BOOL modelOK = [objectStoreDatabase
|
||||
addModelIfCompatible: destinationEntityModel];
|
||||
|
||||
if (!modelOK)
|
||||
{
|
||||
/*EODatabase *dbDatabase = [[[EODatabase alloc]
|
||||
initWithModel: destinationEntityModel] autorelease];*/
|
||||
[self notImplemented: _cmd]; //TODO: finish it
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setCurrentEditingContext: (EOEditingContext*)context
|
||||
{
|
||||
//OK
|
||||
EOCooperatingObjectStore *cooperatingObjectStore = [self databaseContext];
|
||||
EOObjectStore *objectStore = [context rootObjectStore];
|
||||
|
||||
[(EOObjectStoreCoordinator*)objectStore
|
||||
addCooperatingObjectStore: cooperatingObjectStore];
|
||||
|
||||
ASSIGN(_currentEditingContext, context);
|
||||
}
|
||||
|
||||
- (void)selectObjectsWithFetchSpecification: (EOFetchSpecification *)fetch
|
||||
editingContext: (EOEditingContext *)context
|
||||
{
|
||||
//should be OK
|
||||
NSString *entityName = nil;
|
||||
EODatabase *database = nil;
|
||||
EOEntity *entity = nil;
|
||||
EOQualifier *qualifier = nil;
|
||||
EOQualifier *schemaBasedQualifier = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
entityName = [fetch entityName];
|
||||
database = [_databaseContext database];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"database=%@", database);
|
||||
|
||||
entity = [database entityNamed: entityName];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"entity name=%@", [entity name]);
|
||||
|
||||
qualifier=[fetch qualifier];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"qualifier=%@", qualifier);
|
||||
|
||||
schemaBasedQualifier =
|
||||
[(id<EOQualifierSQLGeneration>)qualifier
|
||||
schemaBasedQualifierWithRootEntity: entity];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"schemaBasedQualifier=%@", schemaBasedQualifier);
|
||||
NSDebugMLLog(@"gsdb", @"qualifier=%@", qualifier);
|
||||
|
||||
if (schemaBasedQualifier && schemaBasedQualifier != qualifier)
|
||||
{
|
||||
EOFetchSpecification *newFetch = nil;
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"fetch=%@", fetch);
|
||||
//howto avoid copy of uncopiable qualifiers (i.e. those who contains uncopiable key or value)
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"fetch=%@", fetch);
|
||||
|
||||
newFetch = [[fetch copy] autorelease];
|
||||
NSDebugMLLog(@"gsdb", @"newFetch=%@", newFetch);
|
||||
|
||||
[newFetch setQualifier: schemaBasedQualifier];
|
||||
NSDebugMLLog(@"gsdb", @"newFetch=%@", newFetch);
|
||||
|
||||
fetch = newFetch;
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"%@ -- %@ 0x%x: isFetchInProgress=%s",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
([self isFetchInProgress] ? "YES" : "NO"));
|
||||
|
||||
[self _selectWithFetchSpecification:fetch
|
||||
editingContext:context];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (id)fetchObject
|
||||
{
|
||||
//seems OK
|
||||
EODatabase *database=nil;
|
||||
id object = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
database = [_databaseContext database];
|
||||
|
||||
if (![self isFetchInProgress])
|
||||
{
|
||||
NSLog(@"No Fetch in progress");
|
||||
NSDebugMLog(@"No Fetch in progress");
|
||||
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: no fetch in progress",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSArray *propertiesToFetch=nil;
|
||||
NSDictionary *row =nil;
|
||||
|
||||
NSAssert(_currentEditingContext, @"No current editing context");
|
||||
NSAssert(_adaptorChannel,@"No adaptor channel");
|
||||
|
||||
propertiesToFetch = [self _propertiesToFetch];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"Will fetchRow");
|
||||
|
||||
row = [_adaptorChannel fetchRowWithZone: NULL];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"row=%@", row);
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@", [_currentEntity attributesToFetch]);
|
||||
|
||||
if (!row)
|
||||
{
|
||||
//TODO
|
||||
//VERIFY
|
||||
/*
|
||||
if no more obj:
|
||||
if transactionNestingLevel
|
||||
adaptorContext transactionDidCommit
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOL isObjectNew = YES; //TODO used to avoid double fetch. We should see how to do when isRefreshingObjects == YES
|
||||
EOGlobalID *gid;
|
||||
NSDictionary *snapshot = nil;
|
||||
|
||||
NSAssert(_currentEntity, @"Not current Entity");
|
||||
|
||||
gid = [_currentEntity globalIDForRow: row
|
||||
isFinal: YES];//OK
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"gid=%@",gid);
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@",[_currentEntity attributesToFetch]);
|
||||
|
||||
object = [_currentEditingContext objectForGlobalID: gid]; //OK //nil
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"object=%@",object);
|
||||
|
||||
if (object)
|
||||
isObjectNew = NO;
|
||||
|
||||
NSAssert(_databaseContext,@"No database context");
|
||||
|
||||
snapshot = [_databaseContext snapshotForGlobalID: gid]; //OK
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"snapshot=%@", snapshot);
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@", [_currentEntity attributesToFetch]);
|
||||
|
||||
if (snapshot)
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"_delegateRespondsTo.shouldUpdateSnapshot=%d",
|
||||
(int)_delegateRespondsTo.shouldUpdateSnapshot);
|
||||
NSDebugMLLog(@"gsdb", @"[self isLocking]=%d",
|
||||
(int)[self isLocking]);
|
||||
NSDebugMLLog(@"gsdb", @"[self isRefreshingObjects]=%d",
|
||||
(int)[self isRefreshingObjects]);
|
||||
|
||||
//mirko:
|
||||
if((_delegateRespondsTo.shouldUpdateSnapshot == NO
|
||||
&& ([self isLocking] == YES
|
||||
|| [self isRefreshingObjects] == YES))
|
||||
|| (_delegateRespondsTo.shouldUpdateSnapshot == YES
|
||||
&& (row = (id)[_delegate databaseContext: _databaseContext
|
||||
shouldUpdateCurrentSnapshot: snapshot
|
||||
newSnapshot: row
|
||||
globalID: gid
|
||||
databaseChannel: self])))
|
||||
{ // TODO delegate not correct !
|
||||
NSDebugMLLog(@"gsdb", @"Updating Snapshot=%@", snapshot);
|
||||
NSDebugMLLog(@"gsdb", @"row=%@", row);
|
||||
|
||||
[_databaseContext recordSnapshot: row
|
||||
forGlobalID: gid];
|
||||
isObjectNew = YES; //TODO
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@", [_currentEntity attributesToFetch]);
|
||||
NSDebugMLLog(@"gsdb", @"database class=%@", [database class]);
|
||||
|
||||
NSAssert(database, @"No database-context database");
|
||||
|
||||
[database recordSnapshot: row
|
||||
forGlobalID: gid];
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"[self isRefreshingObjects]=%d",
|
||||
(int)[self isRefreshingObjects]);
|
||||
|
||||
//From mirko
|
||||
if ([self isRefreshingObjects] == YES)
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOObjectsChangedInStoreNotification
|
||||
object: _databaseContext
|
||||
userInfo: [NSDictionary dictionaryWithObject:
|
||||
[NSArray arrayWithObject:gid]
|
||||
forKey: EOUpdatedKey]]; //OK ?
|
||||
}
|
||||
|
||||
if (!object)
|
||||
{
|
||||
EOClassDescription *entityClassDescripton = [_currentEntity classDescriptionForInstances];
|
||||
|
||||
object = [entityClassDescripton createInstanceWithEditingContext: _currentEditingContext
|
||||
globalID: gid
|
||||
zone: NULL];
|
||||
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@", [_currentEntity attributesToFetch]);
|
||||
NSDebugMLLog(@"gsdb", @"object=%@", object);
|
||||
NSAssert1(object, @"No Object. entityClassDescripton=%@", entityClassDescripton);
|
||||
|
||||
[_currentEditingContext recordObject: object
|
||||
globalID: gid];
|
||||
}
|
||||
else if (object && [EOFault isFault: object])
|
||||
{
|
||||
EOAccessFaultHandler *handler = [EOFault handlerForFault: object];
|
||||
EOKeyGlobalID *handlerGID = (EOKeyGlobalID *)[handler globalID];
|
||||
|
||||
isObjectNew = YES; //TODO
|
||||
|
||||
[handlerGID isFinal]; //YES //TODO
|
||||
[EOFault clearFault: object];
|
||||
|
||||
/*mirko:
|
||||
[_databaseContext _removeBatchForGlobalID:gid
|
||||
fault:obj];
|
||||
|
||||
[EOFault clearFault:obj];
|
||||
*/
|
||||
}
|
||||
|
||||
if (isObjectNew) //TODO
|
||||
{
|
||||
[EOObserverCenter suppressObserverNotification];
|
||||
|
||||
NS_DURING
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"Initialize %p", object);
|
||||
|
||||
[_currentEditingContext initializeObject: object
|
||||
withGlobalID: gid
|
||||
editingContext: _currentEditingContext];
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
[EOObserverCenter enableObserverNotification];
|
||||
[localException raise];
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
|
||||
[EOObserverCenter enableObserverNotification];
|
||||
[object awakeFromFetchInEditingContext: _currentEditingContext];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return object;
|
||||
};
|
||||
|
||||
- (BOOL)isFetchInProgress
|
||||
{
|
||||
//NSDebugMLog(@"TEST attributesToFetch=%@", [_currentEntity attributesToFetch]);
|
||||
|
||||
return [_adaptorChannel isFetchInProgress];
|
||||
}
|
||||
|
||||
- (void)cancelFetch
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
[self _cancelInternalFetch];
|
||||
|
||||
//TODO VERIFY - NO ??!!
|
||||
[_adaptorChannel cancelFetch];
|
||||
[_fetchProperties removeAllObjects];
|
||||
[_fetchSpecifications removeAllObjects];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (EODatabaseContext *)databaseContext
|
||||
{
|
||||
return _databaseContext;
|
||||
}
|
||||
|
||||
- (EOAdaptorChannel *)adaptorChannel
|
||||
{
|
||||
return _adaptorChannel;
|
||||
}
|
||||
|
||||
- (BOOL)isRefreshingObjects
|
||||
{
|
||||
return _isRefreshingObjects;
|
||||
}
|
||||
|
||||
- (void)setIsRefreshingObjects: (BOOL)yn
|
||||
{
|
||||
_isRefreshingObjects = yn;
|
||||
}
|
||||
|
||||
- (BOOL)isLocking
|
||||
{
|
||||
return _isLocking;
|
||||
}
|
||||
|
||||
- (void)setIsLocking: (BOOL)isLocking
|
||||
{
|
||||
_isLocking = isLocking;
|
||||
}
|
||||
|
||||
- (void)setDelegate: delegate
|
||||
{
|
||||
_delegate = delegate;
|
||||
|
||||
_delegateRespondsTo.shouldSelectObjects =
|
||||
[delegate respondsToSelector:@selector(databaseContext:shouldSelectObjectsWithFetchSpecification:databaseChannel:)];
|
||||
_delegateRespondsTo.didSelectObjects =
|
||||
[delegate respondsToSelector:@selector(databaseContext:didSelectObjectsWithFetchSpecification:databaseChannel:)];
|
||||
_delegateRespondsTo.shouldUsePessimisticLock =
|
||||
[delegate respondsToSelector:@selector(databaseContext:shouldUsePessimisticLockWithFetchSpecification: databaseChannel:)];
|
||||
_delegateRespondsTo.shouldUpdateSnapshot =
|
||||
[delegate respondsToSelector:@selector(databaseContext:shouldUpdateCurrentSnapshot:newSnapshot:globalID:databaseChannel:)];
|
||||
}
|
||||
|
||||
- delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@implementation EODatabaseChannel (EODatabaseChannelPrivate)
|
||||
- (NSArray*) _propertiesToFetch
|
||||
{
|
||||
//OK
|
||||
NSArray *attributesToFetch=nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
attributesToFetch = [_currentEntity _attributesToFetch];
|
||||
|
||||
NSAssert(_currentEntity, @"No current Entity");
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return attributesToFetch;
|
||||
}
|
||||
|
||||
-(void)_setCurrentEntityAndRelationshipWithFetchSpecification: (EOFetchSpecification *)fetch
|
||||
{
|
||||
//OK
|
||||
NSString *entityName = [fetch entityName];
|
||||
EODatabase *database = [_databaseContext database];
|
||||
EOEntity *entity = [database entityNamed: entityName];
|
||||
|
||||
NSAssert1(entity, @"No Entity named %@", entityName);
|
||||
|
||||
[self setCurrentEntity: entity];
|
||||
}
|
||||
|
||||
- (void) _buildNodeList:(id) param0
|
||||
withParent:(id) param1
|
||||
{
|
||||
//TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (id) currentEditingContext
|
||||
{
|
||||
return _currentEditingContext;
|
||||
}
|
||||
|
||||
- (void) _cancelInternalFetch
|
||||
{
|
||||
//OK
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if ([_adaptorChannel isFetchInProgress])
|
||||
{
|
||||
[_adaptorChannel cancelFetch];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void) _closeChannel
|
||||
{
|
||||
//TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (void) _openChannel
|
||||
{
|
||||
//TODO
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (void)_selectWithFetchSpecification: (EOFetchSpecification *)fetch
|
||||
editingContext: (EOEditingContext *)context
|
||||
{
|
||||
NSArray *propertiesToFetch = nil;
|
||||
EOUpdateStrategy updateStrategy = EOUpdateWithOptimisticLocking;
|
||||
BOOL fetchLocksObjects = NO;
|
||||
BOOL refreshesRefetchedObjects = NO;
|
||||
NSString *entityName = nil;
|
||||
EODatabase *database = nil;
|
||||
EOEntity *entity = nil;
|
||||
NSArray *primaryKeyAttributes = nil;
|
||||
NSDictionary *hints = nil;
|
||||
EOModel *model = nil;
|
||||
EOModelGroup *modelGroup = nil;
|
||||
EOQualifier *qualifier = nil;
|
||||
EOStoredProcedure *storedProcedure = nil;
|
||||
id customQueryExpressionHint = nil;//TODO
|
||||
EOSQLExpression *customQueryExpression = nil;//TODO
|
||||
NSString *storedProcedureName = nil;
|
||||
|
||||
BOOL isDeep = NO;
|
||||
NSArray *subEntities = nil;
|
||||
NSDictionary *_hints = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
_hints = [fetch _hints];
|
||||
|
||||
customQueryExpressionHint = [_hints objectForKey: @"EOCustomQueryExpressionHintKey"];//TODO use it
|
||||
|
||||
if (customQueryExpressionHint)
|
||||
{
|
||||
EOAdaptorContext *adaptorContext = nil;
|
||||
EOAdaptor *adaptor = nil;
|
||||
Class expressionClass = Nil;
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"customQueryExpressionHint=%@", customQueryExpressionHint);
|
||||
|
||||
adaptorContext = [_databaseContext adaptorContext];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"adaptorContext=%p", adaptorContext);
|
||||
|
||||
adaptor = [adaptorContext adaptor];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"adaptor=%p", adaptor);
|
||||
NSDebugMLLog(@"gsdb", @"adaptor=%@", adaptor);
|
||||
NSDebugMLLog(@"gsdb", @"adaptor class=%@", [adaptor class]);
|
||||
|
||||
//TODO VERIFY
|
||||
expressionClass = [adaptor expressionClass];
|
||||
NSDebugMLLog(@"gsdb", @"expressionClass=%@", expressionClass);
|
||||
|
||||
customQueryExpression = [expressionClass expressionForString:
|
||||
customQueryExpressionHint];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"customQueryExpression=%@", customQueryExpression);
|
||||
}
|
||||
|
||||
[self setCurrentEditingContext: context]; //OK even if customQueryExpressionHintKey
|
||||
[self _setCurrentEntityAndRelationshipWithFetchSpecification: fetch];
|
||||
|
||||
isDeep = [fetch isDeep]; //ret 1
|
||||
|
||||
if (!customQueryExpressionHint)
|
||||
{
|
||||
subEntities = [entity subEntities];
|
||||
NSDebugMLLog(@"gsdb", @"subEntities=%@", subEntities);
|
||||
|
||||
//Strange
|
||||
{
|
||||
NSMutableArray *array = nil;
|
||||
|
||||
array = [NSMutableArray arrayWithCapacity: 8];
|
||||
|
||||
if ([subEntities count] > 0 && isDeep)
|
||||
{
|
||||
//??
|
||||
NSEnumerator *subEntitiesEnum = [subEntities objectEnumerator];
|
||||
id subEntity = nil;
|
||||
|
||||
while ((subEntity = [subEntitiesEnum nextObject]))
|
||||
{
|
||||
EOFetchSpecification *fetchSubEntity;
|
||||
|
||||
fetchSubEntity = [[fetch copy] autorelease];
|
||||
[fetchSubEntity setEntityName: [entity name]];
|
||||
|
||||
[array addObjectsFromArray:
|
||||
[context objectsWithFetchSpecification:
|
||||
fetchSubEntity]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
propertiesToFetch = [self _propertiesToFetch];
|
||||
updateStrategy = [_databaseContext updateStrategy];//Ret 0
|
||||
fetchLocksObjects = [fetch locksObjects];
|
||||
refreshesRefetchedObjects = [fetch refreshesRefetchedObjects];
|
||||
entityName = [fetch entityName];
|
||||
database = [_databaseContext database];
|
||||
entity = [database entityNamed:entityName];
|
||||
primaryKeyAttributes = [entity primaryKeyAttributes];
|
||||
hints = [fetch hints]; // ret {}
|
||||
storedProcedureName = [hints objectForKey: @"EOStoredProcedureNameHintKey"];//TODO use it
|
||||
model = [entity model];
|
||||
modelGroup = [model modelGroup]; //ret nil
|
||||
//TODO if model gr
|
||||
qualifier = [fetch qualifier]; //<EOAndQualifier> //Can be nil
|
||||
|
||||
if (customQueryExpression)
|
||||
{
|
||||
[_adaptorChannel evaluateExpression: customQueryExpression];
|
||||
|
||||
NSAssert([propertiesToFetch count] > 0, @"No properties to fetch");
|
||||
|
||||
[_adaptorChannel setAttributesToFetch: propertiesToFetch];
|
||||
}
|
||||
else
|
||||
{
|
||||
storedProcedure = [entity storedProcedureForOperation:
|
||||
@"EOFetchWithPrimaryKeyProcedure"];
|
||||
|
||||
if (storedProcedure)
|
||||
{
|
||||
NSEmitTODO(); //TODO
|
||||
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
NSAssert([propertiesToFetch count] > 0, @"No properties to fetch");
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"%@ -- %@ 0x%x: isFetchInProgress=%s",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
([self isFetchInProgress] ? "YES" : "NO"));
|
||||
|
||||
[_adaptorChannel selectAttributes: propertiesToFetch
|
||||
fetchSpecification: fetch
|
||||
lock: fetchLocksObjects
|
||||
entity: entity];
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"%@ -- %@ 0x%x: isFetchInProgress=%s",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
([self isFetchInProgress] ? "YES" : "NO"));
|
||||
|
||||
//TODO: verify
|
||||
/*
|
||||
if([_databaseContext updateStrategy] == EOUpdateWithPessimisticLocking
|
||||
&& ![[_databaseContext adaptorContext] transactionNestingLevel])
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"%@ -- %@ 0x%x: no transaction in progress",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
if(_delegateRespondsTo.shouldSelectObjects)
|
||||
{
|
||||
if(![_delegate databaseContext:_databaseContext
|
||||
shouldSelectObjectsWithFetchSpecification:fetch
|
||||
databaseChannel:self])
|
||||
[NSException raise:EOGeneralDatabaseException
|
||||
format:@"%@ -- %@ 0x%x: delegate refuses to select objects",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
};
|
||||
|
||||
[_fetchSpecifications addObject:fetch];
|
||||
|
||||
[self setCurrentEntity:[[_databaseContext database]
|
||||
entityNamed:[fetch entityName]]];//done
|
||||
[self setCurrentEditingContext:context];//done
|
||||
|
||||
[self setIsLocking:([_databaseContext updateStrategy] ==
|
||||
EOUpdateWithPessimisticLocking ?
|
||||
YES :
|
||||
[fetch locksObjects])];
|
||||
[self setIsRefreshingObjects:[fetch refreshesRefetchedObjects]];
|
||||
|
||||
attributesToFetch = [_currentEntity attributesToFetch];//done
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"[_adaptorChannel class]: %@",[_adaptorChannel class]);
|
||||
[_adaptorChannel selectAttributes:attributesToFetch
|
||||
fetchSpecification:fetch
|
||||
lock:_isLocking
|
||||
entity:_currentEntity];//done
|
||||
|
||||
[_fetchProperties addObjectsFromArray:attributesToFetch];
|
||||
|
||||
if(_delegateRespondsTo.didSelectObjects)
|
||||
[_delegate databaseContext:_databaseContext
|
||||
didSelectObjectsWithFetchSpecification:fetch
|
||||
databaseChannel:self];
|
||||
*/
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
@end /* EODatabaseChannel */
|
48
EOAccess/EODatabaseChannelPriv.h
Normal file
48
EOAccess/EODatabaseChannelPriv.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
EODatabaseChannelPriv.h
|
||||
|
||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: Mars 2002
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseChannelPriv_h__
|
||||
#define __EODatabaseChannelPriv_h__
|
||||
|
||||
@class NSArray;
|
||||
@class EOFetchSpecification;
|
||||
@class EOEditingContext;
|
||||
|
||||
|
||||
@interface EODatabaseChannel (EODatabaseChannelPrivate)
|
||||
- (NSArray*) _propertiesToFetch;
|
||||
- (void)_setCurrentEntityAndRelationshipWithFetchSpecification: (EOFetchSpecification *)fetch;
|
||||
-(void)_selectWithFetchSpecification: (EOFetchSpecification *)fetch
|
||||
editingContext: (EOEditingContext *)context;
|
||||
- (void) _buildNodeList: (id)param0
|
||||
withParent: (id)param1;
|
||||
- (id) currentEditingContext;
|
||||
- (void) _cancelInternalFetch;
|
||||
- (void) _closeChannel;
|
||||
- (void) _openChannel;
|
||||
@end
|
||||
|
||||
#endif /* __EODatabaseChannelPriv_h__ */
|
432
EOAccess/EODatabaseContext.h
Normal file
432
EOAccess/EODatabaseContext.h
Normal file
|
@ -0,0 +1,432 @@
|
|||
/*
|
||||
EODatabaseContext.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseContext_h__
|
||||
#define __EODatabaseContext_h__
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
|
||||
@class EOAdaptorContext;
|
||||
@class EOAdaptorChannel;
|
||||
@class EOAdaptorOperation;
|
||||
@class EOEntity;
|
||||
@class EOModel;
|
||||
@class EORelationship;
|
||||
@class EOAttribute;
|
||||
|
||||
@class EODatabase;
|
||||
@class EODatabaseChannel;
|
||||
@class EODatabaseOperation;
|
||||
|
||||
|
||||
typedef enum {
|
||||
EOUpdateWithOptimisticLocking,
|
||||
EOUpdateWithPessimisticLocking,
|
||||
EOUpdateWithNoLocking
|
||||
} EOUpdateStrategy;
|
||||
|
||||
struct _EOTransactionScope;
|
||||
|
||||
@interface EODatabaseContext : EOCooperatingObjectStore
|
||||
{
|
||||
EODatabase *_database;
|
||||
EOAdaptorContext *_adaptorContext;
|
||||
EOUpdateStrategy _updateStrategy;
|
||||
/*TOADD
|
||||
NSMutableArray *_uniqueStack;
|
||||
NSMutableArray *_deleteStack;
|
||||
NSMutableArray *_modifiedObjects;
|
||||
*/
|
||||
NSMutableArray *_registeredChannels;
|
||||
NSMapTable *_dbOperationsByGlobalID;
|
||||
EOObjectStoreCoordinator *_coordinator; // not retained
|
||||
EOEditingContext *_editingContext; // not retained
|
||||
id *_lockedObjects;//void*
|
||||
/*TO ADD unsigned int _currentGeneration;
|
||||
unsigned int _concurentFetches;
|
||||
*/
|
||||
|
||||
unsigned int _numLocked;//TO REMOVE
|
||||
NSMutableDictionary *_batchFaultBuffer;
|
||||
NSMutableDictionary *_batchToManyFaultBuffer;
|
||||
|
||||
// NSMutableDictionary *_snapshots;
|
||||
// NSMutableDictionary *_toManySnapshots;
|
||||
|
||||
EOEntity* _lastEntity;
|
||||
/*TOADD
|
||||
EOGlobalID *_currentGlobalID;
|
||||
NSDictionary *_currentSnapshot;
|
||||
objc_object *_currentBatch;
|
||||
*/
|
||||
NSMutableArray *_uniqueStack;// snaps
|
||||
NSMutableArray *_uniqueArrayStack;//to many snaps
|
||||
NSMutableArray *_deleteStack;
|
||||
|
||||
NSHashTable *_nonPrimaryKeyGenerators;
|
||||
|
||||
struct {
|
||||
unsigned int preparingForSave:1;
|
||||
unsigned int beganTransaction:1;
|
||||
unsigned int ignoreEntityCaching:1;
|
||||
unsigned int _reserved:29;
|
||||
} _flags;
|
||||
id _delegate; // not retained
|
||||
struct {
|
||||
unsigned int willRunLoginPanelToOpenDatabaseChannel:1;
|
||||
unsigned int newPrimaryKey:1;
|
||||
unsigned int willPerformAdaptorOperations:1;
|
||||
unsigned int shouldInvalidateObject:1;
|
||||
unsigned int willOrderAdaptorOperations:1;
|
||||
unsigned int shouldLockObject:1;
|
||||
unsigned int shouldRaiseForLockFailure:1;
|
||||
unsigned int shouldFetchObjects:1;
|
||||
unsigned int didFetchObjects:1;
|
||||
unsigned int shouldFetchObjectFault:1;
|
||||
unsigned int shouldFetchArrayFault:1;
|
||||
unsigned int _reserved:21;
|
||||
} _delegateRespondsTo;
|
||||
|
||||
NSRecursiveLock *_lock; //TODO: not lock object !
|
||||
}
|
||||
|
||||
+ (EODatabaseContext *)databaseContextWithDatabase: (EODatabase *)database;
|
||||
|
||||
- initWithDatabase: (EODatabase *)database;
|
||||
|
||||
+ (EODatabaseContext *)registeredDatabaseContextForModel: (EOModel *)model
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
+ (Class)contextClassToRegister;
|
||||
+ (void)setContextClassToRegister: (Class)contextClass;
|
||||
|
||||
- (BOOL)hasBusyChannels;
|
||||
|
||||
- (NSArray *)registeredChannels;
|
||||
|
||||
- (void)registerChannel: (EODatabaseChannel *)channel;
|
||||
- (void)unregisterChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (EODatabaseChannel *)_availableChannelFromRegisteredChannels;
|
||||
- (EODatabaseChannel *)availableChannel;
|
||||
|
||||
- (EODatabase *)database;
|
||||
|
||||
- (EOObjectStoreCoordinator *)coordinator;
|
||||
|
||||
- (EOAdaptorContext *)adaptorContext;
|
||||
|
||||
- (void)setUpdateStrategy: (EOUpdateStrategy)strategy;
|
||||
- (EOUpdateStrategy)updateStrategy;
|
||||
|
||||
- (id)delegate;
|
||||
- (void)setDelegate: (id)delegate;
|
||||
- (void)handleDroppedConnection;
|
||||
@end /* EODatabaseContext */
|
||||
|
||||
|
||||
@interface EODatabaseContext(EOObjectStoreSupport)
|
||||
|
||||
- (id)faultForRawRow: (NSDictionary *)row
|
||||
entityNamed: (NSString *)entityName
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (id)faultForGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)arrayFaultWithSourceGlobalID: (EOGlobalID *)globalID
|
||||
relationshipName: (NSString *)name
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)initializeObject: (id)object
|
||||
withGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)objectsForSourceGlobalID: (EOGlobalID *)globalID
|
||||
relationshipName: (NSString *)name
|
||||
editingContext: (EOEditingContext *)context;
|
||||
- (void)_registerSnapshot: (NSArray*)snapshot
|
||||
forSourceGlobalID: (EOGlobalID*)globalID
|
||||
relationshipName: (NSString*)name
|
||||
editingContext: (EOEditingContext*)context;
|
||||
|
||||
- (void)refaultObject: object
|
||||
withGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)saveChangesInEditingContext: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
editingContext:(EOEditingContext *)context;
|
||||
|
||||
- (BOOL)isObjectLockedWithGlobalID: (EOGlobalID *)gid
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)lockObjectWithGlobalID: (EOGlobalID *)gid
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)invalidateAllObjects;
|
||||
- (void)invalidateObjectsWithGlobalIDs: (NSArray *)globalIDs;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EODatabaseContext(EOCooperatingObjectStoreSupport)
|
||||
|
||||
- (BOOL)ownsGlobalID:(EOGlobalID *)globalID;
|
||||
|
||||
- (BOOL)ownsObject: (id)object;
|
||||
|
||||
- (BOOL)ownsEntityNamed: (NSString *)entityName;
|
||||
|
||||
- (BOOL)handlesFetchSpecification: (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- (void)prepareForSaveWithCoordinator: (EOObjectStoreCoordinator *)coordinator
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
/** The method overrides the inherited implementation to create a list of EODatabaseOperations for EOEditingContext objects changes (only objects owned by the receiver).
|
||||
It forwards any relationship changes found which are not owned by the receiver to the EOObjectStoreCoordinator.
|
||||
It's invoked during EOObjectStoreCoordinator saving changes (saveChangesInEditingContext:) method.
|
||||
It's invoked after prepareForSaveWithCoordinator:editingContext: and before ownsGlobalID:.
|
||||
**/
|
||||
- (void)recordChangesInEditingContext;
|
||||
|
||||
- (void)recordUpdateForObject: object
|
||||
changes: (NSDictionary *)changes;
|
||||
|
||||
- (void)performChanges;
|
||||
|
||||
- (void)commitChanges;
|
||||
|
||||
- (void)rollbackChanges;
|
||||
|
||||
- (NSDictionary *)valuesForKeys: (NSArray *)keys object: object;
|
||||
|
||||
-(void)relayPrimaryKey: (NSDictionary*)pk
|
||||
object: (id)object
|
||||
entity: (EOEntity*)entity;
|
||||
|
||||
-(void)nullifyAttributesInRelationship: (EORelationship*)relationship
|
||||
sourceObject: (id)sourceObject
|
||||
destinationObjects: (NSArray*)destinationObjects;
|
||||
-(void)nullifyAttributesInRelationship: (EORelationship*)relationship
|
||||
sourceObject: (id)sourceObject
|
||||
destinationObject: (id)destinationObject;
|
||||
-(void)relayAttributesInRelationship: (EORelationship*)relationship
|
||||
sourceObject: (id)sourceObject
|
||||
destinationObjects: (NSArray*)destinationObjects;
|
||||
-(NSDictionary*)relayAttributesInRelationship: (EORelationship*)relationship
|
||||
sourceObject: (id)sourceObject
|
||||
destinationObject: (id)destinationObject;
|
||||
|
||||
- (id) databaseOperationForObject: (id)param0;
|
||||
- (id) databaseOperationForGlobalID: (id)param0;
|
||||
- (void) recordDatabaseOperation: (id)param0;
|
||||
- (void) recordDeleteForObject: (id)param0;
|
||||
- (void) recordInsertForObject: (id)param0;
|
||||
|
||||
- (void) createAdaptorOperationsForDatabaseOperation: (EODatabaseOperation*)dbOpe
|
||||
attributes: (NSArray*)attributes;
|
||||
- (void) createAdaptorOperationsForDatabaseOperation: (EODatabaseOperation*)dbOpe;
|
||||
- (NSArray*) orderAdaptorOperations;
|
||||
|
||||
- (id) entitiesOnWhichThisEntityDepends: (EOEntity *)entity;
|
||||
-(NSArray*)entityNameOrderingArrayForEntities: (NSArray *)entities;
|
||||
|
||||
- (BOOL) isValidQualifierTypeForAttribute: (EOAttribute*)attribute;
|
||||
- (id) lockingNonQualifiableAttributes: (NSArray*)attributes;
|
||||
- (NSArray*) lockingAttributesForAttributes: (NSArray*)attributes
|
||||
entity: (EOEntity*)enity;
|
||||
- (NSArray*) primaryKeyAttributesForAttributes: (NSArray*)attributes
|
||||
entity: (EOEntity*)entity;
|
||||
- (EOQualifier*) qualifierForLockingAttributes: (NSArray*)attributes
|
||||
primaryKeyAttributes: (NSArray*)primaryKeyAttributes
|
||||
entity: (EOEntity*)entity
|
||||
snapshot: (NSDictionary*)snapshot;
|
||||
- (void) insertEntity: (EOEntity*)entity
|
||||
intoOrderingArray: (NSMutableArray*)orderingArray
|
||||
withDependencies: (NSDictionary*)dependencies
|
||||
processingSet: (NSMutableSet*)processingSet;
|
||||
- (void) processSnapshotForDatabaseOperation: (EODatabaseOperation*)dbOpe;
|
||||
|
||||
- (NSDictionary*) valuesToWriteForAttributes: (NSArray*)attributes
|
||||
entity: (EOEntity*)entity
|
||||
changedValues: (NSDictionary*)changedValues;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EODatabaseContext(EOBatchFaulting)
|
||||
|
||||
- (void)batchFetchRelationship: (EORelationship *)relationship
|
||||
forSourceObjects: (NSArray *)objects
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EODatabaseContext (EODatabaseSnapshotting)
|
||||
|
||||
- (void)recordSnapshot: (NSDictionary *)snapshot
|
||||
forGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
|
||||
/** Returns snapshot for globalID. (nil if there's no snapshot for the globalID or if the corresponding
|
||||
tsimestamp is less than ti).
|
||||
Searches first locally (in the transaction scope) and after in the EODatabase. **/
|
||||
|
||||
- (NSDictionary *)snapshotForGlobalID: (EOGlobalID *)gid
|
||||
after: (NSTimeInterval)ti;
|
||||
|
||||
/** Returns snapshot for globalID by calling snapshotForGlobalID:after: with EODistantPastTimeInterval
|
||||
as time interval.
|
||||
Searches first locally (in the transaction scope) and after in the EODatabase. **/
|
||||
- (NSDictionary *)snapshotForGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
- (void)recordSnapshot: (NSArray *)gids
|
||||
forSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName: (NSString *)name;
|
||||
|
||||
- (NSArray *)snapshotForSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName: (NSString *)name;
|
||||
|
||||
/** Returns the snapshot for the globalID (nil if there's none).
|
||||
Only searches locally (in the transaction scope), not in the EODatabase. **/
|
||||
|
||||
- (NSDictionary *)localSnapshotForGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
- (NSArray *)localSnapshotForSourceGlobalID: (EOGlobalID *)gid
|
||||
relationshipName:(NSString *)name;
|
||||
|
||||
- (void)forgetSnapshotForGlobalID: (EOGlobalID *)gid;
|
||||
- (void)forgetSnapshotsForGlobalIDs: (NSArray *)gids;
|
||||
|
||||
- (void)recordSnapshots: (NSDictionary *)snapshots;
|
||||
|
||||
- (void)recordToManySnapshots: (NSDictionary *)snapshots;
|
||||
|
||||
- (void)registerLockedObjectWithGlobalID: (EOGlobalID *)globalID;
|
||||
- (BOOL)isObjectLockedWithGlobalID: (EOGlobalID *)globalID;
|
||||
- (void)forgetAllLocks;
|
||||
- (void)forgetLocksForObjectsWithGlobalIDs: (NSArray *)gids;
|
||||
- (void) _rollbackTransaction;
|
||||
- (void) _commitTransaction;
|
||||
- (void) _beginTransaction;
|
||||
- (EODatabaseChannel*) _obtainOpenChannel;
|
||||
- (BOOL) _openChannelWithLoginPanel:(id)param0;
|
||||
- (void) _forceDisconnect;
|
||||
- (void)initializeObject:(id)object
|
||||
row:(NSDictionary*)row
|
||||
entity:(EOEntity*)entity
|
||||
editingContext:(EOEditingContext*)context;
|
||||
|
||||
@end
|
||||
|
||||
@interface EODatabaseContext(EOMultiThreaded) <NSLocking>
|
||||
|
||||
- (void)lock;
|
||||
- (void)unlock;
|
||||
|
||||
@end
|
||||
|
||||
// Notifications:
|
||||
extern NSString *EODatabaseChannelNeededNotification;
|
||||
|
||||
|
||||
@interface NSObject (EODatabaseContextDelegation)
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)context
|
||||
willRunLoginPanelToOpenDatabaseChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (NSDictionary *)databaseContext: (EODatabaseContext *)context
|
||||
newPrimaryKeyForObject: (id)object
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)context
|
||||
failedToFetchObject: (id)object
|
||||
globalID: (EOGlobalID *)gid;
|
||||
|
||||
- (NSArray *)databaseContext: (EODatabaseContext *)context
|
||||
willOrderAdaptorOperationsFromDatabaseOperations: (NSArray *)databaseOps;
|
||||
|
||||
- (NSArray *)databaseContext: (EODatabaseContext *)context
|
||||
willPerformAdaptorOperations: (NSArray *)adaptorOps
|
||||
adaptorChannel: (EOAdaptorChannel *)adaptorChannel;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)context
|
||||
shouldInvalidateObjectWithGlobalID: (EOGlobalID *)globalId
|
||||
snapshot: (NSDictionary *)snapshot;
|
||||
|
||||
- (NSArray *)databaseContext: (EODatabaseContext *)context
|
||||
shouldFetchObjectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)databaseContext: (EODatabaseContext *)context
|
||||
didFetchObjects: (NSArray *)objects
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)context
|
||||
shouldSelectObjectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
databaseChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)context
|
||||
shouldUsePessimisticLockWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
databaseChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (void)databaseContext: (EODatabaseContext *)context
|
||||
didSelectObjectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
databaseChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (NSDictionary *)databaseContext: (EODatabaseContext *)context
|
||||
shouldUpdateCurrentSnapshot: (NSDictionary *)currentSnapshot
|
||||
newSnapshot: (NSDictionary *)newSnapshot
|
||||
globalID: (EOGlobalID *)globalID
|
||||
databaseChannel: (EODatabaseChannel *)channel;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)databaseContext
|
||||
shouldLockObjectWithGlobalID: (EOGlobalID *)globalID
|
||||
snapshot: (NSDictionary *)snapshot;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)databaseContext
|
||||
shouldRaiseExceptionForLockFailure: (NSException *)exception;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)databaseContext
|
||||
shouldFetchObjectFault: (id)fault;
|
||||
|
||||
- (BOOL)databaseContext: (EODatabaseContext *)databaseContext
|
||||
shouldFetchArrayFault: (id)fault;
|
||||
|
||||
@end
|
||||
|
||||
extern NSString *EOCustomQueryExpressionHintKey;
|
||||
|
||||
extern NSString *EODatabaseContextKey;
|
||||
extern NSString *EODatabaseOperationsKey;
|
||||
extern NSString *EOFailedDatabaseOperationKey;
|
||||
|
||||
#endif /* __EODatabaseContext_h__ */
|
6670
EOAccess/EODatabaseContext.m
Normal file
6670
EOAccess/EODatabaseContext.m
Normal file
File diff suppressed because it is too large
Load diff
70
EOAccess/EODatabaseContextPriv.h
Normal file
70
EOAccess/EODatabaseContextPriv.h
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
EODatabaseContextPriv.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseContextPriv_h__
|
||||
#define __EODatabaseContextPriv_h__
|
||||
|
||||
@class EOAccessFaultHandler;
|
||||
@class EOAccessArrayFaultHandler;
|
||||
|
||||
|
||||
@interface EODatabaseContext (EODatabaseContextPrivate)
|
||||
|
||||
- (void) _fireArrayFault: (id)object;
|
||||
- (void) _fireFault: (id)object;
|
||||
- (void) _addBatchForGlobalID: (EOKeyGlobalID *)globalID
|
||||
fault: (EOFault *)fault;
|
||||
- (void) _removeBatchForGlobalID: (EOKeyGlobalID *)globalID
|
||||
fault: (EOFault *)fault;
|
||||
- (void) _addToManyBatchForSourceGlobalID: (EOKeyGlobalID *)globalID
|
||||
relationshipName: (NSString *)relationshipName
|
||||
fault: (EOFault *)fault;
|
||||
|
||||
/*- (void)_batchToOne: (id)fault
|
||||
withHandler: (EOAccessFaultHandler *)handler;
|
||||
- (void)_batchToMany: (id)fault
|
||||
withHandler: (EOAccessArrayFaultHandler *)handler;*/
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EODatabaseContext (EODatabaseContextPrivate2)
|
||||
|
||||
- (void) _verifyNoChangesToReadonlyEntity: (EODatabaseOperation*)dbOpe;
|
||||
- (EOGlobalID*) _globalIDForObject: (id)object;
|
||||
- (id) _primaryKeyForObject: (id)object;
|
||||
- (id) _currentCommittedSnapshotForObject: (id)object;
|
||||
- (id) _addDatabaseContextStateToException: (id)param0;
|
||||
- (id) _databaseContextState;
|
||||
- (void) _cleanUpAfterSave;
|
||||
- (void) _assertValidStateWithSelector: (SEL)sel;
|
||||
- (BOOL) _shouldGeneratePrimaryKeyForEntityName: (NSString*)entityName;
|
||||
- (void) _buildPrimaryKeyGeneratorListForEditingContext: (EOEditingContext*)context;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#endif /* __EODatabaseContextPriv_h__ */
|
67
EOAccess/EODatabaseDataSource.h
Normal file
67
EOAccess/EODatabaseDataSource.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
EODatabaseDataSource.m
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
@class EOEntity;
|
||||
@class EODatabaseContext;
|
||||
|
||||
|
||||
@interface EODatabaseDataSource : EODataSource <NSCoding>
|
||||
{
|
||||
EOEditingContext *_editingContext;
|
||||
EOFetchSpecification *_fetchSpecification;
|
||||
EOQualifier *_auxiliaryQualifier;
|
||||
NSDictionary *_bindings;
|
||||
|
||||
struct {
|
||||
unsigned int fetchEnabled:1;
|
||||
unsigned int _reserved:31;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
- initWithEditingContext: (EOEditingContext *)anEditingContext
|
||||
entityName: (NSString *)anEntityName;
|
||||
- initWithEditingContext: (EOEditingContext *)editingContext
|
||||
entityName: (NSString *)entityName
|
||||
fetchSpecificationName: (NSString *)fetchName;
|
||||
|
||||
- (EOEntity *)entity;
|
||||
|
||||
- (EODatabaseContext *)databaseContext;
|
||||
|
||||
- (void)setFetchSpecification: (EOFetchSpecification *)fetchSpecification;
|
||||
- (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- (void)setAuxiliaryQualifier: (EOQualifier *)newQualifier;
|
||||
- (EOQualifier *)auxiliaryQualifier;
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationForFetch;
|
||||
|
||||
- (void)setFetchEnabled: (BOOL)yn;
|
||||
- (BOOL)isFetchEnabled;
|
||||
|
||||
@end
|
418
EOAccess/EODatabaseDataSource.m
Normal file
418
EOAccess/EODatabaseDataSource.m
Normal file
|
@ -0,0 +1,418 @@
|
|||
/**
|
||||
EODatabaseDataSource.m <title>EODatabaseDataSource Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: December 2001
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EODatabaseDataSource.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOModelGroup.h>
|
||||
#import <EOAccess/EODatabase.h>
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
|
||||
@implementation EODatabaseDataSource
|
||||
|
||||
- initWithEditingContext: (EOEditingContext *)editingContext
|
||||
entityName: (NSString *)entityName
|
||||
{
|
||||
return [self initWithEditingContext: editingContext
|
||||
entityName: entityName
|
||||
fetchSpecificationName: nil];
|
||||
}
|
||||
|
||||
- initWithEditingContext: (EOEditingContext *)editingContext
|
||||
entityName: (NSString *)entityName
|
||||
fetchSpecificationName: (NSString *)fetchName
|
||||
{
|
||||
NSArray *stores;
|
||||
EODatabaseContext *store = nil;
|
||||
NSEnumerator *storeEnum;
|
||||
EOModel *model;
|
||||
EOEntity *entity = nil;
|
||||
id rootStore;
|
||||
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_editingContext, editingContext);
|
||||
rootStore = [_editingContext rootObjectStore];
|
||||
|
||||
if ([rootStore isKindOfClass: [EOObjectStoreCoordinator class]] == YES)
|
||||
{
|
||||
stores = [rootStore cooperatingObjectStores];
|
||||
|
||||
storeEnum = [stores objectEnumerator];
|
||||
while ((store = [storeEnum nextObject]))
|
||||
{
|
||||
if ([store isKindOfClass: [EODatabaseContext class]] == YES)
|
||||
{
|
||||
if ((entity = [[store database] entityNamed: entityName]))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (store == nil)
|
||||
{
|
||||
entity = [[EOModelGroup defaultGroup] entityNamed: entityName];
|
||||
model = [entity model];
|
||||
|
||||
store = [EODatabaseContext databaseContextWithDatabase:
|
||||
[EODatabase databaseWithModel:
|
||||
model]];
|
||||
|
||||
[rootStore addCooperatingObjectStore: store];
|
||||
}
|
||||
}
|
||||
else if ([rootStore isKindOfClass: [EODatabaseContext class]] == YES)
|
||||
{
|
||||
if ((entity = [[store database] entityNamed: entityName]) == nil)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: editingContext (%@) cannot handler entity named '%@'",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
editingContext,
|
||||
entityName];
|
||||
}
|
||||
else
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: editingContext (%@) cannot handler entity named '%@'",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
editingContext,
|
||||
entityName];
|
||||
|
||||
ASSIGN(_fetchSpecification, [entity fetchSpecificationNamed:fetchName]);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_bindings);
|
||||
DESTROY(_auxiliaryQualifier);
|
||||
DESTROY(_fetchSpecification);
|
||||
DESTROY(_editingContext);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [NSString stringWithFormat:
|
||||
@"<%s %p : entity name=%@ editingContext=%p fetchSpecification=%@>",
|
||||
object_get_class_name(self),
|
||||
(void *)self,
|
||||
[[self entity]name],
|
||||
_editingContext,
|
||||
_fetchSpecification];
|
||||
}
|
||||
|
||||
- (EOEntity *)entity
|
||||
{
|
||||
return [[[self databaseContext] database]
|
||||
entityNamed: [_fetchSpecification entityName]];
|
||||
}
|
||||
|
||||
- (EODatabaseContext *)databaseContext
|
||||
{
|
||||
NSArray *stores = nil;
|
||||
EODatabaseContext *store = nil;
|
||||
NSEnumerator *storeEnum = nil;
|
||||
NSString *entityName = nil;
|
||||
id rootStore = nil;
|
||||
|
||||
entityName = [_fetchSpecification entityName];
|
||||
|
||||
rootStore = [_editingContext rootObjectStore];
|
||||
if ([rootStore isKindOfClass: [EOObjectStoreCoordinator class]] == YES)
|
||||
{
|
||||
stores = [rootStore cooperatingObjectStores];
|
||||
|
||||
storeEnum = [stores objectEnumerator];
|
||||
while ((store = [storeEnum nextObject]))
|
||||
{
|
||||
if ([store isKindOfClass: [EODatabaseContext class]] == YES)
|
||||
{
|
||||
if ([[store database] entityNamed: entityName])
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ([rootStore isKindOfClass: [EODatabaseContext class]] == YES)
|
||||
{
|
||||
if ([[store database] entityNamed: entityName])
|
||||
store = rootStore;
|
||||
}
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
- (void)setFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
{
|
||||
ASSIGN(_fetchSpecification, fetchSpecification);
|
||||
}
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecification
|
||||
{
|
||||
return _fetchSpecification;
|
||||
}
|
||||
|
||||
- (void)setAuxiliaryQualifier: (EOQualifier *)qualifier
|
||||
{
|
||||
ASSIGN(_auxiliaryQualifier, qualifier);//OK
|
||||
}
|
||||
|
||||
- (EOQualifier *)auxiliaryQualifier
|
||||
{
|
||||
return _auxiliaryQualifier;
|
||||
}
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationForFetch
|
||||
{
|
||||
EOFetchSpecification *fetch = nil;
|
||||
EOQualifier *qualifier = nil;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"_auxiliaryQualifier=%@",
|
||||
_auxiliaryQualifier);
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"_bindings=%@", _bindings);
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"_fetchSpecification=%@",
|
||||
_fetchSpecification);
|
||||
|
||||
qualifier = [_auxiliaryQualifier
|
||||
qualifierWithBindings: _bindings
|
||||
requiresAllVariables: [_fetchSpecification
|
||||
requiresAllQualifierBindingVariables]]; //ret same ?
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"qualifier=%@", qualifier);
|
||||
|
||||
//call _fetchSpecification qualifier //ret nil //TODO
|
||||
fetch = [[_fetchSpecification copy] autorelease];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"fetch=%@", fetch);
|
||||
|
||||
[fetch setQualifier:qualifier];
|
||||
/*
|
||||
fetch = [_fetchSpecification copy];
|
||||
[fetch setQualifier:[[[EOAndQualifier alloc]
|
||||
initWithQualifiers:[fetch qualifier],
|
||||
_auxiliaryQualifier, nil] autorelease]];
|
||||
*/
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"fetch=%@", fetch);
|
||||
|
||||
return fetch;
|
||||
}
|
||||
|
||||
- (void)setFetchEnabled: (BOOL)flag
|
||||
{
|
||||
_flags.fetchEnabled = flag;
|
||||
}
|
||||
|
||||
- (BOOL)isFetchEnabled
|
||||
{
|
||||
return _flags.fetchEnabled;
|
||||
}
|
||||
|
||||
- (EODataSource *)dataSourceQualifiedByKey: (NSString *)detailKey
|
||||
{
|
||||
return [EODetailDataSource detailDataSourceWithMasterDataSource: self
|
||||
detailKey: detailKey];
|
||||
}
|
||||
|
||||
- (void)insertObject: object
|
||||
{
|
||||
[_editingContext insertObject: object];
|
||||
}
|
||||
|
||||
- (void)deleteObject: object
|
||||
{
|
||||
[_editingContext deleteObject: object];
|
||||
}
|
||||
|
||||
- (NSArray *)fetchObjects
|
||||
{
|
||||
NSArray *objects = nil;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"_editingContext=%@",
|
||||
_editingContext);
|
||||
NSAssert(_editingContext, @"No Editing Context");
|
||||
|
||||
//call [self isFetchEnabled];
|
||||
NS_DURING//For trace purpose
|
||||
{
|
||||
objects = [_editingContext objectsWithFetchSpecification:
|
||||
[self fetchSpecificationForFetch]];//OK
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSLog(@"%@ (%@)", localException, [localException reason]);
|
||||
NSDebugMLog(@"%@ (%@)", localException, [localException reason]);
|
||||
[localException raise];
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"objects=%p", objects);
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"objects count=%d", [objects count]);
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"objects=%@", objects);
|
||||
|
||||
return objects;
|
||||
}
|
||||
|
||||
- (EOClassDescription *)classDescriptionForObjects
|
||||
{
|
||||
return [[self entity] classDescriptionForInstances];
|
||||
}
|
||||
|
||||
- (NSArray *)qualifierBindingKeys
|
||||
{
|
||||
return [_bindings allKeys]; // TODO resolve all bindings question
|
||||
}
|
||||
|
||||
- (void)setQualifierBindings: (NSDictionary *)bindings
|
||||
{
|
||||
ASSIGN(_bindings, bindings);
|
||||
}
|
||||
|
||||
- (NSDictionary *)qualifierBindings
|
||||
{
|
||||
return _bindings;
|
||||
}
|
||||
|
||||
- (id)initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
ASSIGN(_editingContext, [coder decodeObject]);
|
||||
ASSIGN(_fetchSpecification, [coder decodeObject]);
|
||||
ASSIGN(_auxiliaryQualifier, [coder decodeObject]);
|
||||
ASSIGN(_bindings, [coder decodeObject]);
|
||||
|
||||
// TODO flags
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
[coder encodeObject:_editingContext];
|
||||
[coder encodeObject:_fetchSpecification];
|
||||
[coder encodeObject:_auxiliaryQualifier];
|
||||
[coder encodeObject:_bindings];
|
||||
|
||||
// TODO flags
|
||||
}
|
||||
|
||||
- (id) initWithKeyValueUnarchiver: (EOKeyValueUnarchiver *)unarchiver
|
||||
{
|
||||
NSString *entityName = nil;
|
||||
EOFetchSpecification *fetchSpecification = nil;
|
||||
EOQualifier *auxiliaryQualifier = nil;
|
||||
EOEditingContext *editingContext = nil;
|
||||
NSString *fetchSpecificationName = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
entityName = [unarchiver decodeObjectForKey: @"entityName"];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource",@"entityName=%@",entityName);
|
||||
|
||||
fetchSpecification = [unarchiver decodeObjectForKey: @"fetchSpecification"];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"fetchSpecification=%@",
|
||||
fetchSpecification);
|
||||
|
||||
auxiliaryQualifier = [unarchiver decodeObjectForKey: @"auxiliaryQualifier"];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"auxiliaryQualifier=%@",
|
||||
auxiliaryQualifier);
|
||||
|
||||
editingContext = [unarchiver decodeObjectReferenceForKey: @"editingContext"];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"editingContext=%@", editingContext);
|
||||
|
||||
fetchSpecificationName = [unarchiver decodeObjectForKey:
|
||||
@"fetchSpecificationName"];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"fetchSpecificationName=%@",
|
||||
fetchSpecificationName);
|
||||
|
||||
if (!entityName)
|
||||
{
|
||||
entityName = [fetchSpecification entityName];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"entityName=%@", entityName);
|
||||
}
|
||||
|
||||
if ((self = [self _partialInitWithEditingContext: editingContext
|
||||
entityName: entityName
|
||||
fetchSpecificationName: fetchSpecificationName]))
|
||||
{
|
||||
[self setFetchSpecification: fetchSpecification];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) encodeWithKeyValueArchiver: (EOKeyValueUnarchiver *)archiver
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (id)_partialInitWithEditingContext: (EOEditingContext*)editingContext
|
||||
entityName: (NSString*)entityName
|
||||
fetchSpecificationName: (NSString*)fetchSpecificationName
|
||||
{
|
||||
if ((self = [self initWithEditingContext: editingContext
|
||||
entityName: entityName
|
||||
fetchSpecificationName: nil]))
|
||||
{
|
||||
//turbocat ASSIGN(_editingContext,editingContext);
|
||||
ASSIGN(_fetchSpecification, [EOFetchSpecification new]);
|
||||
[_fetchSpecification setEntityName: entityName];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (EOEditingContext*)editingContext
|
||||
{
|
||||
return _editingContext;
|
||||
}
|
||||
|
||||
@end
|
180
EOAccess/EODatabaseOperation.h
Normal file
180
EOAccess/EODatabaseOperation.h
Normal file
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
EODatabaseOperation.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseOperation_h__
|
||||
#define __EODatabaseOperation_h__
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
|
||||
@class EOStoredProcedure;
|
||||
@class EOEntity;
|
||||
|
||||
|
||||
typedef enum {
|
||||
EOAdaptorUndefinedOperator = 0,
|
||||
EOAdaptorLockOperator,
|
||||
EOAdaptorInsertOperator,
|
||||
EOAdaptorUpdateOperator,
|
||||
EOAdaptorDeleteOperator,
|
||||
EOAdaptorStoredProcedureOperator
|
||||
} EOAdaptorOperator;
|
||||
|
||||
/**
|
||||
EOAdaptorOperation represent an adaptor 'elementaty' operation.
|
||||
Instance objects are created by EODatabaseOperation
|
||||
**/
|
||||
@interface EOAdaptorOperation : NSObject
|
||||
{
|
||||
EOAdaptorOperator _adaptorOperator; /** Database Adaptor **/
|
||||
EOEntity *_entity; /** Main concerned entity **/
|
||||
EOQualifier *_qualifier; /** qualifier **/
|
||||
NSDictionary *_changedValues; /** dictionary of changed fields/values **/
|
||||
NSArray *_attributes;
|
||||
EOStoredProcedure *_storedProcedure; /** Stored Procedure **/
|
||||
NSException *_exception;
|
||||
}
|
||||
|
||||
+ (EOAdaptorOperation *)adaptorOperationWithEntity: (EOEntity *)entity;
|
||||
|
||||
/** Init the instance with the main concerned entity **/
|
||||
- (id) initWithEntity: (EOEntity *)entity;
|
||||
|
||||
/** returns adaptor operator **/
|
||||
- (EOAdaptorOperator)adaptorOperator;
|
||||
|
||||
/** set adaptor operator **/
|
||||
- (void)setAdaptorOperator: (EOAdaptorOperator)adaptorOperator;
|
||||
|
||||
/** returns entity **/
|
||||
- (EOEntity *)entity;
|
||||
|
||||
/** returns qualifier **/
|
||||
- (EOQualifier *)qualifier;
|
||||
|
||||
/** set Qualifier **/
|
||||
- (void)setQualifier: (EOQualifier *)qualifier;
|
||||
|
||||
/** returns dictionary of changed values **/
|
||||
- (NSDictionary *)changedValues;
|
||||
|
||||
/** set dictionary of changed values **/
|
||||
- (void)setChangedValues: (NSDictionary *)changedValues;
|
||||
|
||||
|
||||
- (NSArray *)attributes;
|
||||
- (void)setAttributes: (NSArray *)attributes;
|
||||
|
||||
- (EOStoredProcedure *)storedProcedure;
|
||||
- (void)setStoredProcedure: (EOStoredProcedure *)storedProcedure;
|
||||
|
||||
- (NSException *)exception;
|
||||
- (void)setException: (NSException *)exception;
|
||||
|
||||
/** compare 2 adaptor operations **/
|
||||
- (NSComparisonResult)compareAdaptorOperation: (EOAdaptorOperation *)adaptorOp;
|
||||
|
||||
@end
|
||||
|
||||
typedef enum {
|
||||
EODatabaseNothingOperator = 0,
|
||||
EODatabaseInsertOperator,
|
||||
EODatabaseUpdateOperator,
|
||||
EODatabaseDeleteOperator
|
||||
} EODatabaseOperator;
|
||||
|
||||
/**
|
||||
EODatabaseOperation represent a database high level operation on an object (record)
|
||||
It creates EOAdaptorOperations.
|
||||
You generally don't need to create such objects by yourself. They are created by EOEditingContext
|
||||
**/
|
||||
@interface EODatabaseOperation : NSObject
|
||||
{
|
||||
EODatabaseOperator _databaseOperator; //** Database Operator **/
|
||||
NSMutableDictionary *_newRow; //** New Row (new state of the object) **/
|
||||
EOGlobalID *_globalID; /** global ID of the object **/
|
||||
EOEntity *_entity; /** entity **/
|
||||
NSMutableArray *_adaptorOps; /** EOAdaptorOperations generated to perfor this DatabaseOperation **/
|
||||
id _object; /** object (record) **/
|
||||
NSDictionary *_dbSnapshot; /** The last known database values for the object (i.e. values from last fetch or last commited operation) **/
|
||||
NSMutableDictionary *_toManySnapshots; /** **/
|
||||
}
|
||||
|
||||
+ (EODatabaseOperation*)databaseOperationWithGlobalID: (EOGlobalID *)globalID
|
||||
object: (id)object
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- (id)initWithGlobalID: (EOGlobalID *)globalID
|
||||
object: (id)object
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
/** Returns the database snapshot for the object.
|
||||
The snapshot contains the last known database values for the object.
|
||||
If the object has just been inserted (i.e. not yet in database), the returned dictionary is empty
|
||||
**/
|
||||
- (NSDictionary *)dbSnapshot;
|
||||
|
||||
/** sets the snapshot for the object (should be empty if the object has just been inserted into an EOEditingContext **/
|
||||
- (void)setDBSnapshot: (NSDictionary *)dbSnapshot;
|
||||
|
||||
/** Returns a dictionary with (new) values (properties+primary keys...) of the object.
|
||||
The newRow dictionary is created when creating the database operation (in EODatabaseChannel -databaseOperationForObject: for exemple). Values come from object state in database and overrides by changes made on the object
|
||||
**/
|
||||
- (NSMutableDictionary *)newRow;
|
||||
- (void)setNewRow:(NSMutableDictionary *)newRow;
|
||||
|
||||
- (EOGlobalID *)globalID;
|
||||
|
||||
- (id)object;
|
||||
|
||||
- (EOEntity *)entity;
|
||||
|
||||
- (EODatabaseOperator)databaseOperator;
|
||||
- (void)setDatabaseOperator: (EODatabaseOperator)dbOp;
|
||||
|
||||
- (NSDictionary *)rowDiffs;
|
||||
|
||||
- (NSDictionary *)rowDiffsForAttributes: (NSArray *)attributes;
|
||||
|
||||
- (NSDictionary *)primaryKeyDiffs;
|
||||
|
||||
/** returns array of EOAdaptorOperations to perform **/
|
||||
- (NSArray *)adaptorOperations;
|
||||
|
||||
/** adds an Adaptor Operation
|
||||
Raises an exception if adaptorOperation is nil
|
||||
**/
|
||||
- (void)addAdaptorOperation: (EOAdaptorOperation *)adaptorOperation;
|
||||
|
||||
/** removes an Adaptor Operation **/
|
||||
- (void)removeAdaptorOperation: (EOAdaptorOperation *)adaptorOperation;
|
||||
|
||||
- (void)recordToManySnapshot: (NSArray *)gids relationshipName:(NSString *)name;
|
||||
- (NSDictionary *)toManySnapshots;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EODatabaseOperation_h__ */
|
351
EOAccess/EODatabaseOperation.m
Normal file
351
EOAccess/EODatabaseOperation.m
Normal file
|
@ -0,0 +1,351 @@
|
|||
/**
|
||||
EOAdaptorOperation.m <title>EOAdaptorOperation Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EODatabaseOperation.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
|
||||
@implementation EODatabaseOperation
|
||||
|
||||
+ (EODatabaseOperation *)databaseOperationWithGlobalID: (EOGlobalID *)globalID
|
||||
object: (id)object
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
return [[[self alloc] initWithGlobalID: globalID
|
||||
object: object
|
||||
entity: entity] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithGlobalID: (EOGlobalID *)globalID
|
||||
object: (id)object
|
||||
entity: (EOEntity *)entity
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_object, object);
|
||||
ASSIGN(_globalID, globalID);
|
||||
ASSIGN(_entity, entity);
|
||||
|
||||
//_newRow = [NSMutableDictionary new];//still nil
|
||||
|
||||
//_toManySnapshots = [NSMutableDictionary new];//TODO no: still nil
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_newRow);
|
||||
DESTROY(_globalID);
|
||||
DESTROY(_entity);
|
||||
DESTROY(_adaptorOps);
|
||||
DESTROY(_object);
|
||||
DESTROY(_dbSnapshot);
|
||||
DESTROY(_toManySnapshots);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSDictionary *)dbSnapshot
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"dbOpe %@ snapshot %p=%@", self, _dbSnapshot, _dbSnapshot);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return _dbSnapshot;
|
||||
}
|
||||
|
||||
- (void)setDBSnapshot: (NSDictionary *)dbSnapshot
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
ASSIGN(_dbSnapshot, dbSnapshot);
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"dbOpe %@ snapshot %p=%@", self, _dbSnapshot, _dbSnapshot);
|
||||
|
||||
if (dbSnapshot)
|
||||
[_newRow addEntriesFromDictionary: dbSnapshot];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"dbOpe %@", self);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (NSMutableDictionary *)newRow
|
||||
{
|
||||
return _newRow;
|
||||
}
|
||||
|
||||
- (void)setNewRow: (NSMutableDictionary *)newRow
|
||||
{
|
||||
ASSIGN(_newRow, newRow);
|
||||
}
|
||||
|
||||
- (EOGlobalID *)globalID
|
||||
{
|
||||
return _globalID;
|
||||
}
|
||||
|
||||
- (id)object
|
||||
{
|
||||
return _object;
|
||||
}
|
||||
|
||||
- (EOEntity *)entity
|
||||
{
|
||||
return _entity;
|
||||
}
|
||||
|
||||
- (EODatabaseOperator)databaseOperator
|
||||
{
|
||||
return _databaseOperator;
|
||||
}
|
||||
|
||||
- (void)setDatabaseOperator: (EODatabaseOperator)dbOpe
|
||||
{
|
||||
BOOL setOpe = YES;
|
||||
|
||||
//Don't set Update if it's alreay insert
|
||||
if (dbOpe == EODatabaseUpdateOperator)
|
||||
{
|
||||
if (_databaseOperator==EODatabaseInsertOperator
|
||||
|| _databaseOperator==EODatabaseDeleteOperator)
|
||||
setOpe=NO;
|
||||
}
|
||||
|
||||
if (setOpe)
|
||||
_databaseOperator = dbOpe;
|
||||
}
|
||||
|
||||
- (NSDictionary *)rowDiffs
|
||||
{
|
||||
//OK
|
||||
NSMutableDictionary *row = nil;
|
||||
NSEnumerator *newRowEnum = nil;
|
||||
NSString *key = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"self %p=%@", self, self);
|
||||
|
||||
newRowEnum= [_newRow keyEnumerator];
|
||||
|
||||
while ((key = [newRowEnum nextObject]))
|
||||
{
|
||||
if (![_entity anyRelationshipNamed: key]) //Don't care about relationships
|
||||
{
|
||||
id value = [_newRow objectForKey: key];
|
||||
|
||||
if ([value isEqual: [_dbSnapshot objectForKey: key]] == NO)
|
||||
{
|
||||
if (!row)
|
||||
row = (NSMutableDictionary*)[NSMutableDictionary dictionary];
|
||||
|
||||
[row setObject: value
|
||||
forKey: key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"diff row %p=%@", row, row);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
- (NSDictionary*)rowDiffsForAttributes: (NSArray*)attributes
|
||||
{
|
||||
//OK
|
||||
NSMutableDictionary *row = nil;
|
||||
EOAttribute *attr = nil;
|
||||
NSEnumerator *attrsEnum = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"self %p=%@", self, self);
|
||||
|
||||
attrsEnum = [attributes objectEnumerator];
|
||||
while ((attr = [attrsEnum nextObject]))
|
||||
{
|
||||
NSString *name = [attr name];
|
||||
NSString *snapname = [_entity snapshotKeyForAttributeName: name];
|
||||
id value = [_newRow objectForKey: name];
|
||||
|
||||
if (value && [value isEqual: [_dbSnapshot objectForKey: snapname]] == NO)
|
||||
{
|
||||
if (!row)
|
||||
row = (NSMutableDictionary*)[NSMutableDictionary dictionary];
|
||||
|
||||
[row setObject: value
|
||||
forKey: name];
|
||||
}
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"diff row %p=%@", row, row);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
- (NSDictionary *)primaryKeyDiffs
|
||||
{
|
||||
//OK
|
||||
NSDictionary *row = nil;
|
||||
|
||||
if (_databaseOperator == EODatabaseUpdateOperator)
|
||||
{
|
||||
NSArray *pkAttributes = [_entity primaryKeyAttributes];
|
||||
|
||||
row = [self rowDiffsForAttributes: pkAttributes];
|
||||
}
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
- (NSArray *)adaptorOperations
|
||||
{
|
||||
return _adaptorOps;
|
||||
}
|
||||
|
||||
- (void)addAdaptorOperation: (EOAdaptorOperation *)adaptorOperation
|
||||
{
|
||||
//OK
|
||||
if (!_adaptorOps)
|
||||
_adaptorOps = [NSMutableArray new];
|
||||
|
||||
if (!adaptorOperation)
|
||||
{
|
||||
//TODO raise exception
|
||||
}
|
||||
else
|
||||
[_adaptorOps addObject: adaptorOperation];
|
||||
}
|
||||
|
||||
- (void)removeAdaptorOperation: (EOAdaptorOperation *)adaptorOperation
|
||||
{
|
||||
[_adaptorOps removeObject: adaptorOperation];
|
||||
}
|
||||
|
||||
- (void)recordToManySnapshot: (NSArray *)gids
|
||||
relationshipName: (NSString *)name
|
||||
{
|
||||
//OK ??
|
||||
if (_toManySnapshots)
|
||||
[_toManySnapshots setObject: gids
|
||||
forKey: name];//TODO VERIFY
|
||||
else
|
||||
{
|
||||
_toManySnapshots = [NSMutableDictionary dictionaryWithObject: gids
|
||||
forKey: name];
|
||||
|
||||
RETAIN(_toManySnapshots);
|
||||
}
|
||||
}
|
||||
|
||||
- (NSDictionary *)toManySnapshots
|
||||
{
|
||||
return _toManySnapshots;
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
//TODO revoir
|
||||
NSString *operatorString = nil;
|
||||
NSString *desc = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
switch (_databaseOperator)
|
||||
{
|
||||
case EODatabaseNothingOperator:
|
||||
operatorString = @"EODatabaseNothingOperator";
|
||||
break;
|
||||
|
||||
case EODatabaseInsertOperator:
|
||||
operatorString = @"EODatabaseInsertOperator";
|
||||
break;
|
||||
|
||||
case EODatabaseUpdateOperator:
|
||||
operatorString = @"EODatabaseUpdateOperator";
|
||||
break;
|
||||
|
||||
case EODatabaseDeleteOperator:
|
||||
operatorString = @"EODatabaseDeleteOperator";
|
||||
break;
|
||||
|
||||
default:
|
||||
operatorString = @"Unknwon";
|
||||
break;
|
||||
}
|
||||
|
||||
desc = [NSString stringWithFormat: @"<%s %p : operator: %@ entity: %@ globalID:%@\nnewRow %p: %@\nobject %p: %@\ndbSnapshot %p: %@>",
|
||||
object_get_class_name(self),
|
||||
(void*)self,
|
||||
operatorString,
|
||||
[_entity name],
|
||||
_globalID,
|
||||
_newRow,
|
||||
_newRow,
|
||||
_object,
|
||||
_object,
|
||||
_dbSnapshot,
|
||||
_dbSnapshot];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//Mirko
|
||||
@implementation EODatabaseOperation (private)
|
||||
|
||||
- (void)_setGlobalID: (EOGlobalID *)globalID
|
||||
{
|
||||
ASSIGN(_globalID, globalID);
|
||||
}
|
||||
|
||||
@end
|
37
EOAccess/EODatabaseOperationPriv.h
Normal file
37
EOAccess/EODatabaseOperationPriv.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
EODatabaseOperationPriv.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODatabaseOperationPriv_h__
|
||||
#define __EODatabaseOperationPriv_h__
|
||||
|
||||
|
||||
@interface EODatabaseOperation (private)
|
||||
|
||||
- (void)_setGlobalID: (EOGlobalID *)globalID;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EODatabaseOperationPriv_h__ */
|
373
EOAccess/EOEntity.h
Normal file
373
EOAccess/EOEntity.h
Normal file
|
@ -0,0 +1,373 @@
|
|||
/*
|
||||
EOEntity.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOEntity_h__
|
||||
#define __EOEntity_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <extensions/GCObject.h>
|
||||
#import <extensions/GCArray.h>
|
||||
#import <extensions/GCDictionary.h>
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOPropertyListEncoding.h>
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
|
||||
|
||||
@class EOModel;
|
||||
@class EOAttribute;
|
||||
@class EOQualifier;
|
||||
@class EORelationship;
|
||||
@class EOEntity;
|
||||
@class EOStoredProcedure;
|
||||
@class EOKeyGlobalID;
|
||||
|
||||
|
||||
@class EOFetchSpecification;
|
||||
@class EOGlobalID;
|
||||
|
||||
@class EOMutableKnownKeyDictionary;
|
||||
@class EOMKKDInitializer;
|
||||
@class EOMKKDSubsetMapping;
|
||||
|
||||
@interface EOEntity : GCObject <EOPropertyListEncoding>
|
||||
{
|
||||
NSString *_name;
|
||||
NSString *_className;
|
||||
NSString *_externalName;
|
||||
NSString *_externalQuery;
|
||||
NSDictionary *_userInfo;
|
||||
NSString* _docComment;
|
||||
NSDictionary * _internalInfo;
|
||||
EOQualifier *_restrictingQualifier;
|
||||
NSMutableDictionary *_fetchSpecificationDictionary;
|
||||
NSArray *_fetchSpecificationNames;
|
||||
NSMutableDictionary *_storedProcedures;
|
||||
|
||||
NSArray *_classPropertyNames;
|
||||
NSArray *_primaryKeyAttributeNames;
|
||||
NSArray *_classPropertyAttributeNames;
|
||||
NSArray *_classPropertyToOneRelationshipNames;
|
||||
NSArray *_classPropertyToManyRelationshipNames;
|
||||
EOClassDescription *_classDescription;
|
||||
NSMutableArray *_hiddenRelationships;
|
||||
unsigned int _batchCount;
|
||||
EOMKKDInitializer* _adaptorDictionaryInitializer;
|
||||
EOMKKDInitializer* _snapshotDictionaryInitializer;
|
||||
EOMKKDInitializer* _primaryKeyDictionaryInitializer;
|
||||
EOMKKDInitializer* _propertyDictionaryInitializer;
|
||||
EOMKKDSubsetMapping* _snapshotToAdaptorRowSubsetMapping;
|
||||
|
||||
Class _classForInstances;
|
||||
|
||||
/* Garbage collectable objects */
|
||||
EOModel *_model;
|
||||
GCMutableArray *_attributes;
|
||||
GCMutableDictionary *_attributesByName;
|
||||
GCMutableArray *_relationships;
|
||||
GCMutableDictionary *_relationshipsByName; // name/EORelationship
|
||||
GCMutableArray *_primaryKeyAttributes;
|
||||
GCMutableArray *_classProperties; // EOAttribute/EORelationship
|
||||
GCMutableArray *_attributesUsedForLocking;
|
||||
GCMutableArray *_attributesToFetch;
|
||||
GCMutableArray *_attributesToSave;
|
||||
GCMutableArray *_propertiesToFault;
|
||||
GCArray* _dbSnapshotKeys;
|
||||
|
||||
GCMutableArray *_subEntities;
|
||||
EOEntity *_parent;
|
||||
|
||||
struct {
|
||||
unsigned int attributesIsLazy:1;
|
||||
unsigned int relationshipsIsLazy:1;
|
||||
unsigned int classPropertiesIsLazy:1;
|
||||
unsigned int primaryKeyAttributesIsLazy:1;
|
||||
unsigned int attributesUsedForLockingIsLazy:1;
|
||||
|
||||
unsigned int isReadOnly:1;
|
||||
unsigned int isAbstractEntity:1;
|
||||
unsigned int updating:1;
|
||||
unsigned int cachesObjects:1;
|
||||
|
||||
unsigned int createsMutableObjects:1;
|
||||
|
||||
unsigned int extraRefCount:22;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
/** returns an autoreleased entity **/
|
||||
+ (EOEntity *)entity;
|
||||
|
||||
/** returns an autoreleased entity owned by onwer and built from propertyList **/
|
||||
+ (EOEntity *)entityWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner;
|
||||
- (NSString *)description;
|
||||
|
||||
/* Accessing the name */
|
||||
- (NSString*)name;
|
||||
|
||||
/* Accessing the model */
|
||||
- (EOModel*)model;
|
||||
|
||||
/* Accessing external information */
|
||||
- (NSString*)externalName;
|
||||
|
||||
/* Accessing the external query */
|
||||
- (NSString*)externalQuery;
|
||||
|
||||
/* Getting the qualifier */
|
||||
- (EOQualifier *)restrictingQualifier;
|
||||
|
||||
- (BOOL)isQualifierForPrimaryKey: (EOQualifier *)qualifier;
|
||||
- (EOQualifier *)qualifierForPrimaryKey: (NSDictionary *)row;
|
||||
|
||||
/* Accessing read-only status */
|
||||
- (BOOL)isReadOnly;
|
||||
|
||||
- (BOOL)cachesObjects;
|
||||
|
||||
/* Accessing the enterprise object class */
|
||||
- (NSString*)className;
|
||||
|
||||
/* Accessing attributes */
|
||||
- (EOAttribute *)attributeNamed: (NSString *)attributeName;
|
||||
- (EOAttribute *)anyAttributeNamed: (NSString *)relationshipName;
|
||||
- (NSArray *)attributes;
|
||||
|
||||
/* Accessing relationships */
|
||||
- (EORelationship *)relationshipNamed: (NSString *)relationshipName;
|
||||
- (EORelationship *)anyRelationshipNamed: (NSString *)relationshipName;
|
||||
- (NSArray *)relationships;
|
||||
|
||||
/* Accessing class properties */
|
||||
- (NSArray *)classProperties;
|
||||
- (NSArray *)classPropertyNames;
|
||||
|
||||
- (NSArray *)fetchSpecificationNames;
|
||||
- (EOFetchSpecification *)fetchSpecificationNamed: (NSString *)fetchSpecName;
|
||||
|
||||
/* Accessing primary key attributes */
|
||||
- (NSArray *)primaryKeyAttributes;
|
||||
- (NSArray *)primaryKeyAttributeNames;
|
||||
|
||||
/* Accessing locking attributes */
|
||||
- (NSArray *)attributesUsedForLocking;
|
||||
- (NSArray *)attributesToFetch;
|
||||
|
||||
/* Getting primary keys and snapshot for row */
|
||||
- (NSDictionary *)primaryKeyForRow: (NSDictionary *)row;
|
||||
- (BOOL)isValidAttributeUsedForLocking: (EOAttribute *)anAttribute;
|
||||
- (BOOL)isValidPrimaryKeyAttribute: (EOAttribute *)anAttribute;
|
||||
- (BOOL)isPrimaryKeyValidInObject: (id)object;
|
||||
- (BOOL)isValidClassProperty: aProp;
|
||||
|
||||
/** Accessing the user dictionary **/
|
||||
- (NSDictionary *)userInfo;
|
||||
|
||||
/** Accessing the documentation **/
|
||||
- (NSString *)docComment;
|
||||
|
||||
- (NSArray *)subEntities;
|
||||
- (EOEntity *)parentEntity;
|
||||
- (BOOL)isAbstractEntity;
|
||||
|
||||
|
||||
- (unsigned int)maxNumberOfInstancesToBatchFetch;
|
||||
- (BOOL)isPrototypeEntity;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOKeyGlobalID)
|
||||
- (EOGlobalID *)globalIDForRow: (NSDictionary *)row;
|
||||
- (id) globalIDForRow: (NSDictionary*)row
|
||||
isFinal: (BOOL)isFinal;
|
||||
- (NSDictionary *)primaryKeyForGlobalID: (EOKeyGlobalID *)gid;
|
||||
- (Class)classForObjectWithGlobalID: (EOKeyGlobalID*)globalID;
|
||||
@end
|
||||
|
||||
|
||||
@interface EOEntity (EOEntityEditing)
|
||||
|
||||
- (BOOL)setClassProperties: (NSArray*)properties;
|
||||
- (BOOL)setPrimaryKeyAttributes: (NSArray*)keys;
|
||||
- (BOOL)setAttributesUsedForLocking: (NSArray*)attributes;
|
||||
- (NSException *)validateName: (NSString *) name;
|
||||
- (void)setName: (NSString*)name;
|
||||
- (void)setExternalName: (NSString*)name;
|
||||
- (void)setExternalQuery: (NSString*)query;
|
||||
- (void)setRestrictingQualifier: (EOQualifier *)qualifier;
|
||||
- (void)setReadOnly: (BOOL)flag;
|
||||
- (void)setCachesObjects: (BOOL)yn;
|
||||
|
||||
- (void)addAttribute: (EOAttribute *)attribute;
|
||||
- (void)removeAttribute: (EOAttribute *)attribute;
|
||||
|
||||
- (void)addRelationship: (EORelationship *)relationship;
|
||||
- (void)removeRelationship: (EORelationship *)relationship;
|
||||
|
||||
- (void)addFetchSpecification: (EOFetchSpecification *)fetchSpec
|
||||
named: (NSString *)name;
|
||||
- (void)removeFetchSpecificationNamed: (NSString *)name;
|
||||
|
||||
- (void)setClassName: (NSString*)name;
|
||||
- (void)setUserInfo: (NSDictionary*)dictionary;
|
||||
- (void) _setInternalInfo: (NSDictionary*)dictionary;
|
||||
- (void) setDocComment:(NSString *)docComment;
|
||||
|
||||
- (void)addSubEntity: (EOEntity *)child;
|
||||
- (void)removeSubEntity: (EOEntity *)child;
|
||||
|
||||
- (void)setIsAbstractEntity: (BOOL)f;
|
||||
- (void)setMaxNumberOfInstancesToBatchFetch: (unsigned int)size;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOEntity (EOModelReferentialIntegrity)
|
||||
|
||||
- (BOOL)referencesProperty:property;
|
||||
- (NSArray *)externalModelsReferenced;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOModelBeautifier)
|
||||
|
||||
- (void)beautifyName;
|
||||
|
||||
@end
|
||||
|
||||
extern NSString *EOFetchAllProcedureOperation;
|
||||
extern NSString *EOFetchWithPrimaryKeyProcedureOperation;
|
||||
extern NSString *EOInsertProcedureOperation;
|
||||
extern NSString *EODeleteProcedureOperation;
|
||||
extern NSString *EONextPrimaryKeyProcedureOperation;
|
||||
|
||||
@interface EOEntity (MethodSet11)
|
||||
- (NSException *)validateObjectForDelete: (id)object;
|
||||
- (id) classPropertyAttributeNames;
|
||||
- (id) classPropertyToManyRelationshipNames;
|
||||
- (id) classPropertyToOneRelationshipNames;
|
||||
- (id) qualifierForDBSnapshot: (id)param0;
|
||||
- (EOAttribute*) attributeForPath: (NSString*)path;
|
||||
- (EORelationship*) relationshipForPath: (NSString*)path;
|
||||
- (void) _addAttributesToFetchForRelationshipPath: (NSString*)path
|
||||
atts: (NSMutableDictionary*)atts;
|
||||
- (id) dbSnapshotKeys;
|
||||
- (NSArray*) flattenedAttributes;
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOStoredProcedures)
|
||||
|
||||
- (EOStoredProcedure *)storedProcedureForOperation: (NSString *)operation;
|
||||
- (void)setStoredProcedure: (EOStoredProcedure *)storedProcedure
|
||||
forOperation: (NSString *)operation;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOPrimaryKeyGeneration)
|
||||
|
||||
- (NSString *)primaryKeyRootName;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOEntityClassDescription)
|
||||
|
||||
- (EOClassDescription *)classDescriptionForInstances;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOEntityHidden)
|
||||
- (NSDictionary*)attributesByName;
|
||||
- (NSDictionary*)relationshipsByName;
|
||||
- (NSArray*) _allFetchSpecifications;
|
||||
- (NSDictionary*) _fetchSpecificationDictionary;
|
||||
- (void) _loadEntity;
|
||||
- (id) parentRelationship;
|
||||
- (int) _numberOfRelationships;
|
||||
- (BOOL) _hasReadOnlyAttributes;
|
||||
- (NSArray*) writableDBSnapshotKeys;
|
||||
- (NSArray*) rootAttributesUsedForLocking;
|
||||
- (BOOL) isSubEntityOf:(id)param0;
|
||||
- (id) initObject: (id)param0
|
||||
editingContext: (id)param1
|
||||
globalID: (id)param2;
|
||||
- (id) allocBiggestObjectWithZone:(NSZone*)zone;
|
||||
- (Class) _biggestClass;
|
||||
- (NSArray*) relationshipsPlist;
|
||||
- (id) rootParent;
|
||||
- (void) _setParent: (id)param0;
|
||||
- (NSArray*) _hiddenRelationships;
|
||||
- (NSArray*) _propertyNames;
|
||||
- (id) _flattenAttribute: (id)param0
|
||||
relationshipPath: (id)param1
|
||||
currentAttributes: (id)param2;
|
||||
- (NSString*) snapshotKeyForAttributeName: (NSString*)attributeName;
|
||||
- (id) _flattenedAttNameToSnapshotKeyMapping;
|
||||
- (EOMKKDSubsetMapping*) _snapshotToAdaptorRowSubsetMapping;
|
||||
- (EOMutableKnownKeyDictionary*) _dictionaryForPrimaryKey;
|
||||
- (EOMutableKnownKeyDictionary*) _dictionaryForProperties;
|
||||
- (NSArray*) _relationshipsToFaultForRow: (NSDictionary*)row;
|
||||
- (NSArray*) _classPropertyAttributes;
|
||||
- (NSArray*) _attributesToSave;
|
||||
- (NSArray*) _attributesToFetch;
|
||||
- (EOMKKDInitializer*) _adaptorDictionaryInitializer;
|
||||
- (EOMKKDInitializer*) _snapshotDictionaryInitializer;
|
||||
- (EOMKKDInitializer*) _primaryKeyDictionaryInitializer;
|
||||
- (EOMKKDInitializer*) _propertyDictionaryInitializer;
|
||||
- (void) _setModel: (EOModel*)model;
|
||||
- (void) _setIsEdited;
|
||||
- (NSArray*) _classPropertyAttributes;
|
||||
@end
|
||||
|
||||
@interface EOEntityClassDescription:EOClassDescription
|
||||
{
|
||||
EOEntity *_entity;
|
||||
unsigned int extraRefCount;
|
||||
}
|
||||
|
||||
/** returns an autoreleased entity class description for entity entity **/
|
||||
+ (EOEntityClassDescription*)entityClassDescriptionWithEntity: (EOEntity *)entity;
|
||||
|
||||
/** initialize with entity **/
|
||||
- initWithEntity: (EOEntity *)entity;
|
||||
|
||||
/** returns entity **/
|
||||
- (EOEntity *)entity;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSString (EODatabaseNameConversion)
|
||||
|
||||
+ (NSString *)nameForExternalName: (NSString *)externalName
|
||||
separatorString: (NSString *)separatorString
|
||||
initialCaps: (BOOL)initialCaps;
|
||||
+ (NSString *)externalNameForInternalName: (NSString *)internalName
|
||||
separatorString: (NSString *)separatorString
|
||||
useAllCaps: (BOOL)allCaps;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOEntity_h__ */
|
4367
EOAccess/EOEntity.m
Normal file
4367
EOAccess/EOEntity.m
Normal file
File diff suppressed because it is too large
Load diff
68
EOAccess/EOEntityPriv.h
Normal file
68
EOAccess/EOEntityPriv.h
Normal file
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
EOEntityPriv.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOEntityPriv_h__
|
||||
#define __EOEntityPriv_h__
|
||||
|
||||
|
||||
@interface EOEntity (EOEntityPrivate)
|
||||
|
||||
- (void)setCreateMutableObjects: (BOOL)flag;
|
||||
- (BOOL)createsMutableObjects;
|
||||
|
||||
- (void)setModel: (EOModel *)model;
|
||||
- (void)setParentEntity: (EOEntity *)parent;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOEntityRelationshipPrivate)
|
||||
- (EORelationship*) _inverseRelationshipPathForPath: (NSString*)path;
|
||||
- (id) _keyMapForRelationshipPath: (NSString*)path;
|
||||
- (id) _keyMapForIdenticalKeyRelationshipPath: (id)param0;
|
||||
- (id) _mapAttribute: (id)param0
|
||||
toDestinationAttributeInLastComponentOfRelationshipPath: (NSString*)path;
|
||||
- (BOOL) _relationshipPathIsToMany: (id)param0;
|
||||
- (BOOL) _relationshipPathHasIdenticalKeys: (id)param0;
|
||||
@end
|
||||
|
||||
@class EOExpressionArray;
|
||||
|
||||
@interface EOEntity (EOEntitySQLExpression)
|
||||
- (id) valueForSQLExpression: (id)param0;
|
||||
+ (id) valueForSQLExpression: (id)param0;
|
||||
@end
|
||||
|
||||
@interface EOEntity (EOEntityPrivateXX)
|
||||
- (EOExpressionArray *) _parseDescription: (NSString *)description
|
||||
isFormat: (BOOL)isFormat
|
||||
arguments: (char*)param2;
|
||||
- (EOExpressionArray*) _parseRelationshipPath: (NSString*)path;
|
||||
- (id) _parsePropertyName: (id)param0;
|
||||
//- (id) _newStringWithBuffer: (unsigned short*)param0
|
||||
// length: (unsigned int*)param1;
|
||||
@end
|
||||
|
||||
#endif
|
107
EOAccess/EOExpressionArray.h
Normal file
107
EOAccess/EOExpressionArray.h
Normal file
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
EOExpressionArray.h
|
||||
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
|
||||
Date: September 1996
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOExpressionArray_h__
|
||||
#define __EOExpressionArray_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <extensions/GCArray.h>
|
||||
|
||||
@class EOAttribute;
|
||||
@class EOEntity;
|
||||
@class EOExpressionArray;
|
||||
|
||||
@protocol EOExpressionContext <NSObject>
|
||||
|
||||
- (NSString *)expressionValueForAttribute: (EOAttribute *)anAttribute;
|
||||
- (NSString *)expressionValueForAttributePath: (NSArray *)path;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOExpressionArray : GCMutableArray
|
||||
{
|
||||
NSString *_prefix;
|
||||
NSString *_infix;
|
||||
NSString *_suffix;
|
||||
// NSString *_definition; it's rebuilt
|
||||
EOAttribute *_realAttribute;
|
||||
|
||||
struct
|
||||
{
|
||||
unsigned int isFlattened:1; //TODO Why ?
|
||||
} _flags;
|
||||
}
|
||||
|
||||
+ (EOExpressionArray*)expressionArray;
|
||||
+ (EOExpressionArray*)expressionArrayWithPrefix: (NSString *)prefix
|
||||
infix: (NSString *)infix
|
||||
suffix: (NSString *)suffix;
|
||||
|
||||
/* Initializing instances */
|
||||
- initWithPrefix: (NSString *)prefix
|
||||
infix: (NSString *)infix
|
||||
suffix: (NSString *)suffix;
|
||||
|
||||
- (NSString *)prefix;
|
||||
- (NSString *)infix;
|
||||
- (NSString *)suffix;
|
||||
|
||||
- (NSString *)definition;
|
||||
- (BOOL)isFlattened;
|
||||
- (EOAttribute *)realAttribute;
|
||||
|
||||
/* Accessing the components */
|
||||
- (void)setPrefix: (NSString*)prefix;
|
||||
- (void)setInfix: (NSString*)infix;
|
||||
- (void)setSuffix: (NSString*)suffix;
|
||||
|
||||
/* Checking contents */
|
||||
- (BOOL)referencesObject: (id)anObject;
|
||||
|
||||
- (NSString *)expressionValueForContext: (id<EOExpressionContext>)ctx;
|
||||
|
||||
+ (EOExpressionArray *)parseExpression: (NSString *)expression
|
||||
entity: (EOEntity *)entity
|
||||
replacePropertyReferences: (BOOL)flag;
|
||||
|
||||
- (NSString*)valueForSQLExpression: (EOSQLExpression *)sqlExpression;
|
||||
|
||||
@end /* EOExpressionArray */
|
||||
|
||||
|
||||
@interface NSObject (EOExpression)
|
||||
- (NSString*)expressionValueForContext: (id<EOExpressionContext>)context;
|
||||
@end
|
||||
|
||||
|
||||
@interface NSString (EOAttributeTypeCheck)
|
||||
|
||||
- (BOOL)isNameOfARelationshipPath;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOExpressionArray_h__ */
|
400
EOAccess/EOExpressionArray.m
Normal file
400
EOAccess/EOExpressionArray.m
Normal file
|
@ -0,0 +1,400 @@
|
|||
/**
|
||||
EOExpressionArray.m <title>EOExpressionArray</title>
|
||||
|
||||
Copyright (C) 1996-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
|
||||
Date: September 1996
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <ctype.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
|
||||
#import <extensions/objc-runtime.h>
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/GarbageCollector.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOExpressionArray.h>
|
||||
#import <EOAccess/EORelationship.h>
|
||||
|
||||
@implementation EOExpressionArray
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
static BOOL initialized = NO;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
initialized = YES;
|
||||
class_add_behavior(self, [GCArray class]);
|
||||
}
|
||||
}
|
||||
|
||||
+ (EOExpressionArray*)expressionArray
|
||||
{
|
||||
return [[self new] autorelease];
|
||||
}
|
||||
|
||||
- (id) init
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
self = [super init];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (EOExpressionArray*)expressionArrayWithPrefix: (NSString *)prefix
|
||||
infix: (NSString *)infix
|
||||
suffix: (NSString *)suffix
|
||||
{
|
||||
return [[[self alloc]initWithPrefix: prefix
|
||||
infix: infix
|
||||
suffix: suffix] autorelease];
|
||||
}
|
||||
|
||||
- (id)initWithPrefix: (NSString *)prefix
|
||||
infix: (NSString *)infix
|
||||
suffix: (NSString *)suffix
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(_prefix, prefix);
|
||||
ASSIGN(_infix, infix);
|
||||
ASSIGN(_suffix, suffix);
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_realAttribute); //TODO mettere nei metodi GC
|
||||
// DESTROY(_definition);
|
||||
[_prefix release];
|
||||
[_infix release];
|
||||
[_suffix release];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (BOOL)referencesObject: (id)anObject
|
||||
{
|
||||
return [self indexOfObject: anObject] != NSNotFound;
|
||||
}
|
||||
|
||||
- (NSString *)expressionValueForContext: (id<EOExpressionContext>)ctx
|
||||
{
|
||||
if (ctx && [self count]
|
||||
&& [[self objectAtIndex: 0] isKindOfClass: [EORelationship class]])
|
||||
return [ctx expressionValueForAttributePath: self];
|
||||
else
|
||||
{
|
||||
int i, count = [self count];
|
||||
id result = [[NSMutableString new] autorelease];
|
||||
SEL sel = @selector(appendString:);
|
||||
IMP imp = [result methodForSelector: sel];
|
||||
|
||||
if (_prefix)
|
||||
[result appendString:_prefix];
|
||||
|
||||
if (count)
|
||||
{
|
||||
(*imp)(result, sel, [[self objectAtIndex: 0]
|
||||
expressionValueForContext: ctx]);
|
||||
|
||||
for (i = 1 ; i < count; i++)
|
||||
{
|
||||
if (_infix)
|
||||
(*imp)(result, sel, _infix);
|
||||
(*imp)(result, sel, [[self objectAtIndex: i]
|
||||
expressionValueForContext: ctx]);
|
||||
}
|
||||
}
|
||||
|
||||
if(_suffix)
|
||||
[result appendString: _suffix];
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setPrefix: (NSString *)prefix
|
||||
{
|
||||
ASSIGN(_prefix, prefix);
|
||||
}
|
||||
|
||||
- (void)setInfix: (NSString *)infix
|
||||
{
|
||||
ASSIGN(_infix, infix);
|
||||
}
|
||||
|
||||
- (void)setSuffix: (NSString *)suffix
|
||||
{
|
||||
ASSIGN(_suffix, suffix);
|
||||
}
|
||||
|
||||
- (NSString *)prefix
|
||||
{
|
||||
return _prefix;
|
||||
}
|
||||
|
||||
- (NSString *)infix
|
||||
{
|
||||
return _infix;
|
||||
}
|
||||
|
||||
- (NSString *)suffix
|
||||
{
|
||||
return _suffix;
|
||||
}
|
||||
|
||||
- (NSString *)definition
|
||||
{
|
||||
// return _definition;
|
||||
return [self valueForSQLExpression: nil];
|
||||
}
|
||||
|
||||
- (BOOL)isFlattened
|
||||
{
|
||||
// return _flags.isFlattened;
|
||||
return ([self count] > 1);
|
||||
}
|
||||
|
||||
- (EOAttribute *)realAttribute
|
||||
{
|
||||
return _realAttribute;
|
||||
}
|
||||
|
||||
/*
|
||||
+ (EOExpressionArray *)parseExpression:(NSString *)expression
|
||||
entity:(EOEntity *)entity
|
||||
replacePropertyReferences:(BOOL)replacePropertyReferences
|
||||
{
|
||||
EOExpressionArray *array = nil;
|
||||
const char *s = NULL;
|
||||
const char *start=NULL;
|
||||
id objectToken=nil;
|
||||
EOFLOGObjectFnStart();
|
||||
NSDebugMLLog(@"gsdb",@"expression=%@",expression);
|
||||
NSDebugMLLog(@"gsdb",@"entity=%@",entity);
|
||||
|
||||
array = [[EOExpressionArray new] autorelease];
|
||||
s = [expression cString];
|
||||
|
||||
// ASSIGN(array->_definition, expression);
|
||||
array->_flags.isFlattened = NO;
|
||||
|
||||
if([expression isNameOfARelationshipPath])
|
||||
{
|
||||
NSArray *defArray;
|
||||
NSString *realAttributeName;
|
||||
int count, i;
|
||||
|
||||
array->_flags.isFlattened = YES;
|
||||
defArray = [expression componentsSeparatedByString:@"."];
|
||||
count = [defArray count];
|
||||
|
||||
for(i = 0; i < count - 1; i++)
|
||||
{
|
||||
id relationshipName = [defArray objectAtIndex:i];
|
||||
id relationship=nil;
|
||||
|
||||
relationship = [entity relationshipNamed:relationshipName];
|
||||
|
||||
if(!relationship)
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"%@ -- %@ 0x%x: '%@' for entity '%@' is an invalid property",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
relationshipName,
|
||||
entity];
|
||||
|
||||
// if([relationship isToMany])
|
||||
// [NSException raise:NSInvalidArgumentException format:@"%@ -- %@ 0x%x: '%@' for entity '%@' must be a to one relationship",
|
||||
//NSStringFromSelector(_cmd),
|
||||
//NSStringFromClass([self class]),
|
||||
//self,
|
||||
//relationshipName,
|
||||
//entity];
|
||||
|
||||
[array addObject:relationship];
|
||||
entity = [relationship destinationEntity];
|
||||
}
|
||||
realAttributeName = [defArray lastObject];
|
||||
ASSIGN(array->_realAttribute, [entity attributeNamed:realAttributeName]);
|
||||
|
||||
if(!array->_realAttribute)
|
||||
ASSIGN(array->_realAttribute, [entity relationshipNamed:realAttributeName]);
|
||||
|
||||
if(!array->_realAttribute)
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"%@ -- %@ 0x%x: '%@' for entity '%@' is an invalid property",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
realAttributeName,
|
||||
entity];
|
||||
|
||||
[array addObject:array->_realAttribute];
|
||||
}
|
||||
else
|
||||
{
|
||||
//IN eoentity persedescr
|
||||
}
|
||||
NSDebugMLLog(@"gsdb",@"_prefix=%@",array->_prefix);
|
||||
NSDebugMLLog(@"gsdb",@"_infix=%@",array->_infix);
|
||||
NSDebugMLLog(@"gsdb",@"_suffix=%@",array->_suffix);
|
||||
// NSDebugMLLog(@"gsdb",@"_definition=%@",array->_definition);
|
||||
NSDebugMLLog(@"gsdb",@"_realAttribute=%@",array->_realAttribute);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
return array;
|
||||
}
|
||||
*/
|
||||
|
||||
- (BOOL)_isPropertyPath
|
||||
{
|
||||
/*
|
||||
int i=0;
|
||||
int count=0;
|
||||
|
||||
count=[self count];
|
||||
objectAtIndex:i
|
||||
if it's a string return NO
|
||||
*/
|
||||
//TODO
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSString *)valueForSQLExpression: (EOSQLExpression*)sqlExpression
|
||||
{
|
||||
//TODO verify
|
||||
NSMutableString *value = [NSMutableString string];
|
||||
int i, count;
|
||||
|
||||
NS_DURING //Just for debugging
|
||||
{
|
||||
count = [self count];
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
id obj = [self objectAtIndex: i];
|
||||
NSString *relValue;
|
||||
|
||||
relValue = [obj valueForSQLExpression: sqlExpression];
|
||||
|
||||
if (i > 0)
|
||||
[value appendString: @"."];
|
||||
|
||||
[value appendString: relValue];
|
||||
}
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSLog(@"exception in EOExpressionArray valueForSQLExpression: self=%p class=%@ i=%d", self, [self class], i);
|
||||
NSLog(@"exception in EOExpressionArray valueForSQLExpression: self=%@ class=%@ i=%d", self, [self class], i);
|
||||
NSLog(@"exception=%@", localException);
|
||||
|
||||
[localException raise];
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
|
||||
return value;
|
||||
}
|
||||
@end /* EOExpressionArray */
|
||||
|
||||
|
||||
@implementation NSObject (EOExpression)
|
||||
|
||||
- (NSString*)expressionValueForContext: (id<EOExpressionContext>)ctx
|
||||
{
|
||||
if ([self respondsToSelector: @selector(stringValue)])
|
||||
return [(id)self stringValue];
|
||||
else
|
||||
return [self description];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSString (EOExpression)
|
||||
|
||||
/* Avoid returning the description in case of NSString because if the string
|
||||
contains whitespaces it will be quoted. Particular adaptors have to override
|
||||
-formatValue:forAttribute: and they have to quote with the specific
|
||||
database character the returned string. */
|
||||
- (NSString*)expressionValueForContext: (id<EOExpressionContext>)ctx
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (EOAttributeTypeCheck)
|
||||
|
||||
- (BOOL)isNameOfARelationshipPath
|
||||
{
|
||||
const char *s = [self cString];
|
||||
BOOL result = NO;
|
||||
|
||||
if (isalnum(*s) || *s == '@' || *s == '_' || *s == '#')
|
||||
{
|
||||
for (++s; *s; s++)
|
||||
{
|
||||
if (!isalnum(*s) && *s != '@' && *s != '_' && *s != '#' && *s != '$'
|
||||
&& *s != '.')
|
||||
return NO;
|
||||
|
||||
if (*s == '.')
|
||||
result = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
70
EOAccess/EOJoin.h
Normal file
70
EOAccess/EOJoin.h
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
EOJoin.h
|
||||
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
|
||||
Date: August 1996
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOJoin_h__
|
||||
#define __EOJoin_h__
|
||||
|
||||
#import <extensions/GCObject.h>
|
||||
#import <extensions/GCArray.h>
|
||||
|
||||
|
||||
@class EOEntity;
|
||||
@class EOAttribute;
|
||||
|
||||
|
||||
@interface EOJoin : GCObject
|
||||
{
|
||||
/* Garbage collectable objects */
|
||||
EOAttribute *_sourceAttribute;
|
||||
EOAttribute *_destinationAttribute;
|
||||
}
|
||||
|
||||
+ (EOJoin *)joinWithSourceAttribute: (EOAttribute *)source
|
||||
destinationAttribute: (EOAttribute *)destination;
|
||||
|
||||
- initWithSourceAttribute: (EOAttribute *)source
|
||||
destinationAttribute: (EOAttribute *)destination;
|
||||
|
||||
- (NSString *)description;
|
||||
|
||||
- (EOAttribute *)sourceAttribute;
|
||||
- (EOAttribute *)destinationAttribute;
|
||||
|
||||
- (BOOL)isReciprocalToJoin: (EOJoin *)otherJoin;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOJoin (EOJoinPrivate)
|
||||
|
||||
//+ (EOJoin*)joinFromPropertyList:(id)propertyList;
|
||||
//- (void)replaceStringsWithObjectsInRelationship:(EORelationship*)entity;
|
||||
//- (id)propertyList;
|
||||
|
||||
@end /* EOJoin (EOJoinPrivate) */
|
||||
|
||||
|
||||
#endif /* __EOJoin_h__ */
|
202
EOAccess/EOJoin.m
Normal file
202
EOAccess/EOJoin.m
Normal file
|
@ -0,0 +1,202 @@
|
|||
/**
|
||||
EOJoin.m <title>EOJoin Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EORelationship.h>
|
||||
#import <EOAccess/EOJoin.h>
|
||||
|
||||
|
||||
@implementation EOJoin
|
||||
|
||||
+ (EOJoin *) joinWithSourceAttribute: (EOAttribute *)source
|
||||
destinationAttribute: (EOAttribute *)destination
|
||||
{
|
||||
return [[[self alloc] initWithSourceAttribute: source
|
||||
destinationAttribute: destination] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithSourceAttribute: (EOAttribute *)source
|
||||
destinationAttribute: (EOAttribute *)destination
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
if (!source || !destination)
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: source and destination attributes can't be nil",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
ASSIGN(_sourceAttribute, source);
|
||||
ASSIGN(_destinationAttribute, destination);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCountOfContainedObjects
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"sourceAttribute gcDecrementRefCount");
|
||||
|
||||
[_sourceAttribute gcDecrementRefCount];
|
||||
NSDebugMLLog(@"gsdb", @"destinationAttribute gcDecrementRefCount");
|
||||
|
||||
[_destinationAttribute gcDecrementRefCount];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects
|
||||
{
|
||||
if (![super gcIncrementRefCountOfContainedObjects])
|
||||
return NO;
|
||||
|
||||
[_sourceAttribute gcIncrementRefCount];
|
||||
[_destinationAttribute gcIncrementRefCount];
|
||||
|
||||
[_sourceAttribute gcIncrementRefCountOfContainedObjects];
|
||||
[_destinationAttribute gcIncrementRefCountOfContainedObjects];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (unsigned)hash
|
||||
{
|
||||
return [_sourceAttribute hash];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
NSString *dscr = nil;
|
||||
/*NSString *joinOperatorDescr = nil;
|
||||
NSString *joinSemanticDescr = nil;
|
||||
|
||||
switch(joinOperator)
|
||||
{
|
||||
case EOJoinEqualTo:
|
||||
joinOperatorDescr=@"EOJoinEqualTo";
|
||||
break;
|
||||
case EOJoinNotEqualTo:
|
||||
joinOperatorDescr=@"EOJoinNotEqualTo";
|
||||
break;
|
||||
case EOJoinGreaterThan:
|
||||
joinOperatorDescr=@"EOJoinGreaterThan";
|
||||
break;
|
||||
case EOJoinGreaterThanOrEqualTo:
|
||||
joinOperatorDescr=@"EOJoinGreaterThanOrEqualTo";
|
||||
break;
|
||||
case EOJoinLessThan:
|
||||
joinOperatorDescr=@"EOJoinLessThan";
|
||||
break;
|
||||
case EOJoinLessThanOrEqualTo:
|
||||
joinOperatorDescr=@"EOJoinLessThanOrEqualTo";
|
||||
break;
|
||||
};
|
||||
switch(joinSemantic)
|
||||
{
|
||||
case EOInnerJoin:
|
||||
joinSemanticDescr=@"EOInnerJoin";
|
||||
break;
|
||||
case EOFullOuterJoin:
|
||||
joinSemanticDescr=@"EOFullOuterJoin";
|
||||
break;
|
||||
case EOLeftOuterJoin:
|
||||
joinSemanticDescr=@"EOLeftOuterJoin";
|
||||
break;
|
||||
case EORightOuterJoin:
|
||||
joinSemanticDescr=@"EORightOuterJoin";
|
||||
break;
|
||||
};
|
||||
*/
|
||||
|
||||
dscr = [NSString stringWithFormat: @"<%s %p -",
|
||||
object_get_class_name(self),
|
||||
(void*)self];
|
||||
dscr = [dscr stringByAppendingFormat: @" sourceAttribute=%@",
|
||||
[_sourceAttribute name]];
|
||||
dscr = [dscr stringByAppendingFormat: @" destinationAttribute=%@",
|
||||
[_destinationAttribute name]];
|
||||
|
||||
/* dscr=[dscr stringByAppendingFormat:@" relationship name=%@",
|
||||
[relationship name]];
|
||||
dscr=[dscr stringByAppendingFormat:@" joinOperator=%@ joinSemantic=%@>",
|
||||
joinOperatorDescr,
|
||||
joinSemanticDescr];*/
|
||||
|
||||
return dscr;
|
||||
}
|
||||
|
||||
- (EOAttribute *)destinationAttribute
|
||||
{
|
||||
return _destinationAttribute;
|
||||
}
|
||||
|
||||
- (EOAttribute *)sourceAttribute
|
||||
{
|
||||
return _sourceAttribute;
|
||||
}
|
||||
|
||||
- (BOOL)isReciprocalToJoin: (EOJoin *)otherJoin
|
||||
{
|
||||
//OK
|
||||
NSDebugMLLog(@"gsdb", @"_sourceAttribute name=%@",
|
||||
[_sourceAttribute name]);
|
||||
NSDebugMLLog(@"gsdb", @"[[otherJoin destinationAttribute] name]=%@",
|
||||
[[otherJoin destinationAttribute] name]);
|
||||
NSDebugMLLog(@"gsdb", @"_destinationAttribute name=%@",
|
||||
[_destinationAttribute name]);
|
||||
NSDebugMLLog(@"gsdb", @"[[otherJoin sourceAttribute] name]=%@",
|
||||
[[otherJoin sourceAttribute] name]);
|
||||
|
||||
if ([[_sourceAttribute name]
|
||||
isEqual: [[otherJoin destinationAttribute] name]]
|
||||
&& [[_destinationAttribute name]
|
||||
isEqual: [[otherJoin sourceAttribute] name]])
|
||||
return YES;
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
|
||||
@end
|
191
EOAccess/EOModel.h
Normal file
191
EOAccess/EOModel.h
Normal file
|
@ -0,0 +1,191 @@
|
|||
/*
|
||||
EOModel.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOModel_h__
|
||||
#define __EOModel_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <extensions/GCObject.h>
|
||||
#import <extensions/GCArray.h>
|
||||
#import <extensions/GCDictionary.h>
|
||||
|
||||
#import <EOAccess/EOPropertyListEncoding.h>
|
||||
|
||||
@class EOEntity;
|
||||
@class EOModelGroup;
|
||||
@class EOStoredProcedure;
|
||||
|
||||
|
||||
@interface EOModel : GCObject
|
||||
{
|
||||
NSString *_name;
|
||||
NSString *_path;
|
||||
NSString *_adaptorName;
|
||||
NSString *_adaptorClassName;
|
||||
float _version;
|
||||
NSDictionary *_connectionDictionary;
|
||||
NSDictionary *_userInfo;
|
||||
NSDictionary * _internalInfo;
|
||||
NSString *_docComment;
|
||||
void *_entitiesByClass;
|
||||
|
||||
/* Garbage collectable objects */
|
||||
EOModelGroup *_group;
|
||||
|
||||
GCArray *_entities;
|
||||
GCMutableDictionary *_entitiesByName;
|
||||
GCMutableArray *_storedProcedures;
|
||||
GCMutableDictionary *_subEntitiesCache;
|
||||
//GCMutableDictionary *_prototypesByName;
|
||||
struct
|
||||
{
|
||||
BOOL createsMutableObjects:1;
|
||||
BOOL errors:1;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
+ (EOModel *)model;
|
||||
|
||||
/** Getting the filename **/
|
||||
- (NSString*)path;
|
||||
|
||||
/** Getting the name **/
|
||||
- (NSString *)name;
|
||||
- (NSString *)adaptorName;
|
||||
- (NSString *)adaptorClassName;
|
||||
|
||||
- (float)version;
|
||||
+ (float)version;
|
||||
|
||||
/** Using entities **/
|
||||
- (EOEntity *)entityNamed: (NSString*)name;
|
||||
- (NSArray *)entities;
|
||||
- (NSArray *)entityNames;
|
||||
|
||||
- (NSArray *)storedProcedureNames;
|
||||
- (EOStoredProcedure *)storedProcedureNamed: (NSString *)name;
|
||||
- (NSArray *)storedProcedures;
|
||||
|
||||
/** Getting an object's entity **/
|
||||
- (EOEntity *)entityForObject: object;
|
||||
|
||||
/** Accessing the connection dictionary **/
|
||||
- (NSDictionary *)connectionDictionary;
|
||||
|
||||
/** Accessing the user dictionary **/
|
||||
- (NSDictionary *)userInfo;
|
||||
|
||||
/** Accessing documentation comments **/
|
||||
- (NSString*)docComment;
|
||||
|
||||
- (EOModelGroup *)modelGroup;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOModel (EOModelFileAccess)
|
||||
|
||||
+ (EOModel *)modelWithContentsOfFile: (NSString *)path;
|
||||
- initWithContentsOfFile: (NSString *)path;
|
||||
- (void)writeToFile: (NSString *)path;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOModel (EOModelPropertyList) <EOPropertyListEncoding>
|
||||
|
||||
- (id) initWithTableOfContentsPropertyList: (NSDictionary *)tableOfContents
|
||||
path: (NSString *)path;
|
||||
- (void)encodeTableOfContentsInfoPropertyList: (NSMutableDictionary *)propertyList;
|
||||
|
||||
- (void)encodeIntoPropertyList: (NSMutableDictionary *)propertyList;
|
||||
- (void)awakeWithPropertyList: (NSDictionary *)propertyList;
|
||||
- (id)initWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner;
|
||||
@end
|
||||
|
||||
@interface EOModel (EOModelHidden)
|
||||
|
||||
- (void)_resetPrototypeCache;
|
||||
- (BOOL)isPrototypesEntity: (id)param0;
|
||||
- (void)_classDescriptionNeeded: (id)param0;
|
||||
- (id)_instantiatedEntities;
|
||||
- (void)_setPath: (NSString *)path;
|
||||
- (id)_entityForClass: (Class)param0;
|
||||
- (id)_childrenForEntityNamed: (id)param0;
|
||||
- (void)_registerChild: (id)param0
|
||||
forParent: (id)param1;
|
||||
- (void)_setInheritanceLinks: (id)param0;
|
||||
- (void)_removeEntity: (id)param0;
|
||||
- (id)_addEntityWithPropertyList: (NSDictionary *)propertyList;
|
||||
- (void)_addFakeEntityWithPropertyList: (NSDictionary *)propertyList;
|
||||
- (id)_addEntity: (EOEntity *)entity;
|
||||
- (void)_setEntity: (id)entity
|
||||
forEntityName: (NSString *)entityName
|
||||
className: (NSString *)className;
|
||||
@end
|
||||
|
||||
@interface EOModel (EOModelEditing)
|
||||
|
||||
/* Accessing the adaptor bundle */
|
||||
- (void)setName: (NSString *)name;
|
||||
- (void)setAdaptorName: (NSString *)adaptorName;
|
||||
|
||||
- (void)setConnectionDictionary: (NSDictionary *)connectionDictionary;
|
||||
- (void)setUserInfo: (NSDictionary *)dictionary;
|
||||
|
||||
- (void)addEntity: (EOEntity *)entity;
|
||||
- (void)removeEntity: (EOEntity *)entity;
|
||||
- (void)removeEntityAndReferences: (EOEntity *)entity;
|
||||
|
||||
- (void)addStoredProcedure: (EOStoredProcedure *)storedProcedure;
|
||||
- (void)removeStoredProcedure: (EOStoredProcedure *)storedProcedure;
|
||||
|
||||
- (void)setModelGroup: (EOModelGroup *)group;
|
||||
- (void)loadAllModelObjects;
|
||||
|
||||
/* Checking references */
|
||||
- (NSArray *)referencesToProperty: property;
|
||||
- (NSArray *)externalModelsReferenced;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOModel (EOModelBeautifier)
|
||||
|
||||
- (void)beautifyNames;
|
||||
|
||||
@end
|
||||
|
||||
extern NSString *EOEntityLoadedNotification;
|
||||
|
||||
@interface EOModel (EOModelPrivate)
|
||||
|
||||
- (void)setCreateMutableObjects: (BOOL)flag;
|
||||
- (BOOL)createsMutableObjects;
|
||||
- (EOEntity *)_verifyBuiltEntityObject: (id)entity
|
||||
named: (NSString *)name;
|
||||
|
||||
@end /* EOModel (EOModelPrivate) */
|
||||
|
||||
#endif /* __EOModel_h__ */
|
1608
EOAccess/EOModel.m
Normal file
1608
EOAccess/EOModel.m
Normal file
File diff suppressed because it is too large
Load diff
137
EOAccess/EOModelGroup.h
Normal file
137
EOAccess/EOModelGroup.h
Normal file
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
EOModelGroup.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOModelGroup_h__
|
||||
#define __EOModelGroup_h__
|
||||
|
||||
#import <extensions/GCObject.h>
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
|
||||
@class EOModel;
|
||||
@class EOEntity;
|
||||
@class EORelationship;
|
||||
@class EOGlobalID;
|
||||
@class EOAttribute;
|
||||
|
||||
@class EOStoredProcedure;
|
||||
@interface EOModelGroup : GCObject
|
||||
{
|
||||
NSMutableDictionary *_modelsByName;
|
||||
id _delegate;
|
||||
|
||||
struct {
|
||||
unsigned int entityNamed:1;
|
||||
unsigned int relationshipForRow:1;
|
||||
unsigned int subEntityForEntity:1;
|
||||
unsigned int failedToLookupClassNamed:1;
|
||||
unsigned int classForObjectWithGlobalID:1;
|
||||
unsigned int _RESERVED:27;
|
||||
} _delegateRespondsTo;
|
||||
}
|
||||
|
||||
+ (EOModelGroup *)defaultGroup;
|
||||
+ (void)setDefaultGroup: (EOModelGroup *)group;
|
||||
|
||||
+ (EOModelGroup *)globalModelGroup;
|
||||
|
||||
+ (void)setDelegate: (id)delegate;
|
||||
+ (id)delegate;
|
||||
|
||||
- (NSArray *)models;
|
||||
|
||||
- (NSArray *)modelNames;
|
||||
|
||||
- (EOModel *)modelNamed: (NSString *)name;
|
||||
|
||||
- (EOModel *)modelWithPath: (NSString *)path;
|
||||
|
||||
- (void)addModel: (EOModel *)model;
|
||||
|
||||
- (EOModel*)addModelWithFile: (NSString *)path;
|
||||
|
||||
- (void)removeModel: (EOModel *)model;
|
||||
|
||||
- (EOEntity *)entityNamed: (NSString *)entityName;
|
||||
|
||||
- (NSArray *)availablePrototypesForAdaptorName: (NSString *)adaptorName;
|
||||
- (EOAttribute *)prototypeAttributeForAttribute: (EOAttribute *)attribute;
|
||||
|
||||
- (EOEntity *)entityForObject: (id)object;
|
||||
|
||||
- (void)loadAllModelObjects;
|
||||
|
||||
- (id)delegate;
|
||||
- (void)setDelegate: (id)delegate;
|
||||
- (EOFetchSpecification *)fetchSpecificationNamed: (NSString *)fetchSpecName
|
||||
entityNamed: (NSString *)entityName;
|
||||
|
||||
- (EOStoredProcedure *)storedProcedureNamed: (NSString *)aName;
|
||||
|
||||
@end
|
||||
|
||||
// Notifications:
|
||||
extern NSString *EOModelAddedNotification;
|
||||
extern NSString *EOModelInvalidatedNotification;
|
||||
|
||||
|
||||
@interface NSObject (EOModelGroupClassDelegation)
|
||||
|
||||
- (EOModelGroup *)defaultModelGroup;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (EOModelGroupDelegation)
|
||||
|
||||
- (EOModel *)modelGroup: (EOModelGroup *)group entityNamed: (NSString *)name;
|
||||
|
||||
- (EORelationship *)entity: (EOEntity *)entity
|
||||
relationshipForRow: (NSDictionary *)row
|
||||
relationship: (EORelationship *)relationship;
|
||||
|
||||
- (EOEntity *)subEntityForEntity: (EOEntity *)entity
|
||||
primaryKey: (NSDictionary *)primaryKey
|
||||
isFinal: (BOOL *)flag;
|
||||
|
||||
- (Class)entity: (EOEntity *)entity
|
||||
failedToLookupClassNamed: (NSString *)className;
|
||||
|
||||
- (Class)entity: (EOEntity *)entity
|
||||
classForObjectWithGlobalID: (EOGlobalID *)globalID;
|
||||
|
||||
- (EOEntity *)relationship: (EORelationship *)relationship
|
||||
failedToLookupDestinationNamed: (NSString *)entityName;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOObjectStoreCoordinator (EOModelGroupSupport)
|
||||
|
||||
- (void)setModelGroup: (EOModelGroup *)group;
|
||||
- (EOModelGroup *)modelGroup;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
403
EOAccess/EOModelGroup.m
Normal file
403
EOAccess/EOModelGroup.m
Normal file
|
@ -0,0 +1,403 @@
|
|||
/**
|
||||
EOModelGroup.m <title>EOModelGroup Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSNotification.h>
|
||||
|
||||
#import <EOAccess/EOModelGroup.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOStoredProcedure.h>
|
||||
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
@implementation EOModelGroup
|
||||
|
||||
|
||||
NSString *EOModelAddedNotification = @"EOModelAddedNotification";
|
||||
NSString *EOModelInvalidatedNotification = @"EOModelInvalidatedNotification";
|
||||
|
||||
|
||||
static id classDelegate = nil;
|
||||
static int delegateDefaultModelGroup = 0;
|
||||
static EOModelGroup *defaultModelGroup = nil;
|
||||
|
||||
|
||||
+ (EOModelGroup *)defaultGroup
|
||||
{
|
||||
EOModelGroup *modelGroup = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if (defaultModelGroup)
|
||||
modelGroup = defaultModelGroup;
|
||||
else if (delegateDefaultModelGroup)
|
||||
modelGroup = [classDelegate defaultModelGroup];
|
||||
else
|
||||
modelGroup = [EOModelGroup globalModelGroup];
|
||||
|
||||
if (!modelGroup)
|
||||
{
|
||||
NSLog(@"WARNING: No default Group");
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return modelGroup;
|
||||
}
|
||||
|
||||
+ (void)setDefaultGroup: (EOModelGroup *)group
|
||||
{
|
||||
if (group != defaultModelGroup)
|
||||
{
|
||||
if (defaultModelGroup)
|
||||
DESTROY(defaultModelGroup);
|
||||
|
||||
if (delegateDefaultModelGroup)
|
||||
group = [classDelegate defaultModelGroup];
|
||||
|
||||
ASSIGN(defaultModelGroup, group);
|
||||
}
|
||||
}
|
||||
|
||||
+ (EOModelGroup *)globalModelGroup
|
||||
{
|
||||
NSMutableArray *bundles = [NSMutableArray arrayWithCapacity: 2];
|
||||
NSBundle *bundle = nil;
|
||||
NSArray *paths = nil;
|
||||
NSEnumerator *pathsEnum = nil;
|
||||
NSEnumerator *bundleEnum = nil;
|
||||
EOModelGroup *group;
|
||||
NSString *path = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
group = [EOModelGroup new];
|
||||
|
||||
[bundles addObjectsFromArray: [NSBundle allBundles]];
|
||||
[bundles addObjectsFromArray: [NSBundle allFrameworks]];
|
||||
|
||||
bundleEnum = [bundles objectEnumerator];
|
||||
while ((bundle = [bundleEnum nextObject]))
|
||||
{
|
||||
paths = [bundle pathsForResourcesOfType: @"eomodeld"
|
||||
inDirectory: nil];
|
||||
|
||||
if (!paths)
|
||||
{
|
||||
NSLog(@"WARNING: paths for resource of type eomodeld in bundle %@",bundle);
|
||||
}
|
||||
|
||||
pathsEnum = [paths objectEnumerator];
|
||||
while ((path = [pathsEnum nextObject]))
|
||||
{
|
||||
NSLog(@"%@", path);
|
||||
[group addModelWithFile: [path stringByDeletingPathExtension]];
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return [group autorelease]; // TODO release problem with EOModel
|
||||
}
|
||||
|
||||
/** returns a model group composed of all models in the resource directory
|
||||
of the mainBundle, and all bundles and frameworks loaded into the app.
|
||||
**/
|
||||
|
||||
+ (void)setDelegate: (id)delegate
|
||||
{
|
||||
classDelegate = delegate;
|
||||
|
||||
delegateDefaultModelGroup = [delegate respondsToSelector:
|
||||
@selector(defaultModelGroup)];
|
||||
}
|
||||
|
||||
+ (id)delegate
|
||||
{
|
||||
return classDelegate;
|
||||
}
|
||||
|
||||
|
||||
- init
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
_modelsByName = [NSMutableDictionary new];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_modelsByName);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCountOfContainedObjects
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects
|
||||
{
|
||||
if (![super gcIncrementRefCountOfContainedObjects])
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSArray *)models
|
||||
{
|
||||
return [_modelsByName allValues];
|
||||
}
|
||||
|
||||
- (NSArray *)modelNames
|
||||
{
|
||||
return [_modelsByName allKeys];
|
||||
}
|
||||
|
||||
- (EOModel *)modelNamed: (NSString *)name
|
||||
{
|
||||
return [_modelsByName objectForKey: name];
|
||||
}
|
||||
|
||||
- (EOModel *)modelWithPath: (NSString *)path
|
||||
{
|
||||
NSEnumerator *modelEnum;
|
||||
EOModel *model;
|
||||
|
||||
modelEnum = [_modelsByName objectEnumerator];
|
||||
while ((model = [modelEnum nextObject]))
|
||||
if ([[path stringByStandardizingPath]
|
||||
isEqual: [[model path] stringByStandardizingPath]] == YES)
|
||||
return model;
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)addModel: (EOModel *)model
|
||||
{
|
||||
//OK
|
||||
//call model entityNames
|
||||
NSString *modelName;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"model=%p", model);
|
||||
|
||||
modelName = [model name];
|
||||
[model setModelGroup: self];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"model=%p name=%@", model, modelName);
|
||||
|
||||
if (!modelName)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: [NSString stringWithFormat:
|
||||
@"The model name is emtpy"]];
|
||||
}
|
||||
|
||||
NSAssert1(modelName, @"No name for model %@", model);
|
||||
|
||||
if ([_modelsByName objectForKey: modelName])
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: [NSString stringWithFormat: @"The modelname '%@' already exists in modelGroup",
|
||||
modelName]];
|
||||
}
|
||||
|
||||
[_modelsByName setObject: model
|
||||
forKey: modelName];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"Notification for model:%p", model);
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOModelAddedNotification
|
||||
object: model];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (EOModel *)addModelWithFile: (NSString *)path
|
||||
{
|
||||
EOModel *model;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
model = [EOModel modelWithContentsOfFile: path];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"model=%p", model);
|
||||
|
||||
if (model)
|
||||
[self addModel: model];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return model;
|
||||
}
|
||||
|
||||
- (void)removeModel: (EOModel *)model
|
||||
{
|
||||
[_modelsByName removeObjectForKey: [model name]];
|
||||
[model setModelGroup: nil];
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
postNotificationName: EOModelInvalidatedNotification
|
||||
object: model];
|
||||
}
|
||||
|
||||
- (EOEntity *)entityNamed: (NSString *)entityName
|
||||
{
|
||||
NSEnumerator *modelEnum;
|
||||
EOModel *model;
|
||||
EOEntity *entity;
|
||||
|
||||
modelEnum = [_modelsByName objectEnumerator];
|
||||
while ((model = [modelEnum nextObject]))
|
||||
if ((entity = [model entityNamed: entityName]))
|
||||
return entity;
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOEntity *)entityForObject: (id)object
|
||||
{
|
||||
NSEnumerator *modelEnum;
|
||||
EOModel *model;
|
||||
EOEntity *entity;
|
||||
|
||||
modelEnum = [_modelsByName objectEnumerator];
|
||||
while ((model = [modelEnum nextObject]))
|
||||
if ((entity = [model entityForObject: object]))
|
||||
return entity;
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *)availablePrototypesForAdaptorName: (NSString *)adaptorName
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOAttribute *)prototypeAttributeForAttribute: (EOAttribute *)attribute
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)loadAllModelObjects
|
||||
{
|
||||
NSEnumerator *modelEnum;
|
||||
EOModel *model;
|
||||
|
||||
modelEnum = [_modelsByName objectEnumerator];
|
||||
while ((model = [modelEnum nextObject]))
|
||||
[model loadAllModelObjects];
|
||||
}
|
||||
|
||||
- (id)delegate
|
||||
{
|
||||
return _delegate;
|
||||
}
|
||||
|
||||
- (void)setDelegate: (id)delegate
|
||||
{
|
||||
EOFLOGObjectFnStartOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
ASSIGN(_delegate, delegate);
|
||||
|
||||
_delegateRespondsTo.entityNamed =
|
||||
[_delegate respondsToSelector: @selector(modelGroup:entityNamed:)];
|
||||
_delegateRespondsTo.failedToLookupClassNamed =
|
||||
[_delegate respondsToSelector: @selector(entity:failedToLookupClassNamed:)];
|
||||
_delegateRespondsTo.classForObjectWithGlobalID =
|
||||
[_delegate respondsToSelector: @selector(entity:classForObjectWithGlobalID:)];
|
||||
_delegateRespondsTo.subEntityForEntity =
|
||||
[_delegate respondsToSelector: @selector(subEntityForEntity:primaryKey:isFinal:)];
|
||||
_delegateRespondsTo.relationshipForRow =
|
||||
[_delegate respondsToSelector: @selector(entity:relationshipForRow:relationship:)];
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
}
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationNamed: (NSString *)fetchSpecName
|
||||
entityNamed: (NSString *)entityName
|
||||
{
|
||||
EOFetchSpecification *newFetchSpecification = nil;
|
||||
EOEntity *anEntity;
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
if (fetchSpecName
|
||||
&& entityName && (anEntity = [self entityNamed: entityName]))
|
||||
{
|
||||
newFetchSpecification = [anEntity fetchSpecificationNamed: fetchSpecName];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
return newFetchSpecification;
|
||||
}
|
||||
|
||||
- (EOStoredProcedure *)storedProcedureNamed: (NSString *)aName
|
||||
{
|
||||
EOStoredProcedure *newStoredProcedure = nil;
|
||||
NSEnumerator *modelEnum;
|
||||
EOModel *model;
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
modelEnum = [_modelsByName objectEnumerator];
|
||||
while ((model = [modelEnum nextObject]))
|
||||
{
|
||||
if ((newStoredProcedure = [model storedProcedureNamed: aName]))
|
||||
{
|
||||
EOFLOGObjectFnStopOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
return newStoredProcedure;
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"ModelingClasses", @"EOModelGroup");
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
43
EOAccess/EOPropertyListEncoding.h
Normal file
43
EOAccess/EOPropertyListEncoding.h
Normal file
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
EOPropertyListEncoding.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOPropertyListEncoding_h__
|
||||
#define __EOPropertyListEncoding_h__
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
|
||||
|
||||
@protocol EOPropertyListEncoding
|
||||
|
||||
- initWithPropertyList: (NSDictionary *)propertyList owner: (id)owner;
|
||||
|
||||
- (void)awakeWithPropertyList: (NSDictionary *)propertyList;
|
||||
|
||||
- (void)encodeIntoPropertyList: (NSMutableDictionary *)propertyList;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOPropertyListEncoding_h__ */
|
231
EOAccess/EORelationship.h
Normal file
231
EOAccess/EORelationship.h
Normal file
|
@ -0,0 +1,231 @@
|
|||
/*
|
||||
EORelationship.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EORelationship_h__
|
||||
#define __EORelationship_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <extensions/GCObject.h>
|
||||
#import <extensions/GCArray.h>
|
||||
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <EOAccess/EOJoin.h>
|
||||
#import <EOAccess/EOPropertyListEncoding.h>
|
||||
|
||||
|
||||
@class EOEntity;
|
||||
@class EOAttribute;
|
||||
@class EOExpressionArray;
|
||||
@class EOMKKDSubsetMapping;
|
||||
|
||||
typedef enum {
|
||||
EOInnerJoin = 0,
|
||||
EOFullOuterJoin,
|
||||
EOLeftOuterJoin,
|
||||
EORightOuterJoin
|
||||
} EOJoinSemantic;
|
||||
|
||||
|
||||
@interface EORelationship : GCObject <EOPropertyListEncoding>
|
||||
{
|
||||
NSString *_name;
|
||||
EOQualifier *_qualifier;
|
||||
NSMutableDictionary *_sourceNames;
|
||||
NSMutableDictionary *_destinationNames;
|
||||
NSDictionary *_userInfo;
|
||||
NSDictionary *_internalInfo;
|
||||
NSString *_docComment;
|
||||
NSDictionary *_sourceToDestinationKeyMap;
|
||||
unsigned int _batchCount;
|
||||
EOJoinSemantic _joinSemantic;
|
||||
|
||||
struct {
|
||||
unsigned int isToMany:1;
|
||||
unsigned int useBatchFaulting:1;
|
||||
unsigned int deleteRule:2;
|
||||
unsigned int isMandatory:1;
|
||||
unsigned int ownsDestination:1;
|
||||
unsigned int propagatesPrimaryKey:1;
|
||||
unsigned int createsMutableObjects:1;
|
||||
unsigned int isBidirectional:1;
|
||||
unsigned int extraRefCount:23;
|
||||
} _flags;
|
||||
id _sourceRowToForeignKeyMapping;
|
||||
|
||||
/* Garbage collectable objects */
|
||||
EOExpressionArray *_definitionArray;
|
||||
|
||||
EORelationship *_inverseRelationship;
|
||||
EORelationship *_hiddenInverseRelationship;
|
||||
|
||||
EOEntity *_entity;
|
||||
EOEntity *_destination;
|
||||
GCMutableArray *_joins;
|
||||
|
||||
/* Computed values */
|
||||
GCArray *_sourceAttributes;
|
||||
GCArray *_destinationAttributes;
|
||||
GCMutableArray *_componentRelationships;//Used ????
|
||||
}
|
||||
|
||||
+ (id) relationshipWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner;
|
||||
|
||||
- (NSString *)name;
|
||||
|
||||
- (EOEntity *)entity;
|
||||
|
||||
- (EOEntity *)destinationEntity;
|
||||
|
||||
- (NSString *)definition;
|
||||
|
||||
- (BOOL)isFlattened;
|
||||
|
||||
- (BOOL)isToMany;
|
||||
|
||||
- (BOOL)isCompound;
|
||||
|
||||
- (BOOL) isParentRelationship;
|
||||
|
||||
- (NSArray *)sourceAttributes;
|
||||
|
||||
- (NSArray *)destinationAttributes;
|
||||
|
||||
- (NSArray *)joins;
|
||||
|
||||
- (EOJoinSemantic)joinSemantic;
|
||||
- (NSString*)joinSemanticString;
|
||||
|
||||
- (NSArray *)componentRelationships;
|
||||
|
||||
- (NSDictionary *)userInfo;
|
||||
|
||||
- (BOOL)referencesProperty: (id)property;
|
||||
|
||||
- (EODeleteRule)deleteRule;
|
||||
|
||||
- (BOOL)isMandatory;
|
||||
|
||||
- (BOOL)propagatesPrimaryKey;
|
||||
|
||||
- (BOOL)isBidirectional;
|
||||
|
||||
- (EORelationship *)hiddenInverseRelationship;
|
||||
- (EORelationship *)inverseRelationship;
|
||||
|
||||
- (EORelationship *)anyInverseRelationship;
|
||||
|
||||
- (unsigned int)numberOfToManyFaultsToBatchFetch;
|
||||
|
||||
- (BOOL)ownsDestination;
|
||||
- (EOQualifier *)qualifierWithSourceRow: (NSDictionary *)sourceRow;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EORelationship(EORelationshipEditing)
|
||||
- (NSException *)validateName: (NSString *)name;
|
||||
- (void)setName: (NSString *)name;
|
||||
- (void)setDefinition: (NSString *)definition;
|
||||
- (void)setEntity: (EOEntity *)entity;
|
||||
- (void)setToMany: (BOOL)yn;
|
||||
- (void)setPropagatesPrimaryKey: (BOOL)yn;
|
||||
- (void)setIsBidirectional:(BOOL)yn;
|
||||
- (void)setOwnsDestination: (BOOL)yn;
|
||||
- (void)addJoin: (EOJoin *)join;
|
||||
- (void)removeJoin: (EOJoin *)join;
|
||||
- (void)setJoinSemantic: (EOJoinSemantic)joinSemantic;
|
||||
- (void)setUserInfo: (NSDictionary *)dictionary;
|
||||
- (void)setInternalInfo: (NSDictionary *)dictionary;
|
||||
- (void)beautifyName;
|
||||
- (void)setNumberOfToManyFaultsToBatchFetch: (unsigned int)size;
|
||||
- (void)setDeleteRule: (EODeleteRule)deleteRule;
|
||||
- (void)setIsMandatory: (BOOL)isMandatory;
|
||||
- (void)setDocComment: (NSString *)docComment;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EORelationship(EORelationshipValueMapping)
|
||||
|
||||
- (NSException *)validateValue: (id *)valueP;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EORelationship (EORelationshipPrivate)
|
||||
|
||||
/*+ (EORelationship*)relationshipFromPropertyList: (id)propertyList
|
||||
model: (EOModel*)model;
|
||||
- (void)replaceStringsWithObjects;
|
||||
- (void)initFlattenedRelationship;
|
||||
|
||||
- (id)propertyList;*/
|
||||
|
||||
- (void)setCreateMutableObjects: (BOOL)flag;
|
||||
- (BOOL)createsMutableObjects;
|
||||
- (void)setInverseRelationship: (EORelationship*)relationship;
|
||||
@end /* EORelationship (EORelationshipPrivate) */
|
||||
|
||||
@interface EORelationship (EORelationshipXX)
|
||||
|
||||
- (NSArray*) _intermediateAttributes;
|
||||
- (EORelationship*) lastRelationship;
|
||||
- (EORelationship*) firstRelationship;
|
||||
- (id) intermediateEntity;
|
||||
- (BOOL) isMultiHop;
|
||||
- (void) _setSourceToDestinationKeyMap: (id)param0;
|
||||
- (id) qualifierForDBSnapshot: (id)param0;
|
||||
- (id) primaryKeyForTargetRowFromSourceDBSnapshot: (id)param0;
|
||||
- (NSString*)relationshipPath;
|
||||
- (BOOL)isToManyToOne;
|
||||
- (NSDictionary*)_sourceToDestinationKeyMap;
|
||||
- (BOOL)foreignKeyInDestination;
|
||||
@end
|
||||
|
||||
@interface EORelationship (EORelationshipPrivate2)
|
||||
- (BOOL) isPropagatesPrimaryKeyPossible;
|
||||
- (id) qualifierOmittingAuxiliaryQualifierWithSourceRow: (id)param0;
|
||||
- (id) auxiliaryQualifier;
|
||||
- (void) setAuxiliaryQualifier: (id)param0;
|
||||
- (id) _foreignKeyForSourceRow: (NSDictionary*)row;
|
||||
- (EOMKKDSubsetMapping*) _sourceRowToForeignKeyMapping;
|
||||
- (NSArray*) _sourceAttributeNames;
|
||||
- (EOJoin*) joinForAttribute: (EOAttribute*)attribute;
|
||||
- (void) _flushCache;
|
||||
- (EOExpressionArray*) _definitionArray;
|
||||
- (NSString*) _stringFromDeleteRule: (EODeleteRule)deleteRule;
|
||||
- (EODeleteRule) _deleteRuleFromString: (NSString*)deleteRuleString;
|
||||
- (NSDictionary*) _rightSideKeyMap;
|
||||
- (NSDictionary*) _leftSideKeyMap;
|
||||
- (EORelationship*)_substitutionRelationshipForRow: (NSDictionary*)row;
|
||||
- (void) _joinsChanged;
|
||||
@end
|
||||
|
||||
#endif /* __EORelationship_h__ */
|
2370
EOAccess/EORelationship.m
Normal file
2370
EOAccess/EORelationship.m
Normal file
File diff suppressed because it is too large
Load diff
229
EOAccess/EOSQLExpression.h
Normal file
229
EOAccess/EOSQLExpression.h
Normal file
|
@ -0,0 +1,229 @@
|
|||
/*
|
||||
EOSQLExpression.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOSQLExpression_h__
|
||||
#define __EOSQLExpression_h__
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
#import <EOControl/EOSortOrdering.h>
|
||||
|
||||
#import <EOAccess/EORelationship.h>
|
||||
|
||||
@class EOAttribute;
|
||||
@class EOEntity;
|
||||
@class EOQualifier;
|
||||
|
||||
|
||||
extern NSString *EOBindVariableNameKey;
|
||||
extern NSString *EOBindVariableAttributeKey;
|
||||
extern NSString *EOBindVariableValueKey;
|
||||
extern NSString *EOBindVariablePlaceHolderKey;
|
||||
extern NSString *EOBindVariableColumnKey;
|
||||
|
||||
|
||||
@interface EOSQLExpression : NSObject
|
||||
{
|
||||
NSMutableDictionary *_aliasesByRelationshipPath;
|
||||
EOEntity *_entity;
|
||||
NSMutableString *_listString;
|
||||
NSMutableString *_valueListString;
|
||||
NSString *_whereClauseString;
|
||||
NSMutableString *_joinClauseString;
|
||||
NSMutableString *_orderByString;
|
||||
NSMutableArray *_bindings;
|
||||
NSMutableArray *_contextStack;
|
||||
NSString *_statement;
|
||||
BOOL _useAliases;
|
||||
@private
|
||||
int _alias;
|
||||
}
|
||||
|
||||
+ (EOSQLExpression *)expressionForString: (NSString *)string;
|
||||
|
||||
+ (EOSQLExpression *)insertStatementForRow: (NSDictionary *)row
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
+ (EOSQLExpression *)updateStatementForRow: (NSDictionary *)row
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
+ (EOSQLExpression *)deleteStatementWithQualifier: (EOQualifier *)qualifier
|
||||
entity: entity;
|
||||
|
||||
+ (EOSQLExpression *)selectStatementForAttributes: (NSArray *)attributes
|
||||
lock: (BOOL)yn
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
entity: (EOEntity *)entity;
|
||||
|
||||
- initWithEntity: (EOEntity *)entity;
|
||||
|
||||
- (NSMutableDictionary *)aliasesByRelationshipPath;
|
||||
- (EOEntity *)entity;
|
||||
|
||||
- (NSMutableString *)listString;
|
||||
- (NSMutableString *)valueList;
|
||||
- (NSMutableString *)joinClauseString;
|
||||
- (NSMutableString *)orderByString;
|
||||
- (NSString *)whereClauseString;
|
||||
- (NSString *)statement;
|
||||
- (void)setStatement:(NSString *)statement;
|
||||
- (NSString *)lockClause;
|
||||
|
||||
- (NSString *)tableListWithRootEntity: (EOEntity *)entity;
|
||||
|
||||
|
||||
- (void)prepareInsertExpressionWithRow: (NSDictionary *)row;
|
||||
|
||||
- (void)prepareUpdateExpressionWithRow: (NSDictionary *)row
|
||||
qualifier: (EOQualifier *)qualifier;
|
||||
|
||||
- (void)prepareDeleteExpressionForQualifier: (EOQualifier *)qualifier;
|
||||
|
||||
- (void)prepareSelectExpressionWithAttributes: (NSArray *)attributes
|
||||
lock: (BOOL)yn
|
||||
fetchSpecification: (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- (NSString *)assembleJoinClauseWithLeftName: (NSString *)leftName
|
||||
rightName: (NSString *)rightName
|
||||
joinSemantic: (EOJoinSemantic)semantic;
|
||||
|
||||
- (void)addJoinClauseWithLeftName: (NSString *)leftName
|
||||
rightName: (NSString *)rightName
|
||||
joinSemantic: (EOJoinSemantic)semantic;
|
||||
|
||||
- (void)joinExpression;
|
||||
|
||||
- (NSString *)assembleInsertStatementWithRow: (NSDictionary *)row
|
||||
tableList: (NSString *)tableList
|
||||
columnList: (NSString *)columnList
|
||||
valueList: (NSString *)valueList;
|
||||
|
||||
- (NSString *)assembleUpdateStatementWithRow: (NSDictionary *)row
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
tableList: (NSString *)tableList
|
||||
updateList: (NSString *)updateList
|
||||
whereClause: (NSString *)whereClause;
|
||||
|
||||
- (NSString *)assembleDeleteStatementWithQualifier: (EOQualifier *)qualifier
|
||||
tableList: (NSString *)tableList
|
||||
whereClause: (NSString *)whereClause;
|
||||
|
||||
- (NSString *)assembleSelectStatementWithAttributes: (NSArray *)attributes
|
||||
lock: (BOOL)lock
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
fetchOrder: (NSArray *)fetchOrder
|
||||
selectString: (NSString *)selectString
|
||||
columnList: (NSString *)columnList
|
||||
tableList: (NSString *)tableList
|
||||
whereClause: (NSString *)whereClause
|
||||
joinClause: (NSString *)joinClause
|
||||
orderByClause: (NSString *)orderByClause
|
||||
lockClause: (NSString *)lockClause;
|
||||
|
||||
- (void)addSelectListAttribute: (EOAttribute *)attribute;
|
||||
|
||||
- (void)addInsertListAttribute: (EOAttribute *)attribute
|
||||
value: (NSString *)value;
|
||||
|
||||
- (void)addUpdateListAttribute: (EOAttribute *)attribute
|
||||
value: (NSString *)value;
|
||||
|
||||
+ (NSString *)formatStringValue: (NSString *)string;
|
||||
|
||||
+ (NSString *)formatValue: (id)value forAttribute: (EOAttribute *)attribute;
|
||||
|
||||
+ (NSString *)formatSQLString: (NSString *)sqlString
|
||||
format: (NSString *)format;
|
||||
|
||||
- (NSString *)sqlStringForConjoinedQualifiers: (NSArray *)qualifiers;
|
||||
- (NSString *)sqlStringForDisjoinedQualifiers: (NSArray *)qualifiers;
|
||||
- (NSString *)sqlStringForNegatedQualifier: (EOQualifier *)qualifier;
|
||||
- (NSString *)sqlStringForKeyValueQualifier: (EOKeyValueQualifier *)qualifier;
|
||||
- (NSString *)sqlStringForKeyComparisonQualifier: (EOKeyComparisonQualifier *)qualifier;
|
||||
- (NSString *)sqlStringForValue: (NSString *)valueString
|
||||
caseInsensitiveLikeKey: (NSString *)keyString;
|
||||
|
||||
- (void)addOrderByAttributeOrdering: (EOSortOrdering *)sortOrdering;
|
||||
|
||||
+ (BOOL)useQuotedExternalNames;
|
||||
+ (void)setUseQuotedExternalNames: (BOOL)yn;
|
||||
- (NSString *)externalNameQuoteCharacter;
|
||||
|
||||
- (void)setUseAliases: (BOOL)useAliases;
|
||||
- (BOOL)useAliases;
|
||||
|
||||
- (NSString *)sqlStringForSchemaObjectName: (NSString *)name;
|
||||
|
||||
- (NSString *)sqlStringForAttributeNamed: (NSString *)name;
|
||||
|
||||
- (NSString *)sqlStringForSelector: (SEL)selector value: (id)value;
|
||||
|
||||
- (NSString *)sqlStringForValue: (id)value attributeNamed: (NSString *)string;
|
||||
|
||||
- (NSString *)sqlStringForAttribute: (EOAttribute *)anAttribute;
|
||||
|
||||
- (NSString *)sqlStringForAttributePath: (NSArray *)path;
|
||||
|
||||
- (void)appendItem: (NSString *)itemString
|
||||
toListString: (NSMutableString *)listString;
|
||||
|
||||
+ (NSString *)sqlPatternFromShellPattern: (NSString *)pattern;
|
||||
+ (NSString *)sqlPatternFromShellPattern: (NSString *)pattern
|
||||
withEscapeCharacter: (unichar)escapeCharacter;
|
||||
|
||||
|
||||
- (NSMutableDictionary *)bindVariableDictionaryForAttribute: (EOAttribute *)attribute
|
||||
value: value;
|
||||
|
||||
- (BOOL)shouldUseBindVariableForAttribute: (EOAttribute *)att;
|
||||
|
||||
- (BOOL)mustUseBindVariableForAttribute: (EOAttribute *)att;
|
||||
|
||||
+ (BOOL)useBindVariables;
|
||||
+ (void)setUseBindVariables: (BOOL)yn;
|
||||
|
||||
- (NSArray *)bindVariableDictionaries;
|
||||
|
||||
- (void)addBindVariableDictionary: (NSMutableDictionary *)binding;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSString (EOSQLFormatting)
|
||||
|
||||
- (NSString *)sqlString;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSNumber (EOSQLFormatting)
|
||||
|
||||
- (NSString *)sqlString;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOSQLExpression_h__ */
|
2878
EOAccess/EOSQLExpression.m
Normal file
2878
EOAccess/EOSQLExpression.m
Normal file
File diff suppressed because it is too large
Load diff
48
EOAccess/EOSQLExpressionPriv.h
Normal file
48
EOAccess/EOSQLExpressionPriv.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
EOSQLExpression.h
|
||||
|
||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: Mars 2002
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOSQLExpressionPriv_h__
|
||||
#define __EOSQLExpressionPriv_h__
|
||||
|
||||
@class EOEntity;
|
||||
|
||||
|
||||
@interface EOSQLExpression (EOSQLExpressionPrivate)
|
||||
|
||||
- (EOEntity *)_rootEntityForExpression;
|
||||
- (id) _aliasForRelationshipPath: (id)param0;
|
||||
- (id) _flattenRelPath: (id)param0
|
||||
entity: (id)param1;
|
||||
- (NSString*) _sqlStringForJoinSemantic: (EOJoinSemantic)joinSemantic
|
||||
matchSemantic: (int)param1;
|
||||
- (id) _aliasForRelatedAttribute: (id)param0
|
||||
relationshipPath: (id)param1;
|
||||
- (id) _entityForRelationshipPath: (id)param0
|
||||
origin: (id)param1;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOSQLExpressionPriv_h__ */
|
91
EOAccess/EOSQLQualifier.h
Normal file
91
EOAccess/EOSQLQualifier.h
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
EOSQLQualifier.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: February 2002
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOSQLQualifier_h__
|
||||
#define __EOSQLQualifier_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
|
||||
@class EOSQLExpression;
|
||||
@class EOExpressionArray;
|
||||
@class EOEntity;
|
||||
@class EOModel;
|
||||
|
||||
/** Protocol for all qualifiers used used to generate SQL queries **/
|
||||
@protocol EOQualifierSQLGeneration
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression;
|
||||
|
||||
/** Returns an equivalent EOQualifier with object references replaced by foreign key references. **/
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOAndQualifier (EOQualifierSQLGeneration) <EOQualifierSQLGeneration>
|
||||
@end
|
||||
@interface EOOrQualifier (EOQualifierSQLGeneration) <EOQualifierSQLGeneration>
|
||||
@end
|
||||
@interface EOKeyComparisonQualifier (EOQualifierSQLGeneration) <EOQualifierSQLGeneration>
|
||||
@end
|
||||
@interface EOKeyValueQualifier (EOQualifierSQLGeneration) <EOQualifierSQLGeneration>
|
||||
@end
|
||||
@interface EONotQualifier (EOQualifierSQLGeneration) <EOQualifierSQLGeneration>
|
||||
@end
|
||||
|
||||
|
||||
//
|
||||
// Finally, declare the EOSQLQualifier class.
|
||||
//
|
||||
@interface EOSQLQualifier : EOQualifier <EOQualifierSQLGeneration>
|
||||
{
|
||||
EOEntity *_entity;
|
||||
EOExpressionArray *_contents;
|
||||
struct
|
||||
{
|
||||
unsigned int usesDistinct:1;
|
||||
unsigned int _RESERVED:31;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
+ (EOQualifier *)qualifierWithQualifierFormat: (NSString *)format, ...;
|
||||
|
||||
- (id)initWithEntity: (EOEntity *)entity
|
||||
qualifierFormat: (NSString *)qualifierFormat, ...;
|
||||
// This is the designated initializer for EOSQLQualifier.
|
||||
|
||||
@end
|
||||
|
||||
@interface NSString (NSStringSQLExpression)
|
||||
- (NSString *) valueForSQLExpression: (EOSQLExpression *)sqlExpression;
|
||||
@end
|
||||
|
||||
#endif
|
369
EOAccess/EOSQLQualifier.m
Normal file
369
EOAccess/EOSQLQualifier.m
Normal file
|
@ -0,0 +1,369 @@
|
|||
/**
|
||||
EOSQLQualifier.m <title>EOSQLQualifier Class</title>
|
||||
|
||||
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.coù>
|
||||
Date: February 2002
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/DefaultScannerHandler.h>
|
||||
#import <extensions/PrintfFormatScanner.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EOQualifier.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
@implementation EOSQLQualifier
|
||||
|
||||
+ (EOQualifier *)qualifierWithQualifierFormat: (NSString *)format, ...
|
||||
{
|
||||
NSEmitTODO(); //TODO
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id)initWithEntity: (EOEntity *)entity
|
||||
qualifierFormat: (NSString *)qualifierFormat, ...
|
||||
{
|
||||
NSEmitTODO(); //TODO
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity:(EOEntity *)entity
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression:(EOSQLExpression *)sqlExpression
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOAndQualifier (EOQualifierSQLGeneration)
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
//OK?
|
||||
return [sqlExpression sqlStringForConjoinedQualifiers: _qualifiers];
|
||||
|
||||
/*
|
||||
//TODO finish to add sqlExpression
|
||||
NSEnumerator *qualifiersEnum=nil;
|
||||
EOQualifier *qualifier=nil;
|
||||
NSMutableString *sqlString = nil;
|
||||
|
||||
qualifiersEnum = [_qualifiers objectEnumerator];
|
||||
while ((qualifier = [qualifiersEnum nextObject]))
|
||||
{
|
||||
if (!sqlString)
|
||||
{
|
||||
sqlString = [NSMutableString stringWithString:
|
||||
[(<EOQualifierSQLGeneration>)qualifier sqlStringForSQLExpression:sqlExpression]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[sqlString appendFormat:@" %@ %@",
|
||||
@"AND",
|
||||
[(<EOQualifierSQLGeneration>)qualifier sqlStringForSQLExpression:sqlExpression]];
|
||||
}
|
||||
}
|
||||
return sqlString;
|
||||
*/
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity
|
||||
{
|
||||
int qualifierCount = [_qualifiers count];
|
||||
|
||||
if (qualifierCount > 0)
|
||||
{
|
||||
NSMutableArray *qualifiers = [NSMutableArray array];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < qualifierCount; i++)
|
||||
{
|
||||
EOQualifier *qualifier = [_qualifiers objectAtIndex: i];
|
||||
EOQualifier *schemaBasedQualifierTmp =
|
||||
[(<EOQualifierSQLGeneration>)qualifier
|
||||
schemaBasedQualifierWithRootEntity:
|
||||
entity];
|
||||
|
||||
[qualifiers addObject: schemaBasedQualifierTmp];
|
||||
}
|
||||
}
|
||||
//TODO
|
||||
/*
|
||||
call schemaBasedQualifierWithRootEntity:entity for each qualifier
|
||||
if none return something different self, return self
|
||||
[self notImplemented:_cmd];//TODO
|
||||
*/
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation EOOrQualifier (EOQualifierSQLGeneration)
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
NSEnumerator *qualifiersEnum;
|
||||
EOQualifier *qualifier;
|
||||
NSMutableString *sqlString = nil;
|
||||
|
||||
qualifiersEnum = [_qualifiers objectEnumerator];
|
||||
while ((qualifier = [qualifiersEnum nextObject]))
|
||||
{
|
||||
if (!sqlString)
|
||||
{
|
||||
sqlString = [NSMutableString stringWithString:
|
||||
[(<EOQualifierSQLGeneration>)qualifier sqlStringForSQLExpression: sqlExpression]];
|
||||
}
|
||||
else
|
||||
{
|
||||
[sqlString appendFormat: @" %@ %@",
|
||||
@"OR",
|
||||
[(<EOQualifierSQLGeneration>)qualifier sqlStringForSQLExpression: sqlExpression]];
|
||||
}
|
||||
}
|
||||
|
||||
return sqlString;
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity
|
||||
{
|
||||
/*
|
||||
call schemaBasedQualifierWithRootEntity:entity for each qualifier
|
||||
if none return something different self, return self
|
||||
[self notImplemented:_cmd];//TODO
|
||||
*/
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation EOKeyComparisonQualifier (EOQualifierSQLGeneration)
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
return [sqlExpression sqlStringForKeyComparisonQualifier: self];
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity
|
||||
{
|
||||
//TODO
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation EOKeyValueQualifier (EOQualifierSQLGeneration)
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
return [sqlExpression sqlStringForKeyValueQualifier: self];
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity
|
||||
{
|
||||
EOQualifier *qualifier = nil;
|
||||
NSMutableArray *qualifiers = nil;
|
||||
id key;
|
||||
EORelationship *relationship;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
key = [self key];
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"key=%@", key);
|
||||
|
||||
relationship = [entity relationshipForPath: key];
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"relationship=%@", relationship);
|
||||
|
||||
if (relationship)
|
||||
{
|
||||
EORelationship *destinationRelationship;
|
||||
NSDictionary *keyValues = nil;
|
||||
id value = nil;
|
||||
EOEditingContext* editingContext = nil;
|
||||
EOObjectStore *rootObjectStore = nil;
|
||||
NSMutableArray *destinationAttributeNames = [NSMutableArray array];
|
||||
NSArray *joins;
|
||||
int i, count;
|
||||
SEL sel = NULL;
|
||||
|
||||
if ([relationship isFlattened])
|
||||
destinationRelationship = [relationship lastRelationship];
|
||||
else
|
||||
destinationRelationship = relationship;
|
||||
|
||||
joins = [destinationRelationship joins];
|
||||
count = [joins count];
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
EOJoin *join = [joins objectAtIndex: i];
|
||||
EOAttribute *destinationAttribute = [join destinationAttribute];
|
||||
NSString *destinationAttributeName = [destinationAttribute name];
|
||||
|
||||
[destinationAttributeNames addObject: destinationAttributeName];
|
||||
}
|
||||
|
||||
value = [self value];
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"value=%@", value);
|
||||
|
||||
editingContext = [value editingContext];
|
||||
rootObjectStore = [editingContext rootObjectStore];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"rootObjectStore=%@",
|
||||
rootObjectStore);
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"destinationAttributeNames=%@",
|
||||
destinationAttributeNames);
|
||||
|
||||
keyValues = [(EOObjectStoreCoordinator*)rootObjectStore
|
||||
valuesForKeys:
|
||||
destinationAttributeNames
|
||||
object: value];
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"keyValues=%@", keyValues);
|
||||
|
||||
sel = [self selector];
|
||||
/*
|
||||
when flattened: ???
|
||||
entity relationshipForPath:key
|
||||
and get joins on it ?
|
||||
*/
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
EOQualifier *tmpQualifier = nil;
|
||||
NSString *attributeName = nil;
|
||||
NSString *destinationAttributeName;
|
||||
EOJoin *join = [joins objectAtIndex: i];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier",@"join=%@",join);
|
||||
|
||||
destinationAttributeName = [destinationAttributeNames
|
||||
objectAtIndex: i];
|
||||
|
||||
if (destinationRelationship != relationship)
|
||||
{
|
||||
// flattened: take destattr
|
||||
attributeName = [NSString stringWithFormat: @"%@.%@",
|
||||
key, destinationAttributeName];
|
||||
//==> rel.attr
|
||||
}
|
||||
else
|
||||
{
|
||||
EOAttribute *sourceAttribute = [join sourceAttribute];
|
||||
|
||||
attributeName = [sourceAttribute name];
|
||||
}
|
||||
|
||||
tmpQualifier = [EOKeyValueQualifier
|
||||
qualifierWithKey: attributeName
|
||||
operatorSelector: sel
|
||||
value: [keyValues objectForKey:
|
||||
destinationAttributeName]];
|
||||
|
||||
if (qualifier)//Already a qualifier
|
||||
{
|
||||
//Create an array of qualifiers
|
||||
qualifiers = [NSMutableArray arrayWithObjects: qualifier,
|
||||
tmpQualifier, nil];
|
||||
qualifier = nil;
|
||||
}
|
||||
else if (qualifiers) //Already qualifiers
|
||||
//Add this one
|
||||
[qualifiers addObject: tmpQualifier];
|
||||
else
|
||||
//No previous qualifier
|
||||
qualifier = tmpQualifier;
|
||||
}
|
||||
|
||||
if (qualifiers)
|
||||
{
|
||||
//TODOVERIFY
|
||||
qualifier = [EOAndQualifier qualifierWithQualifierArray: qualifiers];
|
||||
}
|
||||
}
|
||||
else
|
||||
qualifier = self;
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return qualifier;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation EONotQualifier (EOQualifierSQLGeneration)
|
||||
|
||||
- (NSString *)sqlStringForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
return [sqlExpression sqlStringForNegatedQualifier: self];
|
||||
}
|
||||
|
||||
- (EOQualifier *)schemaBasedQualifierWithRootEntity: (EOEntity *)entity
|
||||
{
|
||||
//TODO
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSString (NSStringSQLExpression)
|
||||
|
||||
- (NSString *) valueForSQLExpression: (EOSQLExpression *)sqlExpression
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
79
EOAccess/EOStoredProcedure.h
Normal file
79
EOAccess/EOStoredProcedure.h
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
EOStoredProcedure.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOStoredProcedure_h__
|
||||
#define __EOStoredProcedure_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <extensions/GCObject.h>
|
||||
#import <EOAccess/EOPropertyListEncoding.h>
|
||||
|
||||
@class EOModel;
|
||||
@class EOAttribute;
|
||||
@class GCArray;
|
||||
|
||||
|
||||
@interface EOStoredProcedure : GCObject <EOPropertyListEncoding>
|
||||
{
|
||||
NSString *_name;
|
||||
NSString *_externalName;
|
||||
NSDictionary *_userInfo;
|
||||
NSDictionary *_internalInfo;
|
||||
|
||||
/* Garbage collectable objects */
|
||||
EOModel *_model;
|
||||
GCArray *_arguments;
|
||||
}
|
||||
|
||||
+ (EOStoredProcedure *)storedProcedureWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner;
|
||||
|
||||
- (EOStoredProcedure *)initWithName:(NSString *)name;
|
||||
|
||||
- (NSString *)name;
|
||||
|
||||
- (NSString *)externalName;
|
||||
|
||||
- (EOModel *)model;
|
||||
|
||||
- (NSArray *)arguments;
|
||||
|
||||
- (NSDictionary *)userInfo;
|
||||
|
||||
- (void)setName:(NSString *)name;
|
||||
- (void)setExternalName:(NSString *)name;
|
||||
- (void)setArguments:(NSArray *)arguments;
|
||||
- (void)setUserInfo:(NSDictionary *)dictionary;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOStoredProcedure(EOModelBeautifier)
|
||||
|
||||
- (void)beautifyName;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
226
EOAccess/EOStoredProcedure.m
Normal file
226
EOAccess/EOStoredProcedure.m
Normal file
|
@ -0,0 +1,226 @@
|
|||
/**
|
||||
EOStoredProcedure.m <title>EOStoredProcedure Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <extensions/GCArray.h>
|
||||
|
||||
#import <EOAccess/EOStoredProcedure.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
@implementation EOStoredProcedure
|
||||
|
||||
- (EOStoredProcedure *)initWithName:(NSString *)name
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
[self setName:name];
|
||||
_userInfo = [NSDictionary new];
|
||||
_internalInfo = [NSDictionary new];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCountOfContainedObjects
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"model gcDecrementRefCount");
|
||||
|
||||
[(id)_model gcDecrementRefCount];
|
||||
[(id)_arguments gcDecrementRefCount];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects
|
||||
{
|
||||
if (![super gcIncrementRefCountOfContainedObjects])
|
||||
return NO;
|
||||
|
||||
[(id)_model gcIncrementRefCount];
|
||||
[(id)_arguments gcIncrementRefCount];
|
||||
|
||||
[(id)_model gcIncrementRefCountOfContainedObjects];
|
||||
[(id)_arguments gcIncrementRefCountOfContainedObjects];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
+ (EOStoredProcedure *)storedProcedureWithPropertyList: (NSDictionary *)propertyList
|
||||
owner: (id)owner
|
||||
{
|
||||
return [[[self alloc] initWithPropertyList: propertyList
|
||||
owner: owner] autorelease];
|
||||
}
|
||||
|
||||
- initWithPropertyList: (NSDictionary *)propertyList owner: (id)owner
|
||||
{
|
||||
NSArray *array;
|
||||
NSEnumerator *enumerator;
|
||||
id attributePList;
|
||||
|
||||
_model = [owner retain];
|
||||
|
||||
[self setName: [propertyList objectForKey: @"name"]];
|
||||
[self setExternalName: [propertyList objectForKey: @"externalName"]];
|
||||
[self setUserInfo: [propertyList objectForKey: @"userInfo"]];
|
||||
|
||||
if (!_userInfo)
|
||||
[self setUserInfo:[propertyList objectForKey:@"userInfo"]];
|
||||
|
||||
array = [propertyList objectForKey:@"attributes"];
|
||||
if ([array count])
|
||||
{
|
||||
_arguments = [[GCMutableArray alloc] initWithCapacity: [array count]];
|
||||
|
||||
enumerator = [array objectEnumerator];
|
||||
while ((attributePList = [enumerator nextObject]))
|
||||
{
|
||||
EOAttribute *attribute = [EOAttribute
|
||||
attributeWithPropertyList: attributePList
|
||||
owner: self];
|
||||
|
||||
[(GCMutableArray *)_arguments addObject: attribute];
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)awakeWithPropertyList: (NSDictionary *)propertyList
|
||||
{
|
||||
NSEnumerator *argsEnum;
|
||||
EOAttribute *attribute;
|
||||
|
||||
argsEnum = [_arguments objectEnumerator];
|
||||
while ((attribute = [argsEnum nextObject]))
|
||||
[attribute awakeWithPropertyList: propertyList];
|
||||
}
|
||||
|
||||
- (void)encodeIntoPropertyList: (NSMutableDictionary *)propertyList
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
- (NSString *)name
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
- (NSString *)externalName
|
||||
{
|
||||
return _externalName;
|
||||
}
|
||||
|
||||
- (EOModel *)model
|
||||
{
|
||||
return _model;
|
||||
}
|
||||
|
||||
- (NSArray *)arguments
|
||||
{
|
||||
return _arguments;
|
||||
}
|
||||
|
||||
- (NSDictionary *)userInfo
|
||||
{
|
||||
return _userInfo;
|
||||
}
|
||||
|
||||
- (void)setName: (NSString *)name
|
||||
{
|
||||
ASSIGN(_name, name);
|
||||
}
|
||||
|
||||
- (void)setExternalName: (NSString *)name
|
||||
{
|
||||
ASSIGN(_externalName, name);
|
||||
}
|
||||
|
||||
- (void)setArguments: (NSArray *)arguments
|
||||
{
|
||||
if ([arguments isKindOfClass: [GCArray class]]
|
||||
|| [arguments isKindOfClass: [GCMutableArray class]])
|
||||
ASSIGN(_arguments, arguments);
|
||||
else
|
||||
_arguments = [[GCArray alloc] initWithArray: arguments];
|
||||
}
|
||||
|
||||
- (void)setUserInfo: (NSDictionary *)dictionary
|
||||
{
|
||||
ASSIGN(_userInfo, dictionary);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOStoredProcedure (EOModelBeautifier)
|
||||
|
||||
- (void)beautifyName
|
||||
{
|
||||
NSArray *listItems;
|
||||
NSString *newString = [NSMutableString string];
|
||||
int anz, i;
|
||||
|
||||
EOFLOGObjectFnStartOrCond2(@"ModelingClasses", @"EOStoredProcedure");
|
||||
|
||||
if ((_name) && ([_name length] > 0))
|
||||
{
|
||||
listItems = [_name componentsSeparatedByString: @"_"];
|
||||
newString = [newString stringByAppendingString: [[listItems objectAtIndex: 0]
|
||||
lowercaseString]];
|
||||
anz = [listItems count];
|
||||
|
||||
for (i = 1; i < anz; i++)
|
||||
{
|
||||
newString = [newString stringByAppendingString:
|
||||
[[listItems objectAtIndex: i] capitalizedString]];
|
||||
}
|
||||
|
||||
NS_DURING
|
||||
[self setName: newString];
|
||||
NS_HANDLER
|
||||
NSLog(@"%@ in Class: EOStoredProcedure , Method: beautifyName >> error : %@",
|
||||
[localException name], [localException reason]);
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStopOrCond2(@"ModelingClasses", @"EOStoredProcedure");
|
||||
}
|
||||
|
||||
@end
|
105
EOAccess/EOUtilities.h
Normal file
105
EOAccess/EOUtilities.h
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
EOUtilities.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: Sep 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOUtilities_h__
|
||||
#define __EOUtilities_h__
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
|
||||
@class EODatabaseContext;
|
||||
@class EOModelGroup;
|
||||
@class EOEntity;
|
||||
|
||||
extern NSString *EOMoreThanOneException;
|
||||
|
||||
|
||||
@interface EOEditingContext(EOUtilities)
|
||||
|
||||
- (NSArray*)objectsForEntityNamed: (NSString*)name;
|
||||
- (NSArray*)objectsOfClass: (Class)classObject;
|
||||
- (NSArray*)objectsWithFetchSpecificationNamed: (NSString*)fetchSpecName
|
||||
entityNamed: (NSString*)entityName
|
||||
bindings: (NSDictionary*)bindings;
|
||||
- (NSArray*)objectsForEntityNamed: (NSString*)name
|
||||
qualifierFormat: (NSString*)format, ...;
|
||||
- (NSArray*)objectsMatchingValue: (id)value
|
||||
forKey: (NSString*)key
|
||||
entityNamed: (NSString*)name;
|
||||
- (NSArray*)objectsMatchingValues: (NSDictionary*)values
|
||||
entityNamed: (NSString*)name;
|
||||
|
||||
- (id)objectWithFetchSpecificationNamed: (NSString*)fetchSpecName
|
||||
entityNamed: (NSString*)entityName
|
||||
bindings: (NSDictionary*)bindings;
|
||||
- (id)objectForEntityNamed: (NSString*)name
|
||||
qualifierFormat: (NSString*)format, ...;
|
||||
- (id)objectMatchingValue: (id)value
|
||||
forKey: (NSString*)key
|
||||
entityNamed: (NSString*)name;
|
||||
- (id)objectMatchingValues: (NSDictionary*)values
|
||||
entityNamed: (NSString*)name;
|
||||
- (id)objectWithPrimaryKeyValue: (id)value
|
||||
entityNamed: (NSString*)name;
|
||||
- (id)objectWithPrimaryKey: (NSDictionary*)pkDict
|
||||
entityNamed: (NSString*)name;
|
||||
|
||||
- (NSArray *)objectsOfClass: (Class)class;
|
||||
|
||||
- (NSArray*)rawRowsForEntityNamed: (NSString*)name
|
||||
qualifierFormat: (NSString*)format, ...;
|
||||
- (NSArray*)rawRowsMatchingValue: (id)value
|
||||
forKey: (NSString*)key
|
||||
entityNamed: (NSString*)name;
|
||||
- (NSArray*)rawRowsMatchingValues: (NSDictionary*)values
|
||||
entityNamed: (NSString*)name;
|
||||
- (NSArray*)rawRowsWithSQL: (NSString*)sqlString
|
||||
modelNamed: (NSString*)name;
|
||||
- (NSArray*)rawRowsWithStoredProcedureNamed: (NSString*)name
|
||||
arguments: (NSDictionary*)args;
|
||||
- (NSDictionary*)executeStoredProcedureNamed: (NSString*)name
|
||||
arguments: (NSDictionary*)args;
|
||||
- (id)objectFromRawRow: (NSDictionary*)row
|
||||
entityNamed: (NSString*)name;
|
||||
|
||||
- (EODatabaseContext*)databaseContextForModelNamed: (NSString*)name;
|
||||
- (void)connectWithModelNamed: (NSString*)name
|
||||
connectionDictionaryOverrides: (NSDictionary*)overrides;
|
||||
|
||||
- (NSDictionary*)primaryKeyForObject: (id)object;
|
||||
- (NSDictionary*)destinationKeyForSourceObject: (id)object
|
||||
relationshipNamed: (NSString*)name;
|
||||
|
||||
- (id)localInstanceOfObject: (id)object;
|
||||
- (NSArray*)localInstancesOfObjects: (NSArray*)objects;
|
||||
|
||||
- (EOModelGroup*)modelGroup;
|
||||
- (EOEntity*)entityNamed: (NSString*)name;
|
||||
- (EOEntity*)entityForClass: (Class)classObject;
|
||||
- (EOEntity*)entityForObject: (id)obj;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
1039
EOAccess/EOUtilities.m
Normal file
1039
EOAccess/EOUtilities.m
Normal file
File diff suppressed because it is too large
Load diff
123
EOAccess/GNUmakefile
Normal file
123
EOAccess/GNUmakefile
Normal file
|
@ -0,0 +1,123 @@
|
|||
#
|
||||
# EOAccess makefile for GNUstep Database Library.
|
||||
#
|
||||
# Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# Install into the system root by default
|
||||
GNUSTEP_INSTALLATION_DIR = $(GNUSTEP_SYSTEM_ROOT)
|
||||
|
||||
GNUSTEP_MAKEFILES = $(GNUSTEP_SYSTEM_ROOT)/Makefiles
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
|
||||
include ../Version
|
||||
|
||||
# The library to be compiled
|
||||
LIBRARY_NAME=libgnustep-db2
|
||||
|
||||
LIBRARIES_DEPEND_UPON=-lgnustep-base -lFoundationExt -lgnustep-db2control
|
||||
|
||||
# The C source files to be compiled
|
||||
libgnustep-db2_C_FILES =
|
||||
|
||||
# The Objective-C source files to be compiled
|
||||
libgnustep-db2_OBJC_FILES = \
|
||||
EOModelGroup.m \
|
||||
EOModel.m \
|
||||
EOEntity.m \
|
||||
EOAttribute.m \
|
||||
EORelationship.m \
|
||||
EOJoin.m \
|
||||
EOStoredProcedure.m \
|
||||
EOExpressionArray.m \
|
||||
EOAdaptor.m \
|
||||
EOAdaptorContext.m \
|
||||
EOAdaptorChannel.m \
|
||||
EOAdaptorOperation.m \
|
||||
EODatabaseOperation.m \
|
||||
EOSQLExpression.m \
|
||||
EOSQLQualifier.m \
|
||||
EODatabase.m \
|
||||
EODatabaseChannel.m \
|
||||
EODatabaseContext.m \
|
||||
EOAccessFault.m \
|
||||
EODatabaseDataSource.m \
|
||||
EOUtilities.m
|
||||
|
||||
libgnustep-db2_HEADER_FILES_DIR = .
|
||||
libgnustep-db2_HEADER_FILES_INSTALL_DIR = /EOAccess
|
||||
|
||||
libgnustep-db2_HEADER_FILES = \
|
||||
EOModelGroup.h \
|
||||
EOModel.h \
|
||||
EOEntity.h \
|
||||
EOAttribute.h \
|
||||
EORelationship.h \
|
||||
EOJoin.h \
|
||||
EOStoredProcedure.h \
|
||||
EOAdaptor.h \
|
||||
EOAdaptorContext.h \
|
||||
EOAdaptorChannel.h \
|
||||
EODatabaseOperation.h \
|
||||
EOSQLExpression.h \
|
||||
EOSQLQualifier.h \
|
||||
EODatabase.h \
|
||||
EODatabaseChannel.h \
|
||||
EODatabaseContext.h \
|
||||
EOAccessFault.h \
|
||||
EOPropertyListEncoding.h \
|
||||
EODatabaseDataSource.h \
|
||||
EOSchemaGeneration.h \
|
||||
EOUtilities.h \
|
||||
EOAccess.h
|
||||
|
||||
gdl2_AUTOGSDOC_HEADERS = $(libgnustep-db2_HEADER_FILES)
|
||||
gdl2_AUTOGSDOC_SOURCE = $(libgnustep-db2_OBJC_FILES)
|
||||
DOCUMENT_NAME = gdl2
|
||||
gdl2_HEADER_FILES_DIR = $(HEADER_DIR)
|
||||
gdl2_AGSDOC_FILES = gdl2.gsdoc $(gdl2_AUTOGSDOC_HEADERS)
|
||||
#$(gdl2_AUTOGSDOC_SOURCE)
|
||||
gdl2_AGSDOC_FLAGS = \
|
||||
-Declared EOAccess \
|
||||
-Standards YES \
|
||||
-Project gdl2 \
|
||||
-WordMap '{\
|
||||
FOUNDATION_EXPORT=extern;FOUNDATION_STATIC_INLINE="";\
|
||||
GS_GEOM_SCOPE=extern;GS_GEOM_ATTR="";\
|
||||
GS_EXPORT=extern;GS_DECLARE="";\
|
||||
GS_RANGE_SCOPE=extern;GS_RANGE_ATTR="";\
|
||||
GS_ZONE_SCOPE=extern;GS_ZONE_ATTR="";\
|
||||
}' -Up gdl2
|
||||
|
||||
|
||||
-include Makefile.preamble
|
||||
|
||||
-include GNUmakefile.local
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/library.make
|
||||
# Only build the doc if doc=yes was passed on the command line
|
||||
ifeq ($(doc),yes)
|
||||
include $(GNUSTEP_MAKEFILES)/documentation.make
|
||||
endif
|
||||
|
||||
|
||||
-include Makefile.postamble
|
69
EOAccess/Makefile.postamble
Normal file
69
EOAccess/Makefile.postamble
Normal file
|
@ -0,0 +1,69 @@
|
|||
#
|
||||
# Makefile.postamble
|
||||
#
|
||||
# Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
#
|
||||
# Written by: Scott Christley <scottc@net-community.com>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile.postamble
|
||||
#
|
||||
# Project specific makefile rules
|
||||
#
|
||||
# Uncomment the targets you want.
|
||||
# The double colons (::) are important, do not make them single colons
|
||||
# otherwise the normal makefile rules will not be performed.
|
||||
#
|
||||
|
||||
# Things to do before compiling
|
||||
before-all::
|
||||
|
||||
# Things to do after compiling
|
||||
# after-all::
|
||||
|
||||
# Things to do before installing
|
||||
# before-install::
|
||||
|
||||
# Things to do after installing
|
||||
# after-install::
|
||||
|
||||
# Things to do before uninstalling
|
||||
# before-uninstall::
|
||||
|
||||
# Things to do after uninstalling
|
||||
# after-uninstall::
|
||||
|
||||
# Things to do before cleaning
|
||||
# before-clean::
|
||||
|
||||
# Things to do after cleaning
|
||||
# after-clean::
|
||||
|
||||
# Things to do before distcleaning
|
||||
# before-distclean::
|
||||
|
||||
# Things to do after distcleaning
|
||||
# after-distclean::
|
||||
|
||||
# Things to do before checking
|
||||
# before-check::
|
||||
|
||||
# Things to do after checking
|
||||
# after-check:
|
72
EOAccess/Makefile.preamble
Normal file
72
EOAccess/Makefile.preamble
Normal file
|
@ -0,0 +1,72 @@
|
|||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
#
|
||||
# Written by: Scott Christley <scottc@net-community.com>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Project specific makefile variables, and additional
|
||||
#
|
||||
# Do not put any Makefile rules in this file, instead they should
|
||||
# be put into Makefile.postamble.
|
||||
#
|
||||
|
||||
#
|
||||
# Flags dealing with compiling and linking
|
||||
#
|
||||
|
||||
# Additional flags to pass to the preprocessor
|
||||
ADDITIONAL_CPPFLAGS = $(FND_DEFINE) $(RUNTIME_DEFINE) -g
|
||||
|
||||
# Additional flags to pass to the Objective-C compiler
|
||||
ADDITIONAL_OBJCFLAGS =
|
||||
|
||||
# Additional flags to pass to the C compiler
|
||||
ADDITIONAL_CFLAGS =
|
||||
|
||||
# Additional include directories the compiler should search
|
||||
ADDITIONAL_INCLUDE_DIRS = -I..
|
||||
|
||||
# Additional LDFLAGS to pass to the linker
|
||||
ADDITIONAL_LDFLAGS =
|
||||
|
||||
# Additional library directories the linker should search
|
||||
ADDITIONAL_LIB_DIRS =
|
||||
|
||||
#
|
||||
# Flags dealing with installing and uninstalling
|
||||
#
|
||||
|
||||
# Additional directories to be created during installation
|
||||
ADDITIONAL_INSTALL_DIRS =
|
||||
|
||||
|
||||
# What are the libraries this library depends upon. This is needed for some
|
||||
# systems where building a shared library requires to pass to the linker
|
||||
# all the libraries the target library depends upon.
|
||||
|
||||
LIBRARIES_DEPEND_UPON = -l$(FOUNDATION_LIBRARY_NAME)
|
||||
|
||||
ifeq ($(FOUNDATION_HAS_KVC), yes)
|
||||
ADDITIONAL_OBJCFLAGS := $(ADDITIONAL_OBJCFLAGS) -DFOUNDATION_HAS_KVC=1
|
||||
endif
|
23
EOAccess/gdl2.gsdoc
Normal file
23
EOAccess/gdl2.gsdoc
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 0.6.7//EN" "http://www.gnustep.org/gsdoc-0_6_7.xml">
|
||||
<gsdoc base="index">
|
||||
<head>
|
||||
<title>GDL2</title>
|
||||
<author name="Mirko Viviani">
|
||||
<email address="mirko.viviani@rccr.cremona.it"/>
|
||||
<url url="http://www.gnustep.org/developers/whoiswho.html"/></author>
|
||||
<author name="Manuel Guesdon">
|
||||
<email address="mguesdon@orange-concept.com"/>
|
||||
<url url="http://www.gnustep.org/developers/whoiswho.html"/></author>
|
||||
</head>
|
||||
<body>
|
||||
<chapter>
|
||||
<heading>GDL2</heading>
|
||||
<p>...
|
||||
</p>
|
||||
</chapter>
|
||||
<back>
|
||||
<index scope="project" type="title" />
|
||||
</back>
|
||||
</body>
|
||||
</gsdoc>
|
40
EOAdaptors/GNUmakefile.in
Normal file
40
EOAdaptors/GNUmakefile.in
Normal file
|
@ -0,0 +1,40 @@
|
|||
#
|
||||
# EOAdaptors makefile for GNUstep Database Library.
|
||||
#
|
||||
# Copyright (C) 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# Written by: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
GNUSTEP_MAKEFILES = $(GNUSTEP_SYSTEM_ROOT)/Makefiles
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
|
||||
include ../Version
|
||||
|
||||
#
|
||||
# The list of subproject directories
|
||||
#
|
||||
SUBPROJECTS = @EOADAPTORS@
|
||||
|
||||
-include Makefile.preamble
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/aggregate.make
|
||||
|
||||
-include Makefile.postamble
|
91
EOAdaptors/Postgres95/GNUmakefile.in
Normal file
91
EOAdaptors/Postgres95/GNUmakefile.in
Normal file
|
@ -0,0 +1,91 @@
|
|||
#
|
||||
# PostgreSQL makefile for GNUstep Database Library.
|
||||
#
|
||||
# Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
GNUSTEP_MAKEFILES = $(GNUSTEP_SYSTEM_ROOT)/Makefiles
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/common.make
|
||||
|
||||
include ../../Version
|
||||
|
||||
POSTGRES95_DATABASE=@POSTGRES_DATABASE@
|
||||
|
||||
# The framework to be compiled
|
||||
FRAMEWORK_NAME=Postgres95EOAdaptor
|
||||
|
||||
# Install into the local root by default
|
||||
Postgres95EOAdaptor_INSTALLATION_DIR = $(GNUSTEP_LOCAL_ROOT)
|
||||
|
||||
# The framework principal class
|
||||
Postgres95EOAdaptor_PRINCIPAL_CLASS = Postgres95Adaptor
|
||||
|
||||
# The framework Objective-C source files to be compiled
|
||||
Postgres95EOAdaptor_OBJC_FILES = \
|
||||
Postgres95Adaptor.m \
|
||||
Postgres95Context.m \
|
||||
Postgres95Channel.m \
|
||||
Postgres95SQLExpression.m \
|
||||
Postgres95Values.m
|
||||
|
||||
Postgres95EOAdaptor_HEADER_FILES = \
|
||||
Postgres95Adaptor.h \
|
||||
Postgres95Context.h \
|
||||
Postgres95Channel.h \
|
||||
Postgres95SQLExpression.h \
|
||||
Postgres95Values.h
|
||||
|
||||
|
||||
Postgres95EOAdaptor_AUTOGSDOC_HEADERS = $(Postgres95EOAdaptor_HEADER_FILES)
|
||||
Postgres95EOAdaptor_AUTOGSDOC_SOURCE = $(Postgres95EOAdaptor_OBJC_FILES)
|
||||
DOCUMENT_NAME = Postgres95EOAdaptor
|
||||
Postgres95EOAdaptor_AGSDOC_FILES = Postgres95EOAdaptor.gsdoc $(Postgres95EOAdaptor_AUTOGSDOC_HEADERS)
|
||||
#$(Postgres95EOAdaptor_AUTOGSDOC_SOURCE)
|
||||
Postgres95EOAdaptor_AGSDOC_FLAGS = \
|
||||
-Declared Foundation \
|
||||
-Standards YES \
|
||||
-SystemProjects System \
|
||||
-Project Postgres95EOAdaptor \
|
||||
-WordMap '{\
|
||||
FOUNDATION_EXPORT=extern;FOUNDATION_STATIC_INLINE="";\
|
||||
GS_GEOM_SCOPE=extern;GS_GEOM_ATTR="";\
|
||||
GS_EXPORT=extern;GS_DECLARE="";\
|
||||
GS_RANGE_SCOPE=extern;GS_RANGE_ATTR="";\
|
||||
GS_ZONE_SCOPE=extern;GS_ZONE_ATTR="";\
|
||||
}' -Up Postgres95EOAdaptor
|
||||
|
||||
|
||||
-include Makefile.preamble
|
||||
|
||||
-include GNUmakefile.local
|
||||
|
||||
ifeq ($(POSTGRES95_DATABASE),yes)
|
||||
include $(GNUSTEP_MAKEFILES)/framework.make
|
||||
else
|
||||
include $(GNUSTEP_MAKEFILES)/rules.make
|
||||
endif
|
||||
# Only build the doc if doc=yes was passed on the command line
|
||||
ifeq ($(doc),yes)
|
||||
include $(GNUSTEP_MAKEFILES)/documentation.make
|
||||
endif
|
||||
|
||||
-include Makefile.postamble
|
4
EOAdaptors/Postgres95/Info.plist
Normal file
4
EOAdaptors/Postgres95/Info.plist
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
NSPrincipalClass = Postgres95Adaptor;
|
||||
NSExecutable = Postgres95;
|
||||
}
|
61
EOAdaptors/Postgres95/Makefile.preamble
Normal file
61
EOAdaptors/Postgres95/Makefile.preamble
Normal file
|
@ -0,0 +1,61 @@
|
|||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Project specific makefile variables, and additional
|
||||
#
|
||||
# Do not put any Makefile rules in this file, instead they should
|
||||
# be put into Makefile.postamble.
|
||||
#
|
||||
|
||||
#
|
||||
# Flags dealing with compiling and linking
|
||||
#
|
||||
|
||||
# Additional flags to pass to the preprocessor
|
||||
ADDITIONAL_CPPFLAGS =
|
||||
|
||||
# Additional flags to pass to the Objective-C compiler
|
||||
ADDITIONAL_OBJCFLAGS =
|
||||
|
||||
# Additional flags to pass to the C compiler
|
||||
ADDITIONAL_CFLAGS =
|
||||
|
||||
# Additional include directories the compiler should search
|
||||
ADDITIONAL_INCLUDE_DIRS = -I../.. -I/usr/local/pgsql/include
|
||||
|
||||
# Additional LDFLAGS to pass to the linker
|
||||
ADDITIONAL_LDFLAGS = -lpq
|
||||
|
||||
# Additional library directories the linker should search
|
||||
ADDITIONAL_LIB_DIRS = -L/usr/local/pgsql/lib
|
||||
|
||||
#
|
||||
# Flags dealing with installing and uninstalling
|
||||
#
|
||||
|
||||
# Additional directories to be created during installation
|
||||
ADDITIONAL_INSTALL_DIRS =
|
61
EOAdaptors/Postgres95/Makefile.preamble.in
Normal file
61
EOAdaptors/Postgres95/Makefile.preamble.in
Normal file
|
@ -0,0 +1,61 @@
|
|||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
#
|
||||
# This file is part of the GNUstep Database Library.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile.preamble
|
||||
#
|
||||
# Project specific makefile variables, and additional
|
||||
#
|
||||
# Do not put any Makefile rules in this file, instead they should
|
||||
# be put into Makefile.postamble.
|
||||
#
|
||||
|
||||
#
|
||||
# Flags dealing with compiling and linking
|
||||
#
|
||||
|
||||
# Additional flags to pass to the preprocessor
|
||||
ADDITIONAL_CPPFLAGS =
|
||||
|
||||
# Additional flags to pass to the Objective-C compiler
|
||||
ADDITIONAL_OBJCFLAGS =
|
||||
|
||||
# Additional flags to pass to the C compiler
|
||||
ADDITIONAL_CFLAGS =
|
||||
|
||||
# Additional include directories the compiler should search
|
||||
ADDITIONAL_INCLUDE_DIRS = -I../.. @POSTGRES_INCLUDES@
|
||||
|
||||
# Additional LDFLAGS to pass to the linker
|
||||
ADDITIONAL_LDFLAGS = @POSTGRES_LIBS@
|
||||
|
||||
# Additional library directories the linker should search
|
||||
ADDITIONAL_LIB_DIRS = @POSTGRES_LIB_DIRS@
|
||||
|
||||
#
|
||||
# Flags dealing with installing and uninstalling
|
||||
#
|
||||
|
||||
# Additional directories to be created during installation
|
||||
ADDITIONAL_INSTALL_DIRS =
|
104
EOAdaptors/Postgres95/Postgres95Adaptor.h
Normal file
104
EOAdaptors/Postgres95/Postgres95Adaptor.h
Normal file
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
Postgres95Adaptor.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it
|
||||
Date: February 2000
|
||||
|
||||
based on the Postgres95 adaptor written by
|
||||
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Postgres95Adaptor_h__
|
||||
#define __Postgres95Adaptor_h__
|
||||
|
||||
#import <EOAccess/EOAdaptor.h>
|
||||
|
||||
|
||||
/* Include Postgres 95 Headers */
|
||||
|
||||
#undef Assert
|
||||
#include <stdio.h>
|
||||
#include <libpq-fe.h>
|
||||
#include <libpq/libpq-fs.h>
|
||||
#undef Assert
|
||||
|
||||
@class NSMutableArray;
|
||||
@class NSMutableSet;
|
||||
|
||||
/* The following keys are meaningful in the connectionDictionary in a model:
|
||||
|
||||
databaseServer or hostName - the name of the server
|
||||
(default getenv(PGHOST) or localhost)
|
||||
databaseName - the name of the database to use
|
||||
(default getenv(PGDATABASE))
|
||||
options - additional options sent to the POSTGRES95 backend
|
||||
(default getenv(PGOPTIONS))
|
||||
port - port to communicate with POSTGRES95 backend
|
||||
(default getenv(PGPORT))
|
||||
debugTTY - filename (file/device) used for debugging output
|
||||
(default getenv(PGTTY))
|
||||
primaryKeySequenceNameFormat - Format for pk sequence name;
|
||||
like @"%@_SEQ" or @"EOSEQ_%@", "%@" is replaced by external table name
|
||||
(default: @"%@_SEQ")
|
||||
NOTE: user name is not given explicitly - the library uses the
|
||||
real user id of the user running the program and that user id
|
||||
is interpreted by the server (AFAIK)
|
||||
*/
|
||||
|
||||
@interface Postgres95Adaptor : EOAdaptor
|
||||
{
|
||||
NSMutableArray *_pgConnPool;
|
||||
int _pgConnPoolLimit;
|
||||
NSString* _primaryKeySequenceNameFormat;
|
||||
struct {
|
||||
BOOL cachePGconn:1;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
/* Reporting errors */
|
||||
- (void)privateReportError: (PGconn *)pgConn;
|
||||
|
||||
/* Configure the adaptor to share the PGconn or not. The default is not to
|
||||
share PGconn. */
|
||||
- (void)setCachePGconn: (BOOL)flag;
|
||||
- (BOOL)cachePGconn;
|
||||
- (void)setPGconnPoolLimit: (int)newLimit;
|
||||
- (int)pgConnPoolLimit;
|
||||
|
||||
/* Inherited methods */
|
||||
|
||||
// Private methods
|
||||
|
||||
/* Obtaining and releasing a PGconn from pool */
|
||||
- (PGconn *)createPGconn;
|
||||
- (PGconn *)newPGconn;
|
||||
- (void)releasePGconn: (PGconn *)pgConn force: (BOOL)flag;
|
||||
|
||||
// format is something like @"%@_SEQ" or @"EOSEQ_%@", "%@" is replaced by external table name
|
||||
- (void)setPrimaryKeySequenceNameFormat: (NSString*)format;
|
||||
- (NSString*)primaryKeySequenceNameFormat;
|
||||
|
||||
extern NSString *Postgres95Exception;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __Postgres95Adaptor_h__ */
|
489
EOAdaptors/Postgres95/Postgres95Adaptor.m
Normal file
489
EOAdaptors/Postgres95/Postgres95Adaptor.m
Normal file
|
@ -0,0 +1,489 @@
|
|||
/**
|
||||
Postgres95Adaptor.m <title>Postgres95Adaptor</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
based on the Postgres95 adaptor written by
|
||||
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: October 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
#import <EOAccess/EOExpressionArray.h>
|
||||
#import <EOAccess/EOEntity.h>
|
||||
#import <EOAccess/EOModel.h>
|
||||
|
||||
#import <Postgres95EOAdaptor/Postgres95Adaptor.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Context.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Channel.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95SQLExpression.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Values.h>
|
||||
|
||||
|
||||
NSString *Postgres95Exception = @"Postgres95Exception";
|
||||
static int pgConnTotalAllocated = 0;
|
||||
static int pgConnCurrentAllocated = 0;
|
||||
|
||||
|
||||
@implementation Postgres95Adaptor
|
||||
|
||||
- init
|
||||
{
|
||||
return [self initWithName: @"Postgres95"];
|
||||
}
|
||||
|
||||
- initWithName: (NSString *)name
|
||||
{
|
||||
if ((self = [super initWithName: name]))
|
||||
{
|
||||
_pgConnPool = [NSMutableArray new];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
NSEnumerator *enumerator;
|
||||
PGconn *pgConn;
|
||||
|
||||
enumerator = [_pgConnPool objectEnumerator];
|
||||
|
||||
while ((pgConn = [[enumerator nextObject] pointerValue]))
|
||||
[self releasePGconn: pgConn force: YES];
|
||||
|
||||
[_pgConnPool release];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)privateReportError: (PGconn*)pgConn
|
||||
{
|
||||
char *message = "NULL pgConn in privateReportError:";
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if (pgConn)
|
||||
message = PQerrorMessage(pgConn);
|
||||
|
||||
NSLog(@"%s", message);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)setCachePGconn: (BOOL)flag
|
||||
{
|
||||
_flags.cachePGconn = flag;
|
||||
}
|
||||
|
||||
- (BOOL)cachePGconn
|
||||
{
|
||||
return _flags.cachePGconn;
|
||||
}
|
||||
|
||||
- (void)setPGconnPoolLimit: (int)value
|
||||
{
|
||||
_pgConnPoolLimit = value;
|
||||
}
|
||||
|
||||
- (int)pgConnPoolLimit
|
||||
{
|
||||
return _pgConnPoolLimit;
|
||||
}
|
||||
|
||||
/*+ (NSDictionary *)defaultConnectionDictionary
|
||||
{
|
||||
static NSDictionary *dict = nil;
|
||||
|
||||
if (!dict)
|
||||
dict = [[NSDictionary dictionaryWithObjectsAndKeys:NSHomeDirectory(), FlatFilePathKey, [self defaultRowSeparator], FlatFileRowSeparatorKey, [self defaultColumnSeparator], FlatFileColumnSeparatorKey, @"Y", FlatFileUseHeadersKey, nil] retain];
|
||||
|
||||
return dict;
|
||||
}*/
|
||||
|
||||
static NSString *externalTypeNames[] = {
|
||||
@"bool",
|
||||
@"char", @"char2", @"char4", @"char8", @"char16", @"filename",
|
||||
@"date", @"reltime", @"time", @"tinterval", @"abstime",
|
||||
@"float4", @"float8",
|
||||
@"int4", @"int2",
|
||||
@"oid", @"oid8", @"oidint2", @"oidint4", @"oidchar16",
|
||||
@"varchar", @"bpchar",
|
||||
@"cid", @"tid", @"xid",
|
||||
nil
|
||||
};
|
||||
|
||||
static NSString *internalTypeNames[] = {
|
||||
@"NSNumber",
|
||||
@"NSNumber", @"NSNumber", @"NSNumber", @"NSNumber", @"NSNumber", @"NSNumber",
|
||||
@"NSCalendarDate", @"NSCalendarDate", @"NSCalendarDate", @"NSCalendarDate", @"NSCalendarDate",
|
||||
@"NSNumber", @"NSNumber",
|
||||
@"NSNumber", @"NSNumber",
|
||||
@"NSNumber", @"NSNumber", @"NSNumber", @"NSNumber", @"NSNumber",
|
||||
@"NSString", @"NSString",
|
||||
@"NSDecimalNumber", @"NSDecimalNumber", @"NSDecimalNumber",
|
||||
nil
|
||||
};
|
||||
|
||||
+ (NSDictionary *)externalToInternalTypeMap
|
||||
{
|
||||
static NSDictionary *externalToInternalTypeMap = nil;
|
||||
|
||||
if (!externalToInternalTypeMap)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; externalTypeNames[i]; i++);
|
||||
|
||||
externalToInternalTypeMap = [[NSDictionary dictionaryWithObjects: internalTypeNames forKeys: externalTypeNames count: i] retain];
|
||||
}
|
||||
|
||||
return externalToInternalTypeMap;
|
||||
}
|
||||
|
||||
+ (NSString *)internalTypeForExternalType: (NSString *)extType
|
||||
model: (EOModel *)model
|
||||
{
|
||||
return [[self externalToInternalTypeMap] objectForKey: extType];
|
||||
}
|
||||
|
||||
+ (NSArray *)externalTypesWithModel:(EOModel *)model
|
||||
{
|
||||
return [[self externalToInternalTypeMap] allKeys];
|
||||
}
|
||||
|
||||
+ (void)assignExternalInfoForAttribute: (EOAttribute *)attribute
|
||||
{
|
||||
// TODO
|
||||
EOAdaptorValueType value = [attribute adaptorValueType];
|
||||
|
||||
[attribute setExternalType: externalTypeNames[value]];
|
||||
}
|
||||
|
||||
+ (void)assignExternalInfoForEntity: (EOEntity *)entity
|
||||
{
|
||||
NSEnumerator *attributeEnumerator = [[entity attributes] objectEnumerator];
|
||||
EOAttribute *attribute;
|
||||
|
||||
while ((attribute = [attributeEnumerator nextObject]))
|
||||
[self assignExternalInfoForAttribute: attribute];
|
||||
}
|
||||
|
||||
/* Inherited methods */
|
||||
|
||||
- (EOAdaptorContext *)createAdaptorContext
|
||||
{
|
||||
//OK
|
||||
return [Postgres95Context adaptorContextWithAdaptor: self];
|
||||
}
|
||||
|
||||
- (Class)defaultExpressionClass
|
||||
{
|
||||
Class expressionClass;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
expressionClass = [Postgres95SQLExpression class];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return expressionClass;
|
||||
}
|
||||
|
||||
- (BOOL)isValidQualifierType: (NSString *)typeName
|
||||
model: (EOModel *)model
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; externalTypeNames[i]; i++)
|
||||
{
|
||||
//TODO REMOVE
|
||||
NSDebugMLog(@"externalTypeNames[i]=%@", externalTypeNames[i]);
|
||||
|
||||
if ([externalTypeNames[i] isEqualToString: typeName])
|
||||
return YES;
|
||||
}
|
||||
//TODO REMOVE
|
||||
|
||||
NSDebugMLog(@"typeName=%@", typeName);
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)assertConnectionDictionaryIsValid
|
||||
{
|
||||
NSException *exception = nil;
|
||||
EOAdaptorContext *adaptorContext;
|
||||
EOAdaptorChannel *adaptorChannel;
|
||||
|
||||
if (![self hasOpenChannels])
|
||||
{
|
||||
adaptorContext = [self createAdaptorContext];
|
||||
adaptorChannel = [adaptorContext createAdaptorChannel];
|
||||
|
||||
NS_DURING
|
||||
[adaptorChannel openChannel];
|
||||
NS_HANDLER
|
||||
exception = localException;
|
||||
NS_ENDHANDLER;
|
||||
|
||||
[adaptorChannel closeChannel];
|
||||
|
||||
if (exception)
|
||||
[exception raise];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
-(NSString *)formatValue:(id)value
|
||||
forAttribute:(EOAttribute*)attribute
|
||||
{
|
||||
return [value stringValueForPostgres95Type:[attribute externalType]
|
||||
attribute:attribute];
|
||||
}
|
||||
*/
|
||||
|
||||
- (NSString *)fetchedValueForString: (NSString *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
//TODO: don't need to be overriden ??
|
||||
- (NSNumber *)fetchedValueForNumberValue: (NSNumber *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value; // TODO scale and precision
|
||||
}
|
||||
|
||||
- (NSCalendarDate *)fetchedValueForDateValue: (NSCalendarDate *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
- (NSData *)fetchedValueForDataValue: (NSData *)value
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
- (void)createDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)connectionDictionary
|
||||
{
|
||||
}
|
||||
|
||||
- (void)dropDatabaseWithAdministrativeConnectionDictionary: (NSDictionary *)connectionDictionary
|
||||
{
|
||||
}
|
||||
|
||||
/* Private methods for Postgres Adaptor */
|
||||
|
||||
- (PGconn *)createPGconn
|
||||
{
|
||||
char *pg_host = NULL;
|
||||
char *pg_database = NULL;
|
||||
char *pg_port = NULL;
|
||||
char *pg_options = NULL;
|
||||
char *pg_tty = NULL;
|
||||
char *pg_user = NULL;
|
||||
char *pg_pwd = NULL;
|
||||
PGconn *pgConn = NULL;
|
||||
PGresult *pgResult = NULL;
|
||||
NSString *str = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
//OK
|
||||
str = [_connectionDictionary objectForKey: @"databaseServer"];
|
||||
if (!str)
|
||||
str = [_connectionDictionary objectForKey: @"hostName"];
|
||||
|
||||
pg_host = (char*)[str cString];
|
||||
|
||||
pg_database = (char*)[[_connectionDictionary objectForKey: @"databaseName"]
|
||||
cString];
|
||||
pg_port = (char*)[[_connectionDictionary objectForKey: @"port"] cString];
|
||||
if (!pg_port)
|
||||
pg_port = (char*)[[_connectionDictionary objectForKey: @"hostPort"]
|
||||
cString];
|
||||
|
||||
pg_options = (char*)[[_connectionDictionary objectForKey: @"options"]
|
||||
cString];
|
||||
pg_tty = (char*)[[_connectionDictionary objectForKey: @"debugTTY"] cString];
|
||||
pg_user = (char*)[[_connectionDictionary objectForKey: @"userName"]
|
||||
cString];
|
||||
pg_pwd = (char*)[[_connectionDictionary objectForKey: @"password"]
|
||||
cString];
|
||||
|
||||
NSLog(@"%s %s %s %s %s", pg_host, pg_port, pg_database, pg_user, pg_pwd);
|
||||
NSDebugMLog(@"%s %s %s %s %s", pg_host, pg_port, pg_database, pg_user, pg_pwd);
|
||||
|
||||
// Try to connect to the Postgres95 server
|
||||
if (pg_user)
|
||||
pgConn = PQsetdbLogin(pg_host, pg_port, pg_options, pg_tty,
|
||||
pg_database,pg_user,pg_pwd);
|
||||
else
|
||||
pgConn = PQsetdb(pg_host, pg_port, pg_options, pg_tty, pg_database);
|
||||
|
||||
NSDebugMLog(@"%s %s %s %s %s", pg_host, pg_port, pg_database, pg_user,
|
||||
pg_pwd);
|
||||
|
||||
// Check connection
|
||||
if (PQstatus(pgConn) == CONNECTION_BAD)
|
||||
{
|
||||
//TODO: report error in an exception ?
|
||||
[self privateReportError: pgConn];
|
||||
PQfinish(pgConn);
|
||||
pgConn = NULL;
|
||||
}
|
||||
|
||||
if (pgConn)
|
||||
{
|
||||
pgResult = PQexec(pgConn, "SET DATESTYLE TO 'SQL'");
|
||||
PQclear(pgResult);
|
||||
pgResult = NULL;
|
||||
|
||||
if (pgConn)
|
||||
{
|
||||
pgConnTotalAllocated++;
|
||||
pgConnCurrentAllocated++;
|
||||
}
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return pgConn;
|
||||
}
|
||||
|
||||
- (PGconn *)newPGconn
|
||||
{
|
||||
PGconn *pgConn = NULL;
|
||||
|
||||
if(_flags.cachePGconn && [_pgConnPool count])
|
||||
{
|
||||
NSDebugMLog(@"newPGconn cached %p (pgConn=%p) total=%d current=%d",
|
||||
self,
|
||||
pgConn,
|
||||
pgConnTotalAllocated,
|
||||
pgConnCurrentAllocated);
|
||||
|
||||
pgConn = [[_pgConnPool lastObject] pointerValue];
|
||||
[_pgConnPool removeLastObject];
|
||||
}
|
||||
else
|
||||
{
|
||||
pgConn = [self createPGconn];
|
||||
|
||||
NSDebugMLog(@"newPGconn not cached %p (pgConn=%p) total=%d current=%d",
|
||||
self,
|
||||
pgConn,
|
||||
pgConnTotalAllocated,
|
||||
pgConnCurrentAllocated);
|
||||
}
|
||||
|
||||
return pgConn;
|
||||
}
|
||||
|
||||
- (void)releasePGconn: (PGconn *)pgConn
|
||||
force: (BOOL)flag
|
||||
{
|
||||
if (!flag
|
||||
&& _flags.cachePGconn
|
||||
&& (PQstatus(pgConn) == CONNECTION_OK)
|
||||
&& [_pgConnPool count] < _pgConnPoolLimit)
|
||||
{
|
||||
NSDebugMLog(@"releasePGconn -> in pool %p (pgConn=%p) total=%d current=%d",
|
||||
self,
|
||||
pgConn,
|
||||
pgConnTotalAllocated,
|
||||
pgConnCurrentAllocated);
|
||||
|
||||
[_pgConnPool addObject: [NSValue value: pgConn
|
||||
withObjCType: @encode(PGconn*)]];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSDebugMLog(@"releasePGconn really %p (pgConn=%p) total=%d current=%d",
|
||||
self,
|
||||
pgConn,
|
||||
pgConnTotalAllocated,
|
||||
pgConnCurrentAllocated);
|
||||
|
||||
pgConnCurrentAllocated--;
|
||||
PQfinish(pgConn);
|
||||
}
|
||||
}
|
||||
|
||||
// format is something like @"%@_SEQ" or @"EOSEQ_%@", "%@" is replaced by external table name
|
||||
- (void)setPrimaryKeySequenceNameFormat: (NSString*)format
|
||||
{
|
||||
ASSIGN(_primaryKeySequenceNameFormat, format);
|
||||
}
|
||||
|
||||
- (NSString*)primaryKeySequenceNameFormat
|
||||
{
|
||||
if (!_primaryKeySequenceNameFormat)
|
||||
_primaryKeySequenceNameFormat = [_connectionDictionary objectForKey: @"primaryKeySequenceNameFormat"];
|
||||
|
||||
if (!_primaryKeySequenceNameFormat)
|
||||
_primaryKeySequenceNameFormat = @"%@_SEQ";
|
||||
|
||||
return _primaryKeySequenceNameFormat;
|
||||
}
|
||||
|
||||
@end /* Postgres95Adaptor */
|
||||
|
||||
/*
|
||||
//TODO
|
||||
databaseEncoding
|
||||
{
|
||||
self connectionDictionary
|
||||
call dict obj for key databaseEncoding
|
||||
return 2 par defaut
|
||||
};
|
||||
*/
|
||||
|
89
EOAdaptors/Postgres95/Postgres95Channel.h
Normal file
89
EOAdaptors/Postgres95/Postgres95Channel.h
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
Postgres95Channel.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
based on the Postgres95 adaptor written by
|
||||
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Postgres95Channel_h__
|
||||
#define __Postgres95Channel_h__
|
||||
|
||||
#import <EOAccess/EOAdaptorChannel.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Context.h>
|
||||
|
||||
|
||||
@class NSMutableDictionary;
|
||||
@class NSMutableArray;
|
||||
@class EOAttribute;
|
||||
|
||||
@interface Postgres95Channel : EOAdaptorChannel
|
||||
{
|
||||
Postgres95Context *_adaptorContext;
|
||||
PGconn *_pgConn;
|
||||
PGresult *_pgResult;
|
||||
NSArray *_attributes;
|
||||
NSArray *_origAttributes;
|
||||
EOSQLExpression *_sqlExpression;
|
||||
int _currentResultRow;
|
||||
NSMutableDictionary *_oidToTypeName;
|
||||
BOOL _isFetchInProgress;
|
||||
BOOL _fetchBlobsOid;
|
||||
NSArray *_pkAttributeArray;
|
||||
|
||||
struct {
|
||||
unsigned int postgres95InsertedRowOid:1;
|
||||
unsigned int postgres95Notification:1;
|
||||
} _postgres95DelegateRespondsTo;
|
||||
}
|
||||
|
||||
- (PGconn*)pgConn;
|
||||
- (PGresult*)pgResult;
|
||||
- (BOOL)advanceRow;
|
||||
- (void)cleanupFetch;
|
||||
|
||||
- (void)_cancelResults;
|
||||
- (void)_describeResults;
|
||||
|
||||
/* Private methods */
|
||||
- (char*)_readBinaryDataRow: (Oid)oid length: (int*)length zone: (NSZone*)zone;
|
||||
- (Oid)_insertBinaryData: (NSData*)binaryData forAttribute: (EOAttribute*)attr;
|
||||
- (Oid)_updateBinaryDataRow: (Oid)oid data: (NSData*)binaryData;
|
||||
- (void)_describeDatabaseTypes;
|
||||
|
||||
- (BOOL)_evaluateExpression: (EOSQLExpression *)expression
|
||||
withAttributes: attrs;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (Postgres95ChannelDelegate)
|
||||
|
||||
- (void)postgres95Channel: (Postgres95Channel*)channel
|
||||
insertedRowWithOid: (Oid)oid;
|
||||
- (void)postgres95Channel: (Postgres95Channel*)channel
|
||||
receivedNotification: (NSString*)notification;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __Postgres95Channel_h__ */
|
1451
EOAdaptors/Postgres95/Postgres95Channel.m
Normal file
1451
EOAdaptors/Postgres95/Postgres95Channel.m
Normal file
File diff suppressed because it is too large
Load diff
71
EOAdaptors/Postgres95/Postgres95Context.h
Normal file
71
EOAdaptors/Postgres95/Postgres95Context.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
Postgres95Context.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
based on the Postgres95 adaptor written by
|
||||
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Postgres95Context_h__
|
||||
#define __Postgres95Context_h__
|
||||
|
||||
#import <EOAccess/EOAdaptorContext.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Adaptor.h>
|
||||
|
||||
|
||||
@interface Postgres95Context : EOAdaptorContext
|
||||
{
|
||||
NSString* _primaryKeySequenceNameFormat;
|
||||
struct
|
||||
{
|
||||
unsigned int didAutoBegin:1;
|
||||
unsigned int didBegin:1;
|
||||
unsigned int forceTransaction:1;
|
||||
} _flags;
|
||||
}
|
||||
|
||||
- initWithAdaptor: (EOAdaptor *)adaptor;
|
||||
|
||||
- (void)beginTransaction;
|
||||
- (void)commitTransaction;
|
||||
- (void)rollbackTransaction;
|
||||
|
||||
- (BOOL)canNestTransactions;
|
||||
|
||||
- (EOAdaptorChannel *)createAdaptorChannel;
|
||||
|
||||
- (BOOL)autoBeginTransaction: (BOOL)force;
|
||||
- (BOOL)autoCommitTransaction;
|
||||
|
||||
// format is something like @"%@_SEQ" or @"EOSEQ_%@", "%@" is replaced by external table name
|
||||
- (void)setPrimaryKeySequenceNameFormat: (NSString*)format;
|
||||
- (NSString*)primaryKeySequenceNameFormat;
|
||||
|
||||
- (BOOL)autoBeginTransaction: (BOOL)force;
|
||||
- (BOOL)autoCommitTransaction;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#endif /* __Postgres95Context_h__ */
|
318
EOAdaptors/Postgres95/Postgres95Context.m
Normal file
318
EOAdaptors/Postgres95/Postgres95Context.m
Normal file
|
@ -0,0 +1,318 @@
|
|||
/**
|
||||
Postgres95Context.m <title>Postgres95Context</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
based on the Postgres95 adaptor written by
|
||||
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: October 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
|
||||
#import <Postgres95EOAdaptor/Postgres95Adaptor.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Context.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Channel.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95SQLExpression.h>
|
||||
|
||||
|
||||
@implementation Postgres95Context
|
||||
|
||||
- (id)initWithAdaptor: (EOAdaptor *)adaptor
|
||||
{
|
||||
if ((self = [super initWithAdaptor: adaptor]))
|
||||
{
|
||||
if (adaptor)
|
||||
[self setPrimaryKeySequenceNameFormat:
|
||||
[(Postgres95Adaptor*)adaptor primaryKeySequenceNameFormat]];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)beginTransaction
|
||||
{
|
||||
Postgres95Channel *channel = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if ([self transactionNestingLevel])
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x: attempted to begin a transaction within a transaction",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
if (_delegateRespondsTo.shouldBegin)
|
||||
{
|
||||
if (![_delegate adaptorContextShouldBegin: self])
|
||||
[NSException raise: Postgres95Exception
|
||||
format: @"%@ -- %@ 0x%x: delegate refuses",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
}
|
||||
|
||||
channel = [[_channels objectAtIndex: 0] nonretainedObjectValue];
|
||||
|
||||
if ([channel isOpen] == NO)
|
||||
[NSException raise: Postgres95Exception
|
||||
format: @"cannot execute SQL expression. Channel is not opened."];
|
||||
|
||||
_flags.didBegin = YES;
|
||||
|
||||
[channel _evaluateExpression: [EOSQLExpression
|
||||
expressionForString: @"BEGIN TRANSACTION"]
|
||||
withAttributes: nil];
|
||||
|
||||
[self transactionDidBegin];
|
||||
|
||||
if (_delegateRespondsTo.didBegin)
|
||||
[_delegate adaptorContextDidBegin: self];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)commitTransaction
|
||||
{
|
||||
//channel conn
|
||||
//self transactionNestingLevel
|
||||
//self transactionDidCommit
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
if ([self transactionNestingLevel] == 0)
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x:illegal attempt to commit a transaction when there are none in progress",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
if (_delegateRespondsTo.shouldCommit)
|
||||
{
|
||||
if (![_delegate adaptorContextShouldCommit: self])
|
||||
[NSException raise: Postgres95Exception
|
||||
format: @"%@ -- %@ 0x%x: delegate refuses",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
}
|
||||
//???
|
||||
[[[_channels objectAtIndex: 0] nonretainedObjectValue]
|
||||
_evaluateExpression: [EOSQLExpression
|
||||
expressionForString: @"END TRANSACTION"]
|
||||
withAttributes: nil];
|
||||
|
||||
_flags.didBegin = NO;
|
||||
|
||||
[self transactionDidCommit];
|
||||
|
||||
if (_delegateRespondsTo.didCommit)
|
||||
[_delegate adaptorContextDidCommit: self];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)rollbackTransaction
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
if (![self transactionNestingLevel])
|
||||
{
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x:illegal attempt to commit a transaction when there are none in progress",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
}
|
||||
|
||||
if (_delegateRespondsTo.shouldRollback)
|
||||
{
|
||||
if (![_delegate adaptorContextShouldRollback: self])
|
||||
[NSException raise: Postgres95Exception
|
||||
format: @"%@ -- %@ 0x%x: delegate refuses",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self];
|
||||
}
|
||||
|
||||
[[[_channels objectAtIndex: 0] nonretainedObjectValue]
|
||||
_evaluateExpression: [EOSQLExpression
|
||||
expressionForString: @"ABORT TRANSACTION"]
|
||||
withAttributes: nil];
|
||||
|
||||
_flags.didBegin = NO;
|
||||
|
||||
[self transactionDidRollback];
|
||||
|
||||
if (_delegateRespondsTo.didRollback)
|
||||
[_delegate adaptorContextDidRollback: self];
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)canNestTransactions
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (EOAdaptorChannel *)createAdaptorChannel
|
||||
{
|
||||
//OK
|
||||
EOAdaptorChannel *adaptorChannel;
|
||||
|
||||
adaptorChannel = [Postgres95Channel adaptorChannelWithAdaptorContext: self];
|
||||
|
||||
return adaptorChannel;
|
||||
}
|
||||
|
||||
- (BOOL)autoBeginTransaction: (BOOL)force
|
||||
{
|
||||
//seems OK
|
||||
BOOL ok = NO;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"force=%d _flags.didBegin=%s [self transactionNestingLevel]=%d",
|
||||
force,
|
||||
(_flags.didBegin ? "YES" : "NO"),
|
||||
[self transactionNestingLevel]);
|
||||
|
||||
if (!_flags.didBegin && [self transactionNestingLevel] == 0)
|
||||
{
|
||||
if (force == YES)
|
||||
[self beginTransaction];
|
||||
|
||||
_flags.didAutoBegin = YES;
|
||||
_flags.forceTransaction = force;
|
||||
|
||||
ok = YES;
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
- (BOOL)autoCommitTransaction
|
||||
{
|
||||
//seems ok
|
||||
BOOL ok = NO;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
if (_flags.didAutoBegin)
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"_flags.forceTransaction=%s",
|
||||
(_flags.forceTransaction ? "YES" : "NO"));
|
||||
|
||||
if (_flags.forceTransaction == YES)
|
||||
{
|
||||
[self commitTransaction];
|
||||
}
|
||||
|
||||
_flags.didAutoBegin = NO;
|
||||
_flags.forceTransaction = NO;
|
||||
|
||||
ok = YES;
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didBegin=%s",
|
||||
(_flags.didBegin ? "YES" : "NO"));
|
||||
NSDebugMLLog(@"gsdb", @"_flags.didAutoBegin=%s",
|
||||
(_flags.didAutoBegin ? "YES" : "NO"));
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
/** format is something like @"%@_SEQ" or @"EOSEQ_%@", "%@" is replaced by external table name **/
|
||||
- (void)setPrimaryKeySequenceNameFormat: (NSString*)format
|
||||
{
|
||||
ASSIGN(_primaryKeySequenceNameFormat, format);
|
||||
}
|
||||
|
||||
- (NSString*)primaryKeySequenceNameFormat
|
||||
{
|
||||
return _primaryKeySequenceNameFormat;
|
||||
}
|
||||
|
||||
@end /* Postgres95Context */
|
||||
/*
|
||||
//TODO
|
||||
autoCommitTransaction
|
||||
{
|
||||
self commitTransaction
|
||||
};
|
||||
*/
|
23
EOAdaptors/Postgres95/Postgres95EOAdaptor.gsdoc
Normal file
23
EOAdaptors/Postgres95/Postgres95EOAdaptor.gsdoc
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE gsdoc PUBLIC "-//GNUstep//DTD gsdoc 0.6.7//EN" "http://www.gnustep.org/gsdoc-0_6_7.xml">
|
||||
<gsdoc base="index">
|
||||
<head>
|
||||
<title>GDL2 Postgres95 Adaptor</title>
|
||||
<author name="Mirko Viviani">
|
||||
<email address="mirko.viviani@rccr.cremona.it"/>
|
||||
<url url="http://www.gnustep.org/developers/whoiswho.html"/></author>
|
||||
<author name="Manuel Guesdon">
|
||||
<email address="mguesdon@orange-concept.com"/>
|
||||
<url url="http://www.gnustep.org/developers/whoiswho.html"/></author>
|
||||
</head>
|
||||
<body>
|
||||
<chapter>
|
||||
<heading>GDL2 Postgres95 Adaptor</heading>
|
||||
<p>...
|
||||
</p>
|
||||
</chapter>
|
||||
<back>
|
||||
<index scope="project" type="title" />
|
||||
</back>
|
||||
</body>
|
||||
</gsdoc>
|
57
EOAdaptors/Postgres95/Postgres95SQLExpression.h
Normal file
57
EOAdaptors/Postgres95/Postgres95SQLExpression.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
Postgres95SQLExpression.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Postgres95SQLExpression_h__
|
||||
#define __Postgres95SQLExpression_h__
|
||||
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
|
||||
|
||||
@class NSString;
|
||||
|
||||
|
||||
@interface Postgres95SQLExpression : EOSQLExpression
|
||||
|
||||
+ (NSString *)formatValue: (id)value
|
||||
forAttribute: (EOAttribute *)attribute;
|
||||
- (NSString *)externalNameQuoteCharacter;
|
||||
- (NSString *)lockClause;
|
||||
- (NSString *)assembleSelectStatementWithAttributes: (NSArray *)attributes
|
||||
lock: (BOOL)lock
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
fetchOrder: (NSArray *)fetchOrder
|
||||
selectString: (NSString *)selectString
|
||||
columnList: (NSString *)columnList
|
||||
tableList: (NSString *)tableList
|
||||
whereClause: (NSString *)whereClause
|
||||
joinClause: (NSString *)joinClause
|
||||
orderByClause: (NSString *)orderByClause
|
||||
lockClause: (NSString *)lockClause;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#endif /* __Postgres95SQLExpression_h__ */
|
299
EOAdaptors/Postgres95/Postgres95SQLExpression.m
Normal file
299
EOAdaptors/Postgres95/Postgres95SQLExpression.m
Normal file
|
@ -0,0 +1,299 @@
|
|||
/**
|
||||
Postgres95SQLExpression.m <title>Postgres95SQLExpression</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
This product includes software developed by Turbocat's Development.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
|
||||
#import <Postgres95EOAdaptor/Postgres95SQLExpression.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Values.h>
|
||||
|
||||
|
||||
@implementation Postgres95SQLExpression
|
||||
|
||||
+ (NSString *)formatValue: (id)value
|
||||
forAttribute: (EOAttribute *)attribute
|
||||
{
|
||||
NSString *formatted = nil;
|
||||
NSString *externalType;
|
||||
NSMutableString *string;
|
||||
const char *tempString;
|
||||
int i, dif;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"value=%@ class=%@", value,
|
||||
[value class]);
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"[EONull null] %p=%@ [EONull null] class=%@",
|
||||
[EONull null],
|
||||
[EONull null],
|
||||
[[EONull null] class]);
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"[value isEqual:[EONull null]]=%s",
|
||||
([value isEqual: [EONull null]] ? "YES" : "NO"));
|
||||
|
||||
externalType = [attribute externalType];
|
||||
|
||||
if (!value)
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"NULL case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = @"NULL";
|
||||
}
|
||||
else if ([value isEqual: [EONull null]])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"EONULL case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [value sqlString];
|
||||
}
|
||||
else if ([externalType hasPrefix: @"int"])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"int case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [NSString stringWithFormat: @"%@", value];
|
||||
|
||||
// value was for example 0 length string
|
||||
if ([formatted length] == 0)
|
||||
formatted = @"NULL";
|
||||
}
|
||||
else if ([externalType hasPrefix: @"float"])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"float case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [NSString stringWithFormat: @"%@", value];
|
||||
|
||||
// value was for example 0 length string
|
||||
if ([formatted length] == 0)
|
||||
formatted=@"NULL";
|
||||
}
|
||||
else if ([externalType hasPrefix: @"bool"])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"BOOL case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
if ([value isKindOfClass: [NSNumber class]] == YES)
|
||||
{
|
||||
BOOL boolValue = [value boolValue];
|
||||
|
||||
if (boolValue == NO)
|
||||
formatted = @"'f'";
|
||||
else
|
||||
formatted = @"'t'";
|
||||
}
|
||||
else
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"BOOL case/NSString - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [NSString stringWithFormat: @"'%@'", value];
|
||||
|
||||
// value was for example 0 length string
|
||||
if ([formatted length] == 0)
|
||||
formatted = @"NULL";
|
||||
}
|
||||
}
|
||||
else if ([externalType isEqualToString: @"oid"])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"OID case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [NSString stringWithFormat: @"%@", value];
|
||||
|
||||
// value was for example 0 length string
|
||||
if ([formatted length] == 0)
|
||||
formatted=@"NULL";
|
||||
}
|
||||
else if ([externalType isEqualToString: @"money"])
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"Money case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
formatted = [NSString stringWithFormat: @"'$%@'", value];
|
||||
|
||||
// value was for example 0 length string
|
||||
if ([formatted length] == 3) // only '$'
|
||||
formatted = @"NULL";
|
||||
}
|
||||
else if (([externalType isEqualToString: @"abstime"])
|
||||
|| ([externalType isEqualToString: @"datetime"])
|
||||
|| ([externalType isEqualToString: @"timestamp"]))
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"Time case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
if ([[value description] length] == 0)
|
||||
{
|
||||
NSWarnLog(@"empty description for %p %@ of class %@",
|
||||
value, value, [value class]);
|
||||
}
|
||||
// Value can also be a string...
|
||||
if ([value isKindOfClass:[NSDate class]])
|
||||
{
|
||||
formatted = [NSString stringWithFormat: @"'%@'",
|
||||
[value
|
||||
descriptionWithCalendarFormat:
|
||||
[NSCalendarDate postgres95Format]//@"%d/%m/%Y %H:%M:%S"
|
||||
timeZone: nil
|
||||
locale: nil]];
|
||||
}
|
||||
else
|
||||
formatted = [NSString stringWithFormat: @"'%@'",value];
|
||||
}
|
||||
else
|
||||
{
|
||||
int length = 0;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression",
|
||||
@"other case - value=%@ class=%@",
|
||||
value, [value class]);
|
||||
|
||||
string = [NSMutableString stringWithFormat: @"%@", value];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"string %p='%@'",
|
||||
string, string);
|
||||
|
||||
length=[string cStringLength];
|
||||
tempString = [string cString];
|
||||
|
||||
for (i = 0, dif = 0; i < length; i++)
|
||||
{
|
||||
switch (tempString[i])
|
||||
{
|
||||
case '\\':
|
||||
case '\'':
|
||||
[string insertString: @"\\" atIndex: dif + i];
|
||||
dif++;
|
||||
break;
|
||||
case '_':
|
||||
[string insertString: @"\\" atIndex: dif + i];
|
||||
dif++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
formatted = [NSString stringWithFormat: @"'%@'", string];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"formatted %p=%@",
|
||||
formatted, formatted);
|
||||
}
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"formatted=%@", formatted);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return formatted;
|
||||
}
|
||||
|
||||
- (NSString *)externalNameQuoteCharacter
|
||||
{
|
||||
if ([EOSQLExpression useQuotedExternalNames])
|
||||
return @"'";
|
||||
else
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (NSString *)lockClause
|
||||
{
|
||||
return @"FOR UPDATE";
|
||||
}
|
||||
|
||||
- (NSString *)assembleSelectStatementWithAttributes: (NSArray *)attributes
|
||||
lock: (BOOL)lock
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
fetchOrder: (NSArray *)fetchOrder
|
||||
selectString: (NSString *)selectString
|
||||
columnList: (NSString *)columnList
|
||||
tableList: (NSString *)tableList
|
||||
whereClause: (NSString *)whereClause
|
||||
joinClause: (NSString *)joinClause
|
||||
orderByClause: (NSString *)orderByClause
|
||||
lockClause: (NSString *)lockClause
|
||||
{
|
||||
//OK
|
||||
NSMutableString *sqlString = nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"selectString=%@", selectString);
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"columnList=%@", columnList);
|
||||
EOFLOGObjectLevelArgs(@"EOSQLExpression", @"tableList=%@", tableList);
|
||||
|
||||
sqlString = [NSMutableString stringWithFormat: @"%@ %@ FROM %@",
|
||||
selectString,
|
||||
columnList,
|
||||
tableList];
|
||||
|
||||
if (whereClause && joinClause)
|
||||
[sqlString appendFormat: @" WHERE %@ AND %@",
|
||||
whereClause,
|
||||
joinClause];
|
||||
else if (whereClause || joinClause)
|
||||
[sqlString appendFormat: @" WHERE %@",
|
||||
(whereClause ? whereClause : joinClause)];
|
||||
|
||||
if (orderByClause)
|
||||
[sqlString appendFormat: @" ORDER BY %@", orderByClause];
|
||||
|
||||
if (lockClause)
|
||||
[sqlString appendFormat: @" %@", lockClause];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return sqlString;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
79
EOAdaptors/Postgres95/Postgres95Values.h
Normal file
79
EOAdaptors/Postgres95/Postgres95Values.h
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
Postgres95Values.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __Postgres95Values_h__
|
||||
#define __Postgres95Values_h__
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
|
||||
#import <EOControl/EONull.h>
|
||||
|
||||
|
||||
@class EOAttribute;
|
||||
@class Postgres95Channel;
|
||||
|
||||
|
||||
extern NSString *Postgres95CalendarFormat;
|
||||
|
||||
|
||||
@interface Postgres95Values
|
||||
{
|
||||
}
|
||||
|
||||
+ (id)newValueForBytes: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
|
||||
+ (id)newValueForNumberType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
+ (id)newValueForCharactersType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
+ (id)newValueForBytesType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
+ (id)newValueForDateType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSCalendarDate (Postgres95ValueCreation)
|
||||
|
||||
+ (void)setPostgres95Format: (NSString *)_format;
|
||||
+ (NSString *)postgres95Format;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __Postgres95Values_h__ */
|
330
EOAdaptors/Postgres95/Postgres95Values.m
Normal file
330
EOAdaptors/Postgres95/Postgres95Values.m
Normal file
|
@ -0,0 +1,330 @@
|
|||
/**
|
||||
Postgres95Values.m
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
|
||||
#import <EOAccess/EOAccess.h>
|
||||
#import <EOAccess/EOAttribute.h>
|
||||
|
||||
#import <Postgres95EOAdaptor/Postgres95Adaptor.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Channel.h>
|
||||
#import <Postgres95EOAdaptor/Postgres95Values.h>
|
||||
|
||||
|
||||
void __postgres95_values_linking_function (void)
|
||||
{
|
||||
}
|
||||
|
||||
//NSString *Postgres95CalendarFormat = @"%m-%d-%Y %H:%M:%S %Z";
|
||||
NSString *Postgres95CalendarFormat = nil;
|
||||
|
||||
@implementation Postgres95Values
|
||||
|
||||
|
||||
+ (id)newValueForBytes: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
switch ([attribute adaptorValueType])
|
||||
{
|
||||
case EOAdaptorNumberType:
|
||||
return [self newValueForNumberType: bytes
|
||||
length: length
|
||||
attribute: attribute];
|
||||
case EOAdaptorCharactersType:
|
||||
return [self newValueForCharactersType: bytes
|
||||
length: length
|
||||
attribute: attribute];
|
||||
case EOAdaptorBytesType:
|
||||
return [self newValueForBytesType: bytes
|
||||
length: length
|
||||
attribute: attribute];
|
||||
case EOAdaptorDateType:
|
||||
return [self newValueForDateType: bytes
|
||||
length: length
|
||||
attribute: attribute];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
/**
|
||||
For efficiency reasons, the returned value is NOT autoreleased !
|
||||
**/
|
||||
+ (id)newValueForNumberType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
NSString *str = [NSString stringWithCString:(char *)bytes
|
||||
length:length];
|
||||
id value = nil;
|
||||
|
||||
if ([[attribute externalType] isEqualToString: @"bool"])
|
||||
{
|
||||
if (((char *)bytes)[0] == 't' && ((char *)bytes)[1] == 0)
|
||||
return [[NSNumber alloc] initWithBool:YES];
|
||||
if (((char *)bytes)[0] == 'f' && ((char *)bytes)[1] == 0)
|
||||
return [[NSNumber alloc] initWithBool:NO];
|
||||
}
|
||||
|
||||
if ([[attribute valueClassName] isEqualToString: @"NSDecimalNumber"])
|
||||
value = [[NSDecimalNumber decimalNumberWithString: str] retain];
|
||||
else if ([[attribute valueType] isEqualToString: @"i"])
|
||||
value = [[NSNumber alloc] initWithInt: [str intValue]];
|
||||
else
|
||||
value = [[NSNumber alloc] initWithDouble: [str doubleValue]];
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
For efficiency reasons, the returned value is NOT autoreleased !
|
||||
**/
|
||||
+ (id)newValueForCharactersType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return [attribute newValueForBytes: bytes
|
||||
length: length
|
||||
encoding: [NSString defaultCStringEncoding]];
|
||||
}
|
||||
|
||||
/**
|
||||
For efficiency reasons, the returned value is NOT autoreleased !
|
||||
**/
|
||||
+ (id)newValueForBytesType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
return [attribute newValueForBytes: bytes
|
||||
length: length];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
For efficiency reasons, the returned value is NOT autoreleased !
|
||||
**/
|
||||
+ (id)newValueForDateType: (const void *)bytes
|
||||
length: (int)length
|
||||
attribute: (EOAttribute *)attribute
|
||||
{
|
||||
id d;
|
||||
NSString *str = [NSString stringWithCString: bytes length: length];
|
||||
NSString *format = [NSCalendarDate postgres95Format];
|
||||
|
||||
d = [[[NSCalendarDate alloc] initWithString: str
|
||||
calendarFormat: format]
|
||||
// TODO server TZ ?
|
||||
retain];
|
||||
|
||||
// NSDebugMLLog(@"gsdb",@"str=%@ d=%@ format=%@",str,d,format);
|
||||
NSDebugMLog(@"str=%@ d=%@ format=%@", str, d, format);
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
/*
|
||||
@implementation NSString (Postgres95ValueCreation)
|
||||
|
||||
|
||||
For efficiency reasons, the returned value is NOT autoreleased !
|
||||
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute
|
||||
{
|
||||
if ([type isEqual:@"bytea"])
|
||||
return [[NSData alloc]initWithBytes:[self cString]
|
||||
length:[self cStringLength]]
|
||||
stringValueForPostgres95Type:type
|
||||
attribute:attribute];
|
||||
else
|
||||
return [[[[EOQuotedExpression alloc]
|
||||
initWithExpression:self
|
||||
quote:@"'"
|
||||
escape:@"\\'"]
|
||||
autorelease]
|
||||
expressionValueForContext:nil];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end // NSString (Postgres95ValueCreation)
|
||||
|
||||
|
||||
|
||||
@implementation NSNumber (Postgres95ValueCreation)
|
||||
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute;
|
||||
{
|
||||
if ([[attribute externalType] isEqualToString:@"bool"])
|
||||
return [self boolValue] ? @"'t'" : @"'f'";
|
||||
|
||||
return [self description];
|
||||
}
|
||||
|
||||
@end // NSNumber (Postgres95ValueCreation)
|
||||
|
||||
|
||||
@implementation NSData (Postgres95ValueCreation)
|
||||
|
||||
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute
|
||||
{
|
||||
if ([[attribute externalType] isEqualToString:@"bytea"]) {
|
||||
const char* bytes = [self bytes];
|
||||
int length = [self length];
|
||||
int final_length;
|
||||
char *description, *temp;
|
||||
int i;
|
||||
|
||||
if (!length)
|
||||
return @"''";
|
||||
|
||||
final_length = 4 + 2 * length + 1;
|
||||
description = Malloc (final_length);
|
||||
temp = description + 3;
|
||||
|
||||
description[0] = 0;
|
||||
strcat (description, "'0x");
|
||||
for (i = 0; i < length; i++, temp += 2)
|
||||
sprintf (temp, "%02X", (unsigned char)bytes[i]);
|
||||
temp[0] = '\'';
|
||||
temp[1] = 0;
|
||||
|
||||
return [[[NSString alloc]
|
||||
initWithCStringNoCopy:description
|
||||
length:final_length-1
|
||||
freeWhenDone:YES]
|
||||
autorelease];
|
||||
}
|
||||
|
||||
return [[NSString stringWithCString:[self bytes] length:[self length]]
|
||||
stringValueForPostgres95Type:type attribute:attribute];
|
||||
}
|
||||
|
||||
@end // NSData (Postgres95ValueCreation)
|
||||
|
||||
*/
|
||||
@implementation NSCalendarDate (Postgres95ValueCreation)
|
||||
/*
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute
|
||||
{
|
||||
NSString* externalType = [attribute externalType];
|
||||
if (!CALENDAR_FORMAT)
|
||||
[NSCalendarDate setPostgres95Format:[NSString stringWithCString:"%b %d %Y %I:%M%p %Z"]];
|
||||
|
||||
if ([externalType isEqualToString:@"abstime"]) {
|
||||
id tz = [attribute serverTimeZone];
|
||||
id date;
|
||||
|
||||
if (tz) {
|
||||
date = [[self copy] autorelease];
|
||||
[date setTimeZone:tz];
|
||||
}
|
||||
else
|
||||
date = self;
|
||||
|
||||
return [NSString stringWithFormat:@"'%@'",
|
||||
[date descriptionWithCalendarFormat:CALENDAR_FORMAT]];
|
||||
}
|
||||
|
||||
THROW([[DataTypeMappingNotSupportedException alloc]
|
||||
initWithFormat:@"Postgres95 cannot map NSCalendarDate in "
|
||||
@"attribute %@ to external type %@",
|
||||
[attribute name], externalType]);
|
||||
return nil;
|
||||
}
|
||||
*/
|
||||
|
||||
+ (NSString*)postgres95Format
|
||||
{
|
||||
if (!Postgres95CalendarFormat)
|
||||
//Mirko: @"%d/%m/%Y %H:%M:%S.00 %Z"
|
||||
[NSCalendarDate setPostgres95Format: [NSString stringWithCString: "%m-%d-%Y %H:%M:%S %Z"]]; //"%b %d %Y %I:%M%p %Z"]];
|
||||
|
||||
return Postgres95CalendarFormat;
|
||||
}
|
||||
|
||||
+ (void)setPostgres95Format: (NSString*)_format
|
||||
{
|
||||
ASSIGN(Postgres95CalendarFormat, _format);
|
||||
}
|
||||
|
||||
|
||||
@end // NSCalendarDate (Postgres95ValueCreation)
|
||||
|
||||
/*
|
||||
@implementation EONull (Postgres95ValueCreation)
|
||||
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute
|
||||
{
|
||||
return @"NULL";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation NSObject (Postgres95ValueCreation)
|
||||
|
||||
- stringValueForPostgres95Type:(NSString*)type
|
||||
attribute:(EOAttribute*)attribute
|
||||
{
|
||||
if ([self respondsToSelector:@selector(stringForType:)])
|
||||
return [[self stringForType:[attribute valueType]]
|
||||
stringValueForPostgres95Type:type attribute:attribute];
|
||||
else if ([self respondsToSelector:@selector(dataForType:)])
|
||||
return [[self dataForType:[attribute valueType]]
|
||||
stringValueForPostgres95Type:type attribute:attribute];
|
||||
else
|
||||
THROW([[DataTypeMappingNotSupportedException alloc]
|
||||
initWithFormat:@"Postgres95 cannot map value class %@ "
|
||||
@"because its instances does not responds to either "
|
||||
@" `stringForType:' or `dataForType:'. ",
|
||||
NSStringFromClass([self class])]);
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end // NSObject (Postgres95ValueCreation)
|
||||
*/
|
194
EOControl/EOAndQualifier.m
Normal file
194
EOControl/EOAndQualifier.m
Normal file
|
@ -0,0 +1,194 @@
|
|||
/**
|
||||
EOAndQualifier.m <title>EOAndQualifier Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: January 2002
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EOQualifier.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
|
||||
|
||||
@implementation EOAndQualifier
|
||||
|
||||
+ (EOQualifier *)qualifierWithQualifierArray: (NSArray *)array
|
||||
{
|
||||
return [[[self alloc] initWithQualifierArray: array] autorelease];
|
||||
}
|
||||
|
||||
+ (EOQualifier *)qualifierWithQualifiers: (EOQualifier *)qualifiers, ...
|
||||
{
|
||||
NSMutableArray *qualArray = [NSMutableArray array];
|
||||
EOQualifier *tmpId;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, qualifiers);
|
||||
|
||||
for (tmpId = qualifiers; tmpId != nil;)
|
||||
{
|
||||
[qualArray addObject: tmpId];
|
||||
tmpId = va_arg(ap, id);
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return [[[self alloc] initWithQualifierArray: qualArray] autorelease];
|
||||
}
|
||||
|
||||
- (id) initWithQualifiers: (EOQualifier *)qualifiers, ...
|
||||
{
|
||||
NSMutableArray *qualArray = [NSMutableArray array];
|
||||
EOQualifier *tmpId;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, qualifiers);
|
||||
|
||||
for (tmpId = qualifiers; tmpId != nil;)
|
||||
{
|
||||
[qualArray addObject: tmpId];
|
||||
tmpId = va_arg(ap, id);
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
|
||||
return [self initWithQualifierArray: qualArray];
|
||||
}
|
||||
|
||||
- (id) initWithQualifierArray: (NSArray *)array
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(_qualifiers, array);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_qualifiers);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSArray *)qualifiers
|
||||
{
|
||||
return _qualifiers;
|
||||
}
|
||||
|
||||
- (id)copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOAndQualifier *qual = [[EOAndQualifier allocWithZone: zone] init];
|
||||
|
||||
qual->_qualifiers = [_qualifiers copyWithZone: zone];
|
||||
|
||||
return qual;
|
||||
}
|
||||
|
||||
- (BOOL)evaluateWithObject: (id)object
|
||||
{
|
||||
NSEnumerator *qualifiersEnum;
|
||||
EOQualifier *qualifier;
|
||||
|
||||
qualifiersEnum = [_qualifiers objectEnumerator];
|
||||
|
||||
while ((qualifier = [qualifiersEnum nextObject]))
|
||||
{
|
||||
if ([qualifier evaluateWithObject: object] == NO)
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (id) qualifierMigratedFromEntity: (id)param0
|
||||
relationshipPath: (id)param1
|
||||
{
|
||||
return [self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (void) _addBindingsToDictionary: (id)param0
|
||||
{
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (EOQualifier *) qualifierWithBindings: (NSDictionary *)bindings
|
||||
requiresAllVariables: (BOOL)requiresAllVariables
|
||||
{
|
||||
EOFLOGObjectLevelArgs(@"EOQualifier", @"bindings=%@", bindings);
|
||||
|
||||
if ([bindings count] > 0)
|
||||
{
|
||||
NSEmitTODO();
|
||||
return [self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
else
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithKeyValueUnarchiver: (id)param0
|
||||
{
|
||||
return [self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (void) encodeWithKeyValueArchiver: (id)param0
|
||||
{
|
||||
[self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (id) validateKeysWithRootClassDescription: (id)param0
|
||||
{
|
||||
return [self notImplemented: _cmd]; //TODO
|
||||
}
|
||||
|
||||
- (id) description
|
||||
{
|
||||
NSString *dscr;
|
||||
|
||||
dscr = [NSString stringWithFormat: @"<%s %p - qualifiers: %@>",
|
||||
object_get_class_name(self),
|
||||
(void*)self,
|
||||
_qualifiers];
|
||||
|
||||
return dscr;
|
||||
}
|
||||
|
||||
@end
|
86
EOControl/EOCheapArray.h
Normal file
86
EOControl/EOCheapArray.h
Normal file
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
EOCheapArray.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: Sep 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOCheapArray_h__
|
||||
#define __EOCheapArray_h__
|
||||
|
||||
@interface EOCheapCopyArray : NSArray
|
||||
{
|
||||
unsigned int _count;
|
||||
id *_contents_array;
|
||||
unsigned int _refcount;
|
||||
}
|
||||
|
||||
- (id) initWithArray: (id)array;
|
||||
- (id) initWithObjects: (id*)objects
|
||||
count: (unsigned int)count;
|
||||
- (void) dealloc;
|
||||
- (void) release;
|
||||
- (unsigned int) retainCount;
|
||||
- (id) retain;
|
||||
- (id) objectAtIndex: (unsigned int)index;
|
||||
//- (id) copyWithZone: (NSZone*)zone;
|
||||
- (unsigned int) count;
|
||||
//- (BOOL) containsObject: (id)obejct;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOCheapCopyMutableArray : NSMutableArray
|
||||
{
|
||||
unsigned int _count;
|
||||
id *_contents_array;
|
||||
unsigned int _capacity;
|
||||
unsigned int _grow_factor;
|
||||
id _immutableCopy;
|
||||
}
|
||||
|
||||
- (id) initWithCapacity: (unsigned int)capacity;
|
||||
- (id) initWithObjects: (id*)objects
|
||||
count: (unsigned int)count;
|
||||
- (id) initWithArray: (NSArray*)array;
|
||||
- (void) dealloc;
|
||||
- (id) shallowCopy;
|
||||
- (void) _setCopy: (id)param0;
|
||||
- (void) _mutate;
|
||||
- (unsigned int) count;
|
||||
- (id) objectAtIndex: (unsigned int)index;
|
||||
- (void) addObject: (id)object;
|
||||
- (void) insertObject: (id)object
|
||||
atIndex: (unsigned int)index;
|
||||
- (void) removeLastObject;
|
||||
- (void) removeObjectAtIndex: (unsigned int)index;
|
||||
- (void) replaceObjectAtIndex: (unsigned int)index
|
||||
withObject: (id)object;
|
||||
//- (BOOL) containsObject: (id)object;
|
||||
//- (unsigned int) indexOfObjectIdenticalTo: (id)object;
|
||||
//- (void) removeAllObjects;
|
||||
- (void) exchangeObjectAtIndex: (unsigned int)index1
|
||||
withObjectAtIndex: (unsigned int)index2;
|
||||
@end
|
||||
|
||||
|
||||
#endif //__EOCheapArray_h__
|
446
EOControl/EOCheapArray.m
Normal file
446
EOControl/EOCheapArray.m
Normal file
|
@ -0,0 +1,446 @@
|
|||
/**
|
||||
EOCheapArray.m <title>EOCheapCopyArray Classes</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: Sep 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <EOControl/EOCheapArray.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
@implementation EOCheapCopyArray : NSArray
|
||||
|
||||
- (id) initWithArray: (id)array
|
||||
{
|
||||
if ((self = [super initWithArray: array]))
|
||||
{
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithObjects: (id*)objects
|
||||
count: (unsigned int)count
|
||||
{
|
||||
if (count > 0)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
_contents_array = NSZoneMalloc([self zone], sizeof(id) * count);
|
||||
|
||||
if (_contents_array == 0)
|
||||
{
|
||||
RELEASE(self);
|
||||
return nil;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((_contents_array[i] = RETAIN(objects[i])) == nil)
|
||||
{
|
||||
_count = i;
|
||||
RELEASE(self);
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"Tried to add nil"];
|
||||
}
|
||||
}
|
||||
|
||||
_count = count;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"Deallocate EOCheapCopyArray %p", self);
|
||||
|
||||
if (_contents_array)
|
||||
{
|
||||
#if !GS_WITH_GC
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < _count; i++)
|
||||
{
|
||||
[_contents_array[i] release];
|
||||
}
|
||||
#endif
|
||||
NSZoneFree([self zone], _contents_array);
|
||||
}
|
||||
|
||||
NSDeallocateObject(self);
|
||||
}
|
||||
|
||||
- (void) release
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"Release EOCheapCopyArray %p", self);
|
||||
//TODO-NOW
|
||||
}
|
||||
|
||||
- (unsigned int) retainCount
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"retainCount EOCheapCopyArray %p", self);
|
||||
//TODO-NOW
|
||||
return 1;
|
||||
}
|
||||
|
||||
- (id) retain
|
||||
{
|
||||
//TODO-NOW
|
||||
NSDebugMLLog(@"gsdb", @"retain EOCheapCopyArray %p", self);
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) objectAtIndex: (unsigned int)index
|
||||
{
|
||||
if (index >= _count)
|
||||
{
|
||||
[NSException raise: NSRangeException
|
||||
format: @"Index out of bounds"];
|
||||
}
|
||||
|
||||
return _contents_array[index];
|
||||
}
|
||||
|
||||
//- (id) copyWithZone: (NSZone*)zone;
|
||||
- (unsigned int) count
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
//- (BOOL) containsObject: (id)obejct;
|
||||
@end
|
||||
|
||||
@implementation EOCheapCopyMutableArray
|
||||
|
||||
- (id) initWithCapacity: (unsigned int)capacity
|
||||
{
|
||||
if (capacity == 0)
|
||||
{
|
||||
capacity = 1;
|
||||
}
|
||||
|
||||
_contents_array = NSZoneMalloc([self zone], sizeof(id) * capacity);
|
||||
_capacity = capacity;
|
||||
_grow_factor = capacity > 1 ? capacity/2 : 1;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithObjects: (id*)objects
|
||||
count: (unsigned int)count
|
||||
{
|
||||
self = [self initWithCapacity: count];
|
||||
|
||||
if (self != nil && count > 0)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
if ((_contents_array[i] = RETAIN(objects[i])) == nil)
|
||||
{
|
||||
_count = i;
|
||||
RELEASE(self);
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"Tried to add nil"];
|
||||
}
|
||||
}
|
||||
_count = count;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithArray:(NSArray*)array
|
||||
{
|
||||
_grow_factor = 5;
|
||||
|
||||
if ((self = [super initWithArray: array]))
|
||||
{
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"Deallocate EOCheapCopyArray %p", self);
|
||||
|
||||
if (_contents_array)
|
||||
{
|
||||
#if !GS_WITH_GC
|
||||
unsigned i;
|
||||
for (i = 0; i < _count; i++)
|
||||
{
|
||||
[_contents_array[i] release];
|
||||
}
|
||||
#endif
|
||||
NSZoneFree([self zone], _contents_array);
|
||||
}
|
||||
|
||||
DESTROY(_immutableCopy);
|
||||
NSDeallocateObject(self);
|
||||
}
|
||||
|
||||
- (id) shallowCopy
|
||||
{
|
||||
//OK
|
||||
if (!_immutableCopy)
|
||||
{
|
||||
_immutableCopy= [[EOCheapCopyArray alloc]
|
||||
initWithObjects: _contents_array
|
||||
count: _count];
|
||||
}
|
||||
|
||||
return _immutableCopy;
|
||||
}
|
||||
|
||||
- (void) _setCopy: (id)param0
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
- (void) _mutate
|
||||
{
|
||||
DESTROY(_immutableCopy);
|
||||
}
|
||||
|
||||
- (unsigned int) count
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
- (id) objectAtIndex: (unsigned int)index
|
||||
{
|
||||
if (index >= _count)
|
||||
{
|
||||
[NSException raise: NSRangeException
|
||||
format: @"Index out of bounds"];
|
||||
}
|
||||
|
||||
return _contents_array[index];
|
||||
}
|
||||
|
||||
- (void)addObject: (id)object
|
||||
{
|
||||
//7d0
|
||||
//im=530
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"self %p=%@", self, self);
|
||||
NSDebugMLLog(@"gsdb", @"object %p of class %@=%@",
|
||||
object,
|
||||
[object class],
|
||||
object);
|
||||
|
||||
if (!object)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"Tried to add nil"];
|
||||
}
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"self %p=%@", self, self);
|
||||
|
||||
[self _mutate];
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"self %p=%@", self, self);
|
||||
|
||||
if (_count >= _capacity)
|
||||
{
|
||||
unsigned int grow = (_grow_factor>5 ? _grow_factor : 5);
|
||||
size_t size = (_capacity + grow) * sizeof(id);
|
||||
id *ptr;
|
||||
|
||||
ptr = NSZoneRealloc([self zone], _contents_array, size);
|
||||
|
||||
if (ptr == 0)
|
||||
{
|
||||
[NSException raise: NSMallocException
|
||||
format: @"Unable to grow"];
|
||||
}
|
||||
|
||||
_contents_array = ptr;
|
||||
_capacity += _grow_factor;
|
||||
_grow_factor = _capacity / 2;
|
||||
}
|
||||
|
||||
_contents_array[_count] = RETAIN(object);
|
||||
_count++; // Do this AFTER we have retained the object.
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"self %p=%@", self, self);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void) insertObject: (id)object
|
||||
atIndex: (unsigned int)index
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (!object)
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"Tried to insert nil"];
|
||||
}
|
||||
|
||||
if (index > _count)
|
||||
{
|
||||
[NSException raise: NSRangeException
|
||||
format:
|
||||
@"in insertObject:atIndex:, index %d is out of range",
|
||||
index];
|
||||
}
|
||||
|
||||
[self _mutate];
|
||||
|
||||
if (_count == _capacity)
|
||||
{
|
||||
id *ptr;
|
||||
size_t size = (_capacity + _grow_factor) * sizeof(id);
|
||||
|
||||
ptr = NSZoneRealloc([self zone], _contents_array, size);
|
||||
|
||||
if (ptr == 0)
|
||||
{
|
||||
[NSException raise: NSMallocException
|
||||
format: @"Unable to grow"];
|
||||
}
|
||||
|
||||
_contents_array = ptr;
|
||||
_capacity += _grow_factor;
|
||||
_grow_factor = _capacity / 2;
|
||||
}
|
||||
|
||||
for (i = _count; i > index; i--)
|
||||
{
|
||||
_contents_array[i] = _contents_array[i - 1];
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure the array is 'sane' so that it can be deallocated
|
||||
* safely by an autorelease pool if the '[anObject retain]' causes
|
||||
* an exception.
|
||||
*/
|
||||
_contents_array[index] = nil;
|
||||
_count++;
|
||||
_contents_array[index] = RETAIN(object);
|
||||
}
|
||||
|
||||
- (void) removeLastObject
|
||||
{
|
||||
if (_count == 0)
|
||||
{
|
||||
[NSException raise: NSRangeException
|
||||
format: @"Trying to remove from an empty array."];
|
||||
}
|
||||
|
||||
[self _mutate];
|
||||
_count--;
|
||||
|
||||
RELEASE(_contents_array[_count]);
|
||||
}
|
||||
|
||||
- (void) removeObjectAtIndex: (unsigned int)index
|
||||
{
|
||||
id obj;
|
||||
|
||||
if (index >= _count)
|
||||
{
|
||||
[NSException raise: NSRangeException
|
||||
format: @"in removeObjectAtIndex:, index %d is out of range",
|
||||
index];
|
||||
}
|
||||
obj = _contents_array[index];
|
||||
[self _mutate];
|
||||
_count--;
|
||||
|
||||
while (index < _count)
|
||||
{
|
||||
_contents_array[index] = _contents_array[index+1];
|
||||
index++;
|
||||
}
|
||||
|
||||
RELEASE(obj); /* Adjust array BEFORE releasing object. */
|
||||
}
|
||||
|
||||
- (void) replaceObjectAtIndex: (unsigned int)index
|
||||
withObject: (id)object;
|
||||
{
|
||||
id obj;
|
||||
|
||||
if (index >= _count)
|
||||
{
|
||||
[NSException raise: NSRangeException format:
|
||||
@"in replaceObjectAtIndex:withObject:, index %d is out of range",
|
||||
index];
|
||||
}
|
||||
|
||||
/*
|
||||
* Swap objects in order so that there is always a valid object in the
|
||||
* array in case a retain or release causes an exception.
|
||||
*/
|
||||
obj = _contents_array[index];
|
||||
[self _mutate];
|
||||
|
||||
IF_NO_GC(RETAIN(object));
|
||||
_contents_array[index] = object;
|
||||
|
||||
RELEASE(obj);
|
||||
}
|
||||
|
||||
//TODO implement it for speed ?? - (BOOL) containsObject:(id)object
|
||||
//TODO implement it for speed ?? - (unsigned int) indexOfObjectIdenticalTo:(id)object
|
||||
//TODO implement it for speed ?? - (void) removeAllObjects;
|
||||
- (void) exchangeObjectAtIndex: (unsigned int)index1
|
||||
withObjectAtIndex: (unsigned int)index2
|
||||
{
|
||||
id obj = nil;
|
||||
|
||||
if (index1 >= _count || index2>=_count)
|
||||
{
|
||||
[NSException raise: NSRangeException format:
|
||||
@"in exchangeObjectAtIndex:withObjectAtIndex:, index %d is out of range",
|
||||
(index1 >= _count ? index1 : index2)];
|
||||
}
|
||||
|
||||
obj = _contents_array[index1];
|
||||
|
||||
[self _mutate];
|
||||
|
||||
_contents_array[index1] = _contents_array[index2];
|
||||
_contents_array[index2] = obj;
|
||||
}
|
||||
|
||||
@end
|
226
EOControl/EOClassDescription.h
Normal file
226
EOControl/EOClassDescription.h
Normal file
|
@ -0,0 +1,226 @@
|
|||
/*
|
||||
EOClassDescription.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOClassDescription_h__
|
||||
#define __EOClassDescription_h__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSException.h>
|
||||
|
||||
@class NSDictionary;
|
||||
@class NSFormatter;
|
||||
@class EOEditingContext;
|
||||
@class EOGlobalID;
|
||||
@class EORelationship;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EODeleteRuleNullify = 0,
|
||||
EODeleteRuleCascade,
|
||||
EODeleteRuleDeny,
|
||||
EODeleteRuleNoAction
|
||||
} EODeleteRule;
|
||||
|
||||
@interface EOClassDescription : NSObject
|
||||
|
||||
+ (void)registerClassDescription: (EOClassDescription *)description
|
||||
forClass: (Class)aClass;
|
||||
|
||||
+ (void)invalidateClassDescriptionCache;
|
||||
|
||||
+ (EOClassDescription *)classDescriptionForClass: (Class)aClass;
|
||||
|
||||
+ (EOClassDescription *)classDescriptionForEntityName: (NSString *)entityName;
|
||||
|
||||
+ (void)setClassDelegate: (id)delegate;
|
||||
+ (id)classDelegate;
|
||||
|
||||
// Must be implemented by subclasses.
|
||||
- (NSString *)entityName;
|
||||
|
||||
- (id)createInstanceWithEditingContext: (EOEditingContext *)editingContext
|
||||
globalID: (EOGlobalID *)globalID
|
||||
zone: (NSZone *)zone;
|
||||
|
||||
- (void)awakeObject: (id)object
|
||||
fromInsertionInEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)awakeObject: (id)object
|
||||
fromFetchInEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)propagateDeleteForObject: (id)object
|
||||
editingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (NSArray *)attributeKeys;
|
||||
- (NSArray *)toOneRelationshipKeys;
|
||||
- (NSArray *)toManyRelationshipKeys;
|
||||
- (EORelationship *)relationshipNamed: (NSString *)relationshipName;
|
||||
- (EORelationship *)anyRelationshipNamed: (NSString *)relationshipNamed;
|
||||
|
||||
- (NSString *)inverseForRelationshipKey: (NSString *)relationshipKey;
|
||||
|
||||
- (EODeleteRule)deleteRuleForRelationshipKey: (NSString *)relationshipKey;
|
||||
|
||||
- (BOOL)ownsDestinationObjectsForRelationshipKey: (NSString *)relationshipKey;
|
||||
|
||||
- (EOClassDescription *)classDescriptionForDestinationKey: (NSString *)detailKey;
|
||||
|
||||
- (NSFormatter *)defaultFormatterForKey: (NSString *)key;
|
||||
|
||||
- (NSString *)displayNameForKey: (NSString *)key;
|
||||
|
||||
- (NSString *)userPresentableDescriptionForObject: (id)anObject;
|
||||
|
||||
- (NSException *)validateValue: (id *)valueP forKey: (NSString *)key;
|
||||
|
||||
- (NSException *)validateObjectForSave: (id)object;
|
||||
|
||||
- (NSException *)validateObjectForDelete: (id)object;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (EOInitialization)
|
||||
|
||||
- initWithEditingContext: (EOEditingContext *)ec
|
||||
classDescription: (EOClassDescription *)classDesc
|
||||
globalID: (EOGlobalID *)globalID;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (EOClassDescriptionPrimitives)
|
||||
|
||||
- (EOClassDescription *)classDescription;
|
||||
|
||||
- (NSString *)entityName;
|
||||
- (NSArray *)attributeKeys;
|
||||
- (NSArray *)toOneRelationshipKeys;
|
||||
- (NSArray *)toManyRelationshipKeys;
|
||||
- (NSString *)inverseForRelationshipKey: (NSString *)relationshipKey;
|
||||
- (EODeleteRule)deleteRuleForRelationshipKey: (NSString *)relationshipKey;
|
||||
- (BOOL)ownsDestinationObjectsForRelationshipKey: (NSString *)relationshipKey;
|
||||
- (EOClassDescription *)classDescriptionForDestinationKey: (NSString *)detailKey;
|
||||
|
||||
- (NSString *)userPresentableDescription;
|
||||
|
||||
- (NSException *)validateValue: (id *)valueP forKey: (NSString *)key;
|
||||
|
||||
- (NSException *)validateForSave;
|
||||
|
||||
- (NSException *)validateForDelete;
|
||||
|
||||
- (void)awakeFromInsertionInEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)awakeFromFetchInEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
// Notifications:
|
||||
|
||||
extern NSString *EOClassDescriptionNeededNotification;
|
||||
extern NSString *EOClassDescriptionNeededForClassNotification;
|
||||
|
||||
extern NSString *EOClassDescriptionNeededForEntityNameNotification;
|
||||
|
||||
|
||||
@interface NSArray(EOShallowCopy)
|
||||
|
||||
- (NSArray *)shallowCopy;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (EOClassDescriptionExtras)
|
||||
|
||||
- (NSDictionary *)snapshot;
|
||||
|
||||
- (void)updateFromSnapshot: (NSDictionary *)snapshot;
|
||||
|
||||
- (BOOL)isToManyKey: (NSString *)key;
|
||||
|
||||
- (NSException *)validateForInsert;
|
||||
- (NSException *)validateForUpdate;
|
||||
|
||||
- (NSArray *)allPropertyKeys;
|
||||
|
||||
- (void)clearProperties;
|
||||
|
||||
- (void)propagateDeleteWithEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (NSString *)eoShallowDescription;
|
||||
- (NSString *)eoDescription;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (EOKeyRelationshipManipulation)
|
||||
|
||||
- (void)addObject: object toPropertyWithKey: (NSString *)key;
|
||||
|
||||
- (void)removeObject: object fromPropertyWithKey: (NSString *)key;
|
||||
|
||||
- (void)addObject: object toBothSidesOfRelationshipWithKey: (NSString *)key;
|
||||
- (void)removeObject: object
|
||||
fromBothSidesOfRelationshipWithKey: (NSString *)key;
|
||||
|
||||
@end
|
||||
|
||||
// Validation exceptions (with name EOValidationException)
|
||||
extern NSString *EOValidationException;
|
||||
extern NSString *EOAdditionalExceptionsKey;
|
||||
extern NSString *EOValidatedObjectUserInfoKey;
|
||||
extern NSString *EOValidatedPropertyUserInfoKey;
|
||||
|
||||
@interface NSException (EOValidationError)
|
||||
|
||||
+ (NSException *)validationExceptionWithFormat: (NSString *)format, ...;
|
||||
+ (NSException *)aggregateExceptionWithExceptions: (NSArray *)subexceptions;
|
||||
- (NSException *)exceptionAddingEntriesToUserInfo: (NSDictionary *)additions;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (EOClassDescriptionClassDelegate)
|
||||
|
||||
- (BOOL)shouldPropagateDeleteForObject: (id)object
|
||||
inEditingContext: (EOEditingContext *)ec
|
||||
forRelationshipKey: (NSString *)key;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSObject (_EOValueMerging)
|
||||
|
||||
- (void)mergeValue: (id)value forKey: (id)key;
|
||||
- (void)mergeChangesFromDictionary: (NSDictionary *)changes;
|
||||
- (NSDictionary *)changesFromSnapshot: (NSDictionary *)snapshot;
|
||||
- (void)reapplyChangesFromSnapshot: (NSDictionary *)changes;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSObject (_EOEditingContext)
|
||||
-(EOEditingContext*)editingContext;
|
||||
@end
|
||||
|
||||
#endif
|
1716
EOControl/EOClassDescription.m
Normal file
1716
EOControl/EOClassDescription.m
Normal file
File diff suppressed because it is too large
Load diff
52
EOControl/EOControl.h
Normal file
52
EOControl/EOControl.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
EOControl.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOControl_h__
|
||||
#define __EOControl_h__
|
||||
|
||||
|
||||
#import <EOControl/EOSortOrdering.h>
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
#import <EOControl/EOGenericRecord.h>
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
#import <EOControl/EOKeyValueCoding.h>
|
||||
#import <EOControl/EOQualifier.h>
|
||||
#import <EOControl/EONull.h>
|
||||
#import <EOControl/EOKeyValueArchiver.h>
|
||||
#import <EOControl/EOGlobalID.h>
|
||||
#import <EOControl/EOKeyGlobalID.h>
|
||||
#import <EOControl/EOObjectStore.h>
|
||||
#import <EOControl/EOObjectStoreCoordinator.h>
|
||||
#import <EOControl/EOFault.h>
|
||||
#import <EOControl/EOEditingContext.h>
|
||||
#import <EOControl/EODataSource.h>
|
||||
#import <EOControl/EODetailDataSource.h>
|
||||
#import <EOControl/EOObserver.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
|
||||
#endif /* __EOControl_h__ */
|
||||
|
63
EOControl/EODataSource.h
Normal file
63
EOControl/EODataSource.h
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
EODataSource.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EODataSource_h__
|
||||
#define __EODataSource_h__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSArray;
|
||||
@class NSDictionary;
|
||||
@class EOEditingContext;
|
||||
@class EOClassDescription;
|
||||
|
||||
|
||||
@interface EODataSource : NSObject
|
||||
|
||||
- (id)createObject;
|
||||
|
||||
- (void)insertObject: object;
|
||||
|
||||
- (void)deleteObject: object;
|
||||
|
||||
- (NSArray *)fetchObjects;
|
||||
|
||||
- (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)qualifyWithRelationshipKey: (NSString *)key ofObject: sourceObject;
|
||||
|
||||
- (EODataSource *)dataSourceQualifiedByKey: (NSString *)key;
|
||||
|
||||
- (EOClassDescription *)classDescriptionForObjects;
|
||||
|
||||
- (NSArray *)qualifierBindingKeys;
|
||||
|
||||
- (void)setQualifierBindings: (NSDictionary *)bindings;
|
||||
- (NSDictionary *)qualifierBindings;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
119
EOControl/EODataSource.m
Normal file
119
EOControl/EODataSource.m
Normal file
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
EODataSource.m <title>EODataSource Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EODataSource.h>
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
#import <EOControl/EOEditingContext.h>
|
||||
|
||||
@implementation EODataSource
|
||||
|
||||
- (id)createObject
|
||||
{
|
||||
id object;
|
||||
EOClassDescription *cd;
|
||||
EOEditingContext *receiverEdCtxt;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
cd = [self classDescriptionForObjects];
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"cd=%@", cd);
|
||||
|
||||
object = [cd createInstanceWithEditingContext: nil
|
||||
globalID: nil
|
||||
zone: NULL];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"object=%@", object);
|
||||
|
||||
if (object && (receiverEdCtxt = [self editingContext]))
|
||||
[receiverEdCtxt insertObject: object];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
- (void)insertObject: object
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (void)deleteObject: object
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (NSArray *)fetchObjects
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOEditingContext *)editingContext
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)qualifyWithRelationshipKey: (NSString *)key ofObject: sourceObject
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (EODataSource *)dataSourceQualifiedByKey: (NSString *)key
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOClassDescription *)classDescriptionForObjects
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *)qualifierBindingKeys
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setQualifierBindings: (NSDictionary *)bindings
|
||||
{
|
||||
}
|
||||
|
||||
- (NSDictionary *)qualifierBindings
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
266
EOControl/EODebug.h
Normal file
266
EOControl/EODebug.h
Normal file
|
@ -0,0 +1,266 @@
|
|||
/* debug.h - debug
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
|
||||
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||
Date: Jan 1999
|
||||
|
||||
This file is part of the GNUstep Web Library.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
// $Id$
|
||||
|
||||
#ifndef _EODebug_h__
|
||||
#define _EODebug_h__
|
||||
|
||||
// call with --GNU-Debug=EOFFn
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
#include <Foundation/NSDebug.h>
|
||||
#include <Foundation/NSAutoreleasePool.h>
|
||||
|
||||
extern void EOFLogC_(const char* file,int line,const char* string);
|
||||
extern void EOFLogDumpObject_(const char* file,int line,id object,int deep);
|
||||
extern void EOFLogAssertGood_(const char* file,int line,NSObject* object);
|
||||
|
||||
#define EOFLogC(cString); EOFLogC_(__FILE__,__LINE__,cString);
|
||||
#define EOFLogDumpObject(object,deep); EOFLogDumpObject_(__FILE__,__LINE__,object,deep);
|
||||
#define EOFLogAssertGood(object); EOFLogAssertGood_(__FILE__,__LINE__,object);
|
||||
#else // no DEBUG
|
||||
#define EOFLogC(cString);
|
||||
#define EOFLogDumpObject(object,deep);
|
||||
#define EOFLogAssertGood(object);
|
||||
#endif // DEBUG
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
// call in Class-Methods
|
||||
|
||||
#define EOFLOGClassFnStart() \
|
||||
do { if (GSDebugSet(@"EOFFn") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStartCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) && GSDebugSet(cond) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnStartOrCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnStartOrCond2(cond1,cond2) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond1) == YES) || (GSDebugSet(cond2) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnStop() \
|
||||
do { if (GSDebugSet(@"EOFFn") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__,__FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) && GSDebugSet(cond) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnStopOrCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__,__FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnStopOrCond2(cond1,cond2) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond1) == YES) || (GSDebugSet(cond2) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__,__FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassLevel(level,format) \
|
||||
do { if (GSDebugSet(level) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg( \
|
||||
__PRETTY_FUNCTION__, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassLevelArgs(level, format, args...) \
|
||||
do { if (GSDebugSet(level) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg( \
|
||||
__PRETTY_FUNCTION__, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt, ## args); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGClassFnNotImplemented() \
|
||||
do { if (GSDebugSet(@"EOFdflt") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,@"NOT IMPLEMENTED"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
|
||||
|
||||
// call in Instance-Methods
|
||||
|
||||
#define EOFLOGObjectFnStart() \
|
||||
do { if (GSDebugSet(@"EOFFn") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStartOrCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStartOrCond2(cond1,cond2) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond1) == YES) || (GSDebugSet(cond2) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTART"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStop() \
|
||||
do { if (GSDebugSet(@"EOFFn") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopOrCond(cond) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopOrCond2(cond1,cond2) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond1) == YES) || (GSDebugSet(cond2) == YES)) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"FNSTOP"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopPlain(fmt) \
|
||||
do { if (GSDebugSet(@"EOFFn") == YES) { \
|
||||
NSLog(fmt); }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopOrCondPlain(cond,fmt) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond) == YES)) { \
|
||||
NSLog(fmt); }} while (0)
|
||||
|
||||
#define EOFLOGObjectFnStopOrCond2Plain(cond1,cond2,fmt) \
|
||||
do { if ((GSDebugSet(@"EOFFn") == YES) || (GSDebugSet(cond1) == YES) || (GSDebugSet(cond2) == YES)) { \
|
||||
NSLog(fmt); }} while (0)
|
||||
|
||||
#define EOFLOGObjectLevel(level,format) \
|
||||
do { if (GSDebugSet(level) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg( \
|
||||
self, _cmd, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObjectLevelArgs(level, format, args...) \
|
||||
do { if (GSDebugSet(level) == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg( \
|
||||
self, _cmd, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt, ## args); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGObject(format) \
|
||||
do { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg( \
|
||||
self, _cmd, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt); [tmpPool release]; } while (0)
|
||||
|
||||
#define EOFLOGObjectArgs(format, args...) \
|
||||
do { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg( \
|
||||
self, _cmd, __FILE__, __LINE__, format); \
|
||||
NSLog(fmt, ## args); [tmpPool release]; }while (0)
|
||||
|
||||
#define EOFLOGObjectFnNotImplemented() \
|
||||
do { if (GSDebugSet(@"EOFdflt") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__,@"NOT IMPLEMENTED"); \
|
||||
NSLog(fmt); [tmpPool release]; }} while (0)
|
||||
|
||||
|
||||
|
||||
// call everywhere
|
||||
|
||||
#define EOFLOGException(format) \
|
||||
do { if (GSDebugSet(@"exception") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,format); \
|
||||
NSString *fmt2 = [NSString stringWithFormat:@"*EXCEPTION*: %@",fmt]; \
|
||||
NSLog(@"%@",fmt2); [tmpPool release]; }} while (0)
|
||||
|
||||
#define EOFLOGExceptionArgs(format, args...) \
|
||||
do { if (GSDebugSet(@"exception") == YES) { \
|
||||
NSAutoreleasePool *tmpPool = [NSAutoreleasePool new]; \
|
||||
NSString *fmt = GSDebugFunctionMsg(__PRETTY_FUNCTION__, __FILE__, __LINE__,format); \
|
||||
NSString *fmt2 = [NSString stringWithFormat:@"*EXCEPTION*: %@",fmt]; \
|
||||
NSLog(fmt2, ## args); [tmpPool release]; }} while (0)
|
||||
|
||||
#else // no DEBUG
|
||||
|
||||
#define EOFLOGClassFnStart() {}
|
||||
#define EOFLOGClassFnStartCond() {}
|
||||
#define EOFLOGClassFnStartOrCond(cond) {}
|
||||
#define EOFLOGClassFnStartOrCond2(cond1,cond2) {}
|
||||
#define EOFLOGClassFnStop() {}
|
||||
#define EOFLOGClassFnStopCond() {}
|
||||
#define EOFLOGClassFnStopOrCond(cond) {}
|
||||
#define EOFLOGClassFnStopOrCond2(cond1,cond2) {}
|
||||
#define EOFLOGClassLevel(level,format) {}
|
||||
#define EOFLOGClassLevelArgs(level,format,args...) {}
|
||||
#define EOFLOGClassFnNotImplemented() {}
|
||||
|
||||
#define EOFLOGObjectFnStart() {}
|
||||
#define EOFLOGObjectFnStartCond(cond) {}
|
||||
#define EOFLOGObjectFnStartOrCond(cond) {}
|
||||
#define EOFLOGObjectFnStartOrCond2(cond1,cond2) {}
|
||||
#define EOFLOGObjectFnStop() {}
|
||||
#define EOFLOGObjectFnStopCond(cond) {}
|
||||
#define EOFLOGObjectFnStopOrCond(cond) {}
|
||||
#define EOFLOGObjectFnStopOrCond2(cond1,cond2) {}
|
||||
#define EOFLOGObjectFnStopPlain(fmt) {}
|
||||
#define EOFLOGObjectFnStopOrCondPlain(cond,fmt) {}
|
||||
#define EOFLOGObjectFnStopOrCond2Plain(cond1,cond2,fmt) {}
|
||||
#define EOFLOGObjectLevel(level,format) {}
|
||||
#define EOFLOGObjectLevelArgs(level,format,args...) {}
|
||||
#define EOFLOGObject(format) {}
|
||||
#define EOFLOGObjectArgs(format,args...) {}
|
||||
#define EOFLOGObjectFnNotImplemented() {}
|
||||
|
||||
#define EOFLOGException(format) {}
|
||||
#define EOFLOGExceptionArgs(format, args...) {}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NSEmitTODO
|
||||
#define NSEmitTODO(); NSLog(@"DVLP WARNING %s (%d): TODO",(char*)__FILE__,(int)__LINE__);
|
||||
#endif
|
||||
|
||||
#endif // _EODebug_h__
|
402
EOControl/EODebug.m
Normal file
402
EOControl/EODebug.m
Normal file
|
@ -0,0 +1,402 @@
|
|||
/* EODebug.m - <title>debug</title>
|
||||
|
||||
Copyright (C) 1999-2002 Free Software Foundation, Inc.
|
||||
|
||||
Written by: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: Jan 1999
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
#include <Foundation/NSThread.h>
|
||||
#include <Foundation/NSAutoreleasePool.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define USTART NSAutoreleasePool* arp=[NSAutoreleasePool new];
|
||||
#define USTOP DESTROY(arp);
|
||||
|
||||
|
||||
@interface NSObject (GSISA)
|
||||
|
||||
-(Class)isa;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSObject (GSISA)
|
||||
|
||||
-(Class)isa
|
||||
{
|
||||
return self->isa;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
void EOFLogC_(const char *file, int line, const char *string)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
if ([NSThread isMultiThreaded])
|
||||
{
|
||||
NSThread *t = [NSThread currentThread];
|
||||
|
||||
fprintf(stderr,"TID=");
|
||||
#if 0
|
||||
if (t && t->_thread_id)
|
||||
fprintf(stderr,"%p [%ld] (%d) ",(void*)t->_thread_id,(long)t->_thread_id,(int)getpid());
|
||||
else
|
||||
#endif
|
||||
{
|
||||
void *tid = (void*)objc_thread_id();
|
||||
fprintf(stderr, "%p [%ld] (%d) ", tid, (long)tid, (int)getpid());
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "File %s: %d. ", file, line);
|
||||
fprintf(stderr, string);
|
||||
|
||||
len = strlen(string);
|
||||
|
||||
if (len <= 0 || string[len-1] != '\n')
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
NSString *objectDescription(id object)
|
||||
{
|
||||
NSString *description = nil;
|
||||
|
||||
if ([object respondsToSelector: @selector(description)])
|
||||
{
|
||||
NS_DURING
|
||||
description = [object description];
|
||||
NS_HANDLER
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
NSString *IVarInString(const char* _type, void* _value)
|
||||
{
|
||||
if (_type && _value)
|
||||
{
|
||||
switch (*_type)
|
||||
{
|
||||
case _C_ID:
|
||||
{
|
||||
id *pvalue = (id*)_value;
|
||||
return [NSString stringWithFormat:
|
||||
@"object:%ld Class:%s Description:%@",
|
||||
(long)(*pvalue),
|
||||
[*pvalue class],
|
||||
objectDescription(*pvalue)];
|
||||
}
|
||||
break;
|
||||
case _C_CLASS:
|
||||
{
|
||||
Class *pvalue = (Class*)_value;
|
||||
return [NSString stringWithFormat: @"Class:%s",
|
||||
class_get_class_name(*pvalue)];
|
||||
}
|
||||
break;
|
||||
case _C_SEL:
|
||||
{
|
||||
SEL *pvalue = (SEL*)_value;
|
||||
return [NSString stringWithFormat: @"SEL:%s",
|
||||
sel_get_name(*pvalue)];
|
||||
}
|
||||
break;
|
||||
case _C_CHR:
|
||||
{
|
||||
char *pvalue = (char*)_value;
|
||||
return [NSString stringWithFormat: @"CHAR:%c",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_UCHR:
|
||||
{
|
||||
unsigned char *pvalue = (unsigned char*)_value;
|
||||
return [NSString stringWithFormat: @"UCHAR:%d",
|
||||
(int)*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_SHT:
|
||||
{
|
||||
short *pvalue = (short*)_value;
|
||||
return [NSString stringWithFormat: @"SHORT:%d",
|
||||
(int)*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_USHT:
|
||||
{
|
||||
unsigned short *pvalue = (unsigned short*)_value;
|
||||
return [NSString stringWithFormat: @"USHORT:%d",
|
||||
(int)*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_INT:
|
||||
{
|
||||
int *pvalue = (int*)_value;
|
||||
return [NSString stringWithFormat: @"INT:%d",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_UINT:
|
||||
{
|
||||
unsigned int *pvalue = (unsigned int*)_value;
|
||||
return [NSString stringWithFormat: @"UINT:%u",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_LNG:
|
||||
{
|
||||
long *pvalue = (long*)_value;
|
||||
return [NSString stringWithFormat: @"LONG:%ld",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_ULNG:
|
||||
{
|
||||
unsigned long *pvalue = (unsigned long*)_value;
|
||||
return [NSString stringWithFormat: @"ULONG:%lu",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_FLT:
|
||||
{
|
||||
float *pvalue = (float*)_value;
|
||||
return [NSString stringWithFormat: @"FLOAT:%f",
|
||||
(double)*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_DBL:
|
||||
{
|
||||
double *pvalue = (double*)_value;
|
||||
return [NSString stringWithFormat: @"DOUBLE:%f",
|
||||
*pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_VOID:
|
||||
{
|
||||
void *pvalue = (void*)_value;
|
||||
return [NSString stringWithFormat: @"VOID:*%lX",
|
||||
(unsigned long)pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_CHARPTR:
|
||||
{
|
||||
char *pvalue = (void*)_value;
|
||||
return [NSString stringWithFormat: @"CHAR*:%s",
|
||||
pvalue];
|
||||
}
|
||||
break;
|
||||
case _C_PTR:
|
||||
{
|
||||
return [NSString stringWithFormat: @"PTR"];
|
||||
}
|
||||
break;
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
return [NSString stringWithFormat: @"STRUCT"];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return [NSString stringWithFormat: @"Unknown"];
|
||||
}
|
||||
}
|
||||
else
|
||||
return [NSString stringWithString: @"NULL type or NULL pValue"];
|
||||
}
|
||||
|
||||
NSString *TypeToNSString(const char* _type)
|
||||
{
|
||||
if (_type)
|
||||
{
|
||||
switch (*_type)
|
||||
{
|
||||
case _C_ID:
|
||||
{ // '@'
|
||||
const char *t = _type + 1;
|
||||
|
||||
if (*t == '"')
|
||||
{
|
||||
const char *start = t + 1;
|
||||
|
||||
do
|
||||
{
|
||||
t++;
|
||||
}
|
||||
while ((*t != '"') && (*t != '\0'));
|
||||
|
||||
return [[NSString stringWithCString: start
|
||||
length: (t - start)]
|
||||
stringByAppendingString: @" *"];
|
||||
}
|
||||
else
|
||||
return @"id";
|
||||
};
|
||||
break;
|
||||
case _C_CLASS: return @"Class";
|
||||
case _C_SEL: return @"SEL";
|
||||
case _C_CHR: return @"char";
|
||||
case _C_UCHR: return @"unsigned char";
|
||||
case _C_SHT: return @"short";
|
||||
case _C_USHT: return @"unsigned short";
|
||||
case _C_INT: return @"int";
|
||||
case _C_UINT: return @"unsigned int";
|
||||
case _C_LNG: return @"long";
|
||||
case _C_ULNG: return @"unsigned long";
|
||||
// case _C_LNG_LNG: return @"long long";
|
||||
// case _C_ULNG_LNG: return @"unsigned long long";
|
||||
case _C_FLT: return @"float";
|
||||
case _C_DBL: return @"double";
|
||||
case _C_VOID: return @"void";
|
||||
case _C_CHARPTR: return @"char *";
|
||||
case _C_PTR:
|
||||
return [NSString stringWithFormat: @"%@ *",
|
||||
TypeToNSString(_type + 1)];
|
||||
break;
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
NSString *structName = nil;
|
||||
const char *t = _type + 1;
|
||||
|
||||
if (*t == '?')
|
||||
structName = @"?";
|
||||
else
|
||||
{
|
||||
const char *beg = t;
|
||||
|
||||
while ((*t != '=') && (*t != '\0') && (*t != _C_STRUCT_E))
|
||||
t++;
|
||||
structName = [NSString stringWithCString:beg length:(t - beg)];
|
||||
}
|
||||
|
||||
return [NSString stringWithFormat: @"struct %@ {...}", structName];
|
||||
}
|
||||
|
||||
default:
|
||||
return [NSString stringWithFormat: @"%s", _type];
|
||||
}
|
||||
}
|
||||
else
|
||||
return [NSString stringWithString: @"NULL type"];
|
||||
}
|
||||
|
||||
void DumpIVar(id object, struct objc_ivar *ivar, int deep)
|
||||
{
|
||||
if (ivar && object && deep >= 0)
|
||||
{
|
||||
void *pValue = ((void*)object) + ivar->ivar_offset;
|
||||
NSString *pType = TypeToNSString(ivar->ivar_type);
|
||||
NSString *pIVar = IVarInString(ivar->ivar_type,pValue);
|
||||
|
||||
NSDebugFLog(@"IVar %s type:%@ value:%@\n",
|
||||
ivar->ivar_name,
|
||||
pType,
|
||||
pIVar);
|
||||
|
||||
if (deep > 0 && ivar->ivar_type && *ivar->ivar_type == _C_ID && pValue)
|
||||
{
|
||||
EOFLogDumpObject_(NULL, 0, *((id*)pValue), deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Dump object
|
||||
void EOFLogDumpObject_(const char *file, int line, id object, int deep)
|
||||
{
|
||||
USTART
|
||||
|
||||
if (object && deep > 0)
|
||||
{
|
||||
struct objc_ivar_list *ivars = NULL;
|
||||
Class class = [object class];
|
||||
|
||||
if (class)
|
||||
{
|
||||
NSDebugFLog(@"--%s %d [%d] Dumping object %p of Class %s Description:%@\n",
|
||||
(file && isalpha(*file) && line >= 0
|
||||
&& line<=20000) ? file :"",
|
||||
line,
|
||||
deep,
|
||||
(void*)object,
|
||||
class->name,
|
||||
objectDescription(object));
|
||||
while (class)
|
||||
{
|
||||
ivars = class->ivars;
|
||||
class = class->super_class;
|
||||
|
||||
if (ivars)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ivars->ivar_count; i++)
|
||||
{
|
||||
DumpIVar(object,&ivars->ivar_list[i],deep-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
USTOP
|
||||
}
|
||||
|
||||
void EOFLogAssertGood_(const char *file, int line, NSObject *object)
|
||||
{
|
||||
if (object)
|
||||
{
|
||||
if ([object isa] == ((Class)0xdeadface))
|
||||
{
|
||||
NSLog(@"DEAD FACE: object %p isa=%p in %s at %d\n",
|
||||
(void*)object,
|
||||
(void*)[object isa],
|
||||
file,
|
||||
line);
|
||||
NSCParameterAssert([object isa] == (Class)0xdeadface);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"NULL: object %p in %s at %d\n",
|
||||
(void*)object,
|
||||
file,
|
||||
line);
|
||||
NSCParameterAssert(object);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
62
EOControl/EODetailDataSource.h
Normal file
62
EOControl/EODetailDataSource.h
Normal file
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
EODetailDataSource.m
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <EOControl/EODataSource.h>
|
||||
|
||||
|
||||
@interface EODetailDataSource : EODataSource <NSCoding>
|
||||
{
|
||||
EODataSource *_masterDataSource;
|
||||
id _masterObject;
|
||||
NSString *_detailKey;
|
||||
NSString *_masterClassDescriptionName;
|
||||
}
|
||||
|
||||
+ (EODetailDataSource *)detailDataSourceWithMasterDataSource: (EODataSource *)master
|
||||
detailKey: (NSString *)detailKey;
|
||||
|
||||
- initWithMasterClassDescription: (EOClassDescription *)masterClassDescription
|
||||
detailKey: (NSString *)detailKey;
|
||||
|
||||
- initWithMasterDataSource: (EODataSource *)master
|
||||
detailKey: (NSString *)detailKey;
|
||||
|
||||
- (id) initWithKeyValueUnarchiver: (EOKeyValueUnarchiver *)unarchiver;
|
||||
|
||||
- (EODataSource *)masterDataSource;
|
||||
|
||||
- (EOClassDescription *)masterClassDescription;
|
||||
- (void)setMasterClassDescription: (EOClassDescription *)classDescription;
|
||||
- (EOClassDescription *)classDescriptionForObjects;
|
||||
|
||||
- (void)qualifyWithRelationshipKey: (NSString *)key
|
||||
ofObject: masterObject;
|
||||
- (NSString *)detailKey;
|
||||
- (id)masterObject;
|
||||
|
||||
- (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
271
EOControl/EODetailDataSource.m
Normal file
271
EOControl/EODetailDataSource.m
Normal file
|
@ -0,0 +1,271 @@
|
|||
/**
|
||||
EODetailDataSource.m <title>EODetailDataSource Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: July 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSCoder.h>
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EODetailDataSource.h>
|
||||
#import <EOControl/EOKeyValueCoding.h>
|
||||
#import <EOControl/EOClassDescription.h>
|
||||
|
||||
|
||||
@implementation EODetailDataSource
|
||||
|
||||
+ (EODetailDataSource *)detailDataSourceWithMasterDataSource: (EODataSource *)master
|
||||
detailKey: (NSString *)detailKey
|
||||
{
|
||||
return [[[self alloc] initWithMasterDataSource: master
|
||||
detailKey: detailKey] autorelease];
|
||||
}
|
||||
|
||||
- initWithMasterClassDescription: (EOClassDescription *)masterClassDescription
|
||||
detailKey: (NSString *)detailKey
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
[self setMasterClassDescription: masterClassDescription];
|
||||
[self qualifyWithRelationshipKey: detailKey
|
||||
ofObject: nil];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- initWithMasterDataSource: (EODataSource *)master
|
||||
detailKey: (NSString *)detailKey
|
||||
{
|
||||
ASSIGN(_masterDataSource, master);
|
||||
|
||||
return [self initWithMasterClassDescription: nil
|
||||
detailKey: detailKey];
|
||||
}
|
||||
|
||||
- (id)initWithKeyValueUnarchiver: (EOKeyValueUnarchiver *)unarchiver
|
||||
{
|
||||
//OK
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if ((self = [self init]))
|
||||
{
|
||||
NSString* detailKey=nil;
|
||||
NSString* masterClassDescriptionName=nil;
|
||||
EOClassDescription* masterClassDescription=nil;
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource",@"EODetailDataSource %p",self);
|
||||
|
||||
detailKey = [unarchiver decodeObjectForKey: @"detailKey"];
|
||||
masterClassDescriptionName = [unarchiver decodeObjectForKey:
|
||||
@"masterClassDescription"];
|
||||
masterClassDescription = [EOClassDescription
|
||||
classDescriptionForEntityName:
|
||||
masterClassDescriptionName];
|
||||
|
||||
[self setMasterClassDescription: masterClassDescription];
|
||||
[self qualifyWithRelationshipKey: detailKey
|
||||
ofObject: nil];
|
||||
|
||||
EOFLOGObjectLevelArgs(@"EODataSource", @"EODetailDataSource %p : %@",
|
||||
self, self);
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_masterDataSource);
|
||||
DESTROY(_masterObject);
|
||||
DESTROY(_detailKey);
|
||||
DESTROY(_masterClassDescriptionName);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (EODataSource *)masterDataSource
|
||||
{
|
||||
return _masterDataSource;
|
||||
}
|
||||
|
||||
- (EOClassDescription *)masterClassDescription
|
||||
{
|
||||
return [EOClassDescription classDescriptionForEntityName:
|
||||
_masterClassDescriptionName];
|
||||
}
|
||||
|
||||
- (void)setMasterClassDescription: (EOClassDescription *)classDescription
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
ASSIGN(_masterClassDescriptionName, [classDescription entityName]);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (EOClassDescription *)classDescriptionForObjects
|
||||
{
|
||||
EOClassDescription *cd;
|
||||
EOClassDescription *masterCD;
|
||||
NSString *detailKey;
|
||||
|
||||
detailKey = [self detailKey];
|
||||
NSAssert(detailKey, @"No detailKey");
|
||||
|
||||
masterCD = [self masterClassDescription];
|
||||
NSAssert(masterCD, @"No masterClassDescription");
|
||||
|
||||
cd = [masterCD classDescriptionForDestinationKey: detailKey];
|
||||
|
||||
return cd;
|
||||
}
|
||||
|
||||
- (void)qualifyWithRelationshipKey: (NSString *)key
|
||||
ofObject: masterObject
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
ASSIGN(_detailKey, key);
|
||||
ASSIGN(_masterObject, masterObject);
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (NSString *)detailKey
|
||||
{
|
||||
return _detailKey;
|
||||
}
|
||||
|
||||
- (id)masterObject
|
||||
{
|
||||
return _masterObject;
|
||||
}
|
||||
|
||||
- (EOEditingContext *)editingContext
|
||||
{
|
||||
return [_masterObject editingContext];
|
||||
}
|
||||
|
||||
- (NSArray *)fetchObjects
|
||||
{
|
||||
id value=nil;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if(!_masterObject)
|
||||
value = [NSArray array];
|
||||
else if(!_detailKey)
|
||||
value = [NSArray arrayWithObject: _masterObject];
|
||||
else
|
||||
{
|
||||
value = [_masterObject valueForKey: _detailKey];
|
||||
|
||||
if (value)
|
||||
{
|
||||
if (![value isKindOfClass: [NSArray class]])
|
||||
value = [NSArray arrayWithObject: value];
|
||||
}
|
||||
else
|
||||
value = [NSArray array];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
- (void)insertObject: (id)object
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if (!_masterObject)
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x: no masterObject",
|
||||
NSStringFromSelector(_cmd), NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
if (!_detailKey)
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x: no detailKey",
|
||||
NSStringFromSelector(_cmd), NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
[_masterObject addObject: object
|
||||
toBothSidesOfRelationshipWithKey: _detailKey];
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (void)deleteObject: (id)object
|
||||
{
|
||||
if (!_masterObject)
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x: no masterObject",
|
||||
NSStringFromSelector(_cmd), NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
if (!_detailKey)
|
||||
[NSException raise: NSInternalInconsistencyException
|
||||
format: @"%@ -- %@ 0x%x: no detailKey",
|
||||
NSStringFromSelector(_cmd), NSStringFromClass([self class]),
|
||||
self];
|
||||
|
||||
[_masterObject removeObject: object fromPropertyWithKey: _detailKey];
|
||||
}
|
||||
|
||||
- (id)initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
ASSIGN(_masterDataSource, [coder decodeObject]);
|
||||
ASSIGN(_masterObject, [coder decodeObject]);
|
||||
ASSIGN(_detailKey, [coder decodeObject]);
|
||||
ASSIGN(_masterClassDescriptionName, [coder decodeObject]);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
[coder encodeObject: _masterDataSource];
|
||||
[coder encodeObject: _masterObject];
|
||||
[coder encodeObject: _detailKey];
|
||||
[coder encodeObject: _masterClassDescriptionName];
|
||||
}
|
||||
|
||||
@end
|
359
EOControl/EOEditingContext.h
Normal file
359
EOControl/EOEditingContext.h
Normal file
|
@ -0,0 +1,359 @@
|
|||
/*
|
||||
EOEditingContext.h
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Date: June 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOEditingContext_h__
|
||||
#define __EOEditingContext_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <EOControl/EOObjectStore.h>
|
||||
#import <EOControl/EOObserver.h>
|
||||
|
||||
@interface EOEditingContext : EOObjectStore <EOObserving>
|
||||
{
|
||||
EOObjectStore *_objectStore;
|
||||
NSUndoManager *_undoManager;
|
||||
NSHashTable *_unprocessedChanges;
|
||||
NSHashTable *_unprocessedDeletes;
|
||||
NSHashTable *_unprocessedInserts;
|
||||
NSHashTable *_insertedObjects;
|
||||
NSHashTable *_deletedObjects;
|
||||
NSHashTable *_changedObjects;
|
||||
|
||||
NSMapTable *_objectsById;
|
||||
NSMapTable *_objectsByGID;
|
||||
NSMutableDictionary *_snapshotsByGID;
|
||||
NSMutableDictionary *_eventSnapshotsByGID;
|
||||
|
||||
id _delegate;
|
||||
NSMutableArray *_editors;
|
||||
id _messageHandler;
|
||||
unsigned short _undoTransactionID;
|
||||
struct {
|
||||
unsigned registeredForCallback:1;
|
||||
unsigned propagatesDeletesAtEndOfEvent:1;
|
||||
unsigned ignoreChangeNotification:1;
|
||||
unsigned exhaustiveValidation:1;// unsigned stopsValidation:1;
|
||||
unsigned autoLocking:1;
|
||||
unsigned processingChanges:1;// unsigned savingChanges:1;
|
||||
unsigned skipInvalidateOnDealloc:1;
|
||||
unsigned useCommittedSnapshot:1;
|
||||
unsigned registeredUndoTransactionID:1;
|
||||
unsigned retainsAllRegisteredObjects:1;
|
||||
unsigned lockUsingParent:1;
|
||||
unsigned unused:5;
|
||||
} _flags;
|
||||
struct {
|
||||
unsigned willRunLoginPanel:1;
|
||||
unsigned shouldFetchObjects:1;
|
||||
unsigned shouldInvalidateObject:1;
|
||||
unsigned shouldMergeChanges:1;
|
||||
unsigned shouldPresentException:1;
|
||||
unsigned shouldUndoUserActions:1;
|
||||
unsigned shouldValidateChanges:1;
|
||||
unsigned willSaveChanges:1;
|
||||
} _delegateRespondsTo;
|
||||
|
||||
NSRecursiveLock*_lock;
|
||||
int _lockCount;
|
||||
id _notificationQueue;
|
||||
NSAutoreleasePool * _lockPool;
|
||||
}
|
||||
|
||||
+ (void)setInstancesRetainRegisteredObjects: (BOOL)flag;
|
||||
+ (BOOL)instancesRetainRegisteredObjects;
|
||||
|
||||
- initWithParentObjectStore:(EOObjectStore *)parentObjectStore;
|
||||
|
||||
- init;
|
||||
|
||||
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- (void)insertObject: (id)object;
|
||||
- (void)insertObject: object
|
||||
withGlobalID: (EOGlobalID *)gid;
|
||||
- (void)_insertObject: (id)object
|
||||
withGlobalID: (EOGlobalID *)gid;
|
||||
|
||||
- (void)deleteObject: (id)object;
|
||||
|
||||
- (void)lockObject: (id)object;
|
||||
|
||||
- (BOOL)hasChanges;
|
||||
|
||||
- (void)saveChanges;
|
||||
|
||||
- (void)revert;
|
||||
|
||||
- (id)objectForGlobalID: (EOGlobalID *)globalID;
|
||||
- (EOGlobalID *)globalIDForObject: object;
|
||||
|
||||
- (void)setDelegate: (id)delegate;
|
||||
- (id)delegate;
|
||||
|
||||
- (EOObjectStore *)parentObjectStore;
|
||||
|
||||
- (EOObjectStore *)rootObjectStore;
|
||||
|
||||
|
||||
- (void)setUndoManager: (NSUndoManager *)undoManager;
|
||||
- (NSUndoManager *)undoManager;
|
||||
|
||||
- (void) _observeUndoManagerNotifications;
|
||||
|
||||
- (void)objectWillChange: (id)object;
|
||||
|
||||
- (void)recordObject: (id)object
|
||||
globalID: (EOGlobalID *)globalID;
|
||||
|
||||
- (void)forgetObject: (id)object;
|
||||
|
||||
- (void) registerUndoForModifiedObject: (id)object;
|
||||
|
||||
- (NSArray *)registeredObjects;
|
||||
|
||||
- (NSArray *)updatedObjects;
|
||||
- (NSArray *)insertedObjects;
|
||||
- (NSArray *)deletedObjects;
|
||||
|
||||
- (void) _processDeletedObjects;
|
||||
- (void) _processOwnedObjectsUsingChangeTable: (NSHashTable*)changeTable
|
||||
deleteTable: (NSHashTable*)deleteTable;
|
||||
- (void) propagatesDeletesUsingTable: (NSHashTable*)deleteTable;
|
||||
- (void) validateDeletesUsingTable: (NSHashTable*)deleteTable;
|
||||
- (BOOL) validateTable: (NSHashTable*)table
|
||||
withSelector: (SEL)sel
|
||||
exceptionArray: (NSMutableArray**)exceptionArray
|
||||
continueAfterFailure: (BOOL)continueAfterFailure;
|
||||
|
||||
|
||||
- (void)processRecentChanges;
|
||||
- (void) _registerClearStateWithUndoManager;
|
||||
|
||||
- (BOOL)propagatesDeletesAtEndOfEvent;
|
||||
- (void)setPropagatesDeletesAtEndOfEvent: (BOOL)propagatesDeletesAtEndOfEvent;
|
||||
|
||||
- (BOOL)stopsValidationAfterFirstError;
|
||||
- (void)setStopsValidationAfterFirstError: (BOOL)yn;
|
||||
|
||||
- (BOOL)locksObjectsBeforeFirstModification;
|
||||
- (void)setLocksObjectsBeforeFirstModification: (BOOL)yn;
|
||||
|
||||
/** Returns a dictionary containing a snapshot of object
|
||||
that reflects its committed values (last values putted in
|
||||
the database; i.e. values before changes were made on the
|
||||
object).
|
||||
It is updated after commiting new values.
|
||||
**/
|
||||
- (NSDictionary *)committedSnapshotForObject: (id)object;
|
||||
|
||||
/** Returns a dictionary containing a snapshot of object
|
||||
with its state as it was at the beginning of the current
|
||||
event loop.
|
||||
After the end of the current event, upon invocation of
|
||||
processRecentChanges, the snapshot is updated to hold the
|
||||
modified state of the object.**/
|
||||
- (NSDictionary *)currentEventSnapshotForObject: (id)object;
|
||||
|
||||
- (NSDictionary *)uncommittedChangesForObject: (id)object;
|
||||
|
||||
- (void)refaultObjects;
|
||||
|
||||
- (void)setInvalidatesObjectsWhenFreed: (BOOL)yn;
|
||||
- (BOOL)invalidatesObjectsWhenFreed;
|
||||
|
||||
- (void)addEditor: (id)editor;
|
||||
- (void)removeEditor: (id)editor;
|
||||
- (NSArray *)editors;
|
||||
|
||||
- (void)setMessageHandler: (id)handler;
|
||||
- (id)messageHandler;
|
||||
|
||||
|
||||
- (id)faultForGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (id)faultForRawRow: (NSDictionary *)row
|
||||
entityNamed: (NSString *)entityName
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (id)faultForRawRow: (NSDictionary *)row
|
||||
entityNamed: (NSString *)entityName;
|
||||
|
||||
- (NSArray *)arrayFaultWithSourceGlobalID: (EOGlobalID *)globalID
|
||||
relationshipName: (NSString *)name
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)initializeObject: (id)object
|
||||
withGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)objectsForSourceGlobalID: (EOGlobalID *)globalID
|
||||
relationshipName: (NSString *)name
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)refaultObject: object
|
||||
withGlobalID: (EOGlobalID *)globalID
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)saveChangesInEditingContext: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)objectsWithFetchSpecification: (EOFetchSpecification *)fetchSpecification
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void)lockObjectWithGlobalID: (EOGlobalID *)gid
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (BOOL)isObjectLockedWithGlobalID: (EOGlobalID *)gid
|
||||
editingContext: (EOEditingContext *)context;
|
||||
|
||||
- (void) clearOriginalSnapshotForObject: (id)object;
|
||||
|
||||
@end
|
||||
|
||||
// used with NSRunLoop's performSelector:target:argument:order:modes:
|
||||
enum {
|
||||
EOEditingContextFlushChangesRunLoopOrdering = 300000
|
||||
};
|
||||
|
||||
extern NSString *EOObjectsChangedInEditingContextNotification;
|
||||
|
||||
extern NSString *EOEditingContextDidSaveChangesNotification;
|
||||
|
||||
|
||||
@interface NSObject (EOEditingContext)
|
||||
|
||||
- (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// Delegation methods
|
||||
//
|
||||
@interface NSObject (EOEditingContextDelegation)
|
||||
|
||||
- (BOOL)editingContext: (EOEditingContext *)editingContext
|
||||
shouldPresentException: (NSException *)exception;
|
||||
|
||||
- (BOOL)editingContextShouldValidateChanges: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)editingContextWillSaveChanges: (EOEditingContext *)editingContext;
|
||||
|
||||
- (BOOL)editingContext: (EOEditingContext *)editingContext
|
||||
shouldInvalidateObject: (id)object
|
||||
globalID: (EOGlobalID *)gid;
|
||||
|
||||
- (BOOL)editingContextShouldUndoUserActionsAfterFailure: (EOEditingContext *)context;
|
||||
|
||||
- (NSArray *)editingContext: (EOEditingContext *)editingContext
|
||||
shouldFetchObjectsDescribedByFetchSpecification: (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- (BOOL) editingContext: (EOEditingContext *)editingContext
|
||||
shouldMergeChangedObject: (id)object;
|
||||
|
||||
- (void)didMergeChangedObjectsInEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// EOEditors informal protocol
|
||||
//
|
||||
@interface NSObject (EOEditors)
|
||||
|
||||
- (BOOL)editorHasChangesForEditingContext: (EOEditingContext *)editingContext;
|
||||
|
||||
- (void)editingContextWillSaveChanges: (EOEditingContext *)editingContext;
|
||||
|
||||
@end
|
||||
|
||||
//
|
||||
// EOMessageHandler informal protocol
|
||||
//
|
||||
@interface NSObject (EOMessageHandlers)
|
||||
|
||||
- (void)editingContext: (EOEditingContext *)editingContext
|
||||
presentErrorMessage: (NSString *)message;
|
||||
|
||||
- (BOOL)editingContext: (EOEditingContext *)editingContext
|
||||
shouldContinueFetchingWithCurrentObjectCount: (unsigned)count
|
||||
originalLimit: (unsigned)limit
|
||||
objectStore: (EOObjectStore *)objectStore;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface EOEditingContext (EORendezvous)
|
||||
|
||||
+ (void)setSubstitutionEditingContext: (EOEditingContext *)ec;
|
||||
+ (EOEditingContext *)substitutionEditingContext;
|
||||
|
||||
+ (void)setDefaultParentObjectStore: (EOObjectStore *)store;
|
||||
+ (EOObjectStore *)defaultParentObjectStore;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEditingContext (EOStateArchiving)
|
||||
|
||||
+ (void)setUsesContextRelativeEncoding: (BOOL)yn;
|
||||
+ (BOOL)usesContextRelativeEncoding;
|
||||
+ (void)encodeObject: (id)object withCoder: (NSCoder *)coder;
|
||||
+ (id)initObject: (id)object withCoder: (NSCoder *)coder;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEditingContext (EOTargetAction)
|
||||
|
||||
- (void)saveChanges: (id)sender;
|
||||
- (void)refault: (id)sender;
|
||||
- (void)revert: (id)sender;
|
||||
- (void)refetch: (id)sender;
|
||||
|
||||
- (void)undo: (id)sender;
|
||||
- (void)redo: (id)sender;
|
||||
|
||||
//Private
|
||||
-(NSString*)objectsDescription;
|
||||
-(NSString*)unprocessedDescription;
|
||||
|
||||
@end
|
||||
|
||||
@interface EOEditingContext(EOMultiThreaded) <NSLocking>
|
||||
|
||||
+ (void)setEOFMultiThreadedEnabled: (BOOL)flag;
|
||||
- (void)lock;
|
||||
- (void)unlock;
|
||||
- (BOOL) tryLock;
|
||||
|
||||
@end
|
||||
|
||||
// Informations
|
||||
@interface EOEditingContext(EOEditingContextInfo)
|
||||
|
||||
- (NSDictionary*)unprocessedInfo;
|
||||
- (NSDictionary*)pendingInfo;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
3105
EOControl/EOEditingContext.m
Normal file
3105
EOControl/EOEditingContext.m
Normal file
File diff suppressed because it is too large
Load diff
182
EOControl/EOFault.h
Normal file
182
EOControl/EOFault.h
Normal file
|
@ -0,0 +1,182 @@
|
|||
/*
|
||||
EOFault.h
|
||||
|
||||
Copyright (C) 1996-2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
Date: 1996
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOFault_h__
|
||||
#define __EOFault_h__
|
||||
|
||||
#include <Foundation/Foundation.h>
|
||||
|
||||
@class EOFaultHandler;
|
||||
|
||||
/*
|
||||
* EOFault class
|
||||
*/
|
||||
|
||||
|
||||
@interface EOFault
|
||||
{
|
||||
Class isa;
|
||||
EOFaultHandler *_handler;
|
||||
}
|
||||
|
||||
|
||||
+ (void)initialize;
|
||||
+ (Class)superclass;
|
||||
+ (Class)class;
|
||||
+ (id)self;
|
||||
|
||||
+ (id)retain;
|
||||
+ (void)release;
|
||||
+ (id)autorelease;
|
||||
+ (unsigned)retainCount;
|
||||
|
||||
+ (BOOL)isKindOfClass: (Class)aClass;
|
||||
+ (void)doesNotRecognizeSelector: (SEL)sel;
|
||||
+ (BOOL)respondsToSelector: (SEL)sel;
|
||||
|
||||
|
||||
+ (void)makeObjectIntoFault: (id)object withHandler: (EOFaultHandler *)handler;
|
||||
|
||||
+ (BOOL)isFault: (id)object;
|
||||
|
||||
+ (void)clearFault: (id)fault;
|
||||
|
||||
+ (EOFaultHandler *)handlerForFault: (id)fault;
|
||||
|
||||
+ (Class)targetClassForFault: (id)fault;
|
||||
|
||||
|
||||
- (Class)superclass;
|
||||
- (Class)class;
|
||||
|
||||
- (BOOL)isKindOfClass: (Class)aclass;
|
||||
- (BOOL)isMemberOfClass: (Class)aclass;
|
||||
- (BOOL)conformsToProtocol: (Protocol *)protocol;
|
||||
- (BOOL)respondsToSelector: (SEL)sel;
|
||||
- (NSMethodSignature *)methodSignatureForSelector: (SEL)aSelector;
|
||||
|
||||
- (id)retain;
|
||||
- (void)release;
|
||||
- (id)autorelease;
|
||||
- (unsigned)retainCount;
|
||||
|
||||
- (NSString *)description;
|
||||
- (NSString *)descriptionWithIndent: (unsigned)level;
|
||||
- (NSString *)descriptionWithLocale: (NSDictionary *)locale;
|
||||
- (NSString *)descriptionWithLocale: (NSDictionary *)locale
|
||||
indent: (unsigned)level;
|
||||
- (NSString *)eoDescription;
|
||||
- (NSString *)eoShallowDescription;
|
||||
|
||||
- (void)dealloc;
|
||||
|
||||
- (NSZone *)zone;
|
||||
- (BOOL)isProxy; // Always NO.
|
||||
|
||||
- (id)self;
|
||||
|
||||
|
||||
- (void)doesNotRecognizeSelector: (SEL)sel;
|
||||
- (void)forwardInvocation: (NSInvocation *)invocation;
|
||||
|
||||
- gcSetNextObject: (id)anObject;
|
||||
- gcSetPreviousObject: (id)anObject;
|
||||
- (id)gcNextObject;
|
||||
- (id)gcPreviousObject;
|
||||
- (BOOL)gcAlreadyVisited;
|
||||
- (void)gcSetVisited: (BOOL)flag;
|
||||
- (void)gcDecrementRefCountOfContainedObjects;
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects;
|
||||
- (BOOL)isGarbageCollectable;
|
||||
- (void)gcIncrementRefCount;
|
||||
- (void)gcDecrementRefCount;
|
||||
|
||||
@end /* EOFault */
|
||||
|
||||
|
||||
@interface EOFaultHandler : NSObject
|
||||
{
|
||||
Class _targetClass; // the first 8 bytes of
|
||||
void *_extraData; // the faulted object
|
||||
|
||||
unsigned _extraRefCount;
|
||||
|
||||
BOOL gcEnabled;
|
||||
id gcNextObject;
|
||||
id gcPreviousObject;
|
||||
struct {
|
||||
unsigned gcVisited:1;
|
||||
unsigned refCount:31;
|
||||
} gcFlags;
|
||||
@public
|
||||
int gcCountainedObjectRefCount;
|
||||
}
|
||||
|
||||
- (void)setTargetClass: (Class)target extraData: (void *)data;
|
||||
- (Class)targetClass;
|
||||
- (void *)extraData;
|
||||
|
||||
- (void)incrementExtraRefCount;
|
||||
- (BOOL)decrementExtraRefCountWasZero;
|
||||
- (unsigned)extraRefCount;
|
||||
|
||||
- (NSString *)descriptionForObject: object;
|
||||
|
||||
- (Class)classForFault: (id)fault;
|
||||
|
||||
- (BOOL)isKindOfClass: (Class)aclass forFault: (id)fault;
|
||||
- (BOOL)isMemberOfClass: (Class)aclass forFault: (id)fault;
|
||||
- (BOOL)conformsToProtocol: (Protocol *)protocol forFault: (id)fault;
|
||||
- (BOOL)respondsToSelector: (SEL)sel forFault: (id)fault;
|
||||
- (NSMethodSignature *)methodSignatureForSelector: (SEL)selector
|
||||
forFault: (id)fault;
|
||||
|
||||
- (void)completeInitializationOfObject: (id)object;
|
||||
|
||||
- (BOOL)shouldPerformInvocation: (NSInvocation *)invocation;
|
||||
|
||||
- (void)faultWillFire: (id)object;
|
||||
|
||||
// Garbage Collector
|
||||
|
||||
- gcSetNextObject: (id)anObject;
|
||||
- gcSetPreviousObject: (id)anObject;
|
||||
- (id)gcNextObject;
|
||||
- (id)gcPreviousObject;
|
||||
- (BOOL)gcAlreadyVisited;
|
||||
- (void)gcSetVisited: (BOOL)flag;
|
||||
- (void)gcDecrementRefCountOfContainedObjects;
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects;
|
||||
- (BOOL)isGarbageCollectable;
|
||||
- (void)gcIncrementRefCount;
|
||||
- (void)gcDecrementRefCount;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __EOFault_h__ */
|
590
EOControl/EOFault.m
Normal file
590
EOControl/EOFault.m
Normal file
|
@ -0,0 +1,590 @@
|
|||
/**
|
||||
EOFault.m <title>EOFault Class</title>
|
||||
|
||||
Copyright (C) 1996-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mircea Oancea <mircea@jupiter.elcom.pub.ro>
|
||||
Date: 1996
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#include <objc/Object.h>
|
||||
#include <objc/Protocol.h>
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/objc-runtime.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EOFault.h>
|
||||
|
||||
#import <EOAccess/EODatabaseContext.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
Class isa;
|
||||
} *my_objc_object;
|
||||
|
||||
#define object_is_instance(object) \
|
||||
((object != nil) && CLS_ISCLASS(((my_objc_object)object)->isa))
|
||||
|
||||
|
||||
/*
|
||||
* EOFault class
|
||||
*/
|
||||
|
||||
@implementation EOFault
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
// Must be here as initialize is called for each root class
|
||||
// without asking if it responds to it !
|
||||
}
|
||||
|
||||
+ (Class)superclass
|
||||
{
|
||||
return class_get_super_class(self);
|
||||
}
|
||||
|
||||
+ (Class)class
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
+ self
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (id)retain
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (void)release
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
+ (id)autorelease
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (unsigned)retainCount
|
||||
{
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
+ (BOOL)isKindOfClass: (Class)aClass
|
||||
{
|
||||
if(aClass == [EOFault class])
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
+ (void)doesNotRecognizeSelector: (SEL)sel
|
||||
{
|
||||
return;
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
+ (BOOL)respondsToSelector: (SEL)sel
|
||||
{
|
||||
return (IMP)class_get_instance_method(self, sel) != (IMP)0;
|
||||
}
|
||||
|
||||
|
||||
// Fault class methods
|
||||
|
||||
+ (void)makeObjectIntoFault: (id)object
|
||||
withHandler: (EOFaultHandler *)handler
|
||||
{
|
||||
if (object)
|
||||
{
|
||||
EOFault *fault = object;
|
||||
unsigned int refs;
|
||||
|
||||
NSAssert(handler,@"No Handler");
|
||||
|
||||
refs = [object retainCount];
|
||||
|
||||
[handler setTargetClass: [object class]
|
||||
extraData: fault->_handler];
|
||||
fault->isa = self;
|
||||
fault->_handler = [handler retain];
|
||||
|
||||
while (refs-- > 0)
|
||||
[fault retain];
|
||||
}
|
||||
}
|
||||
|
||||
+ (BOOL)isFault: (id)object
|
||||
{
|
||||
// NSDebugFLLog(@"gsdb",@"object=%p",object);
|
||||
|
||||
if (object == nil)
|
||||
return NO;
|
||||
else
|
||||
return ((EOFault *)object)->isa == self;
|
||||
}
|
||||
|
||||
+ (void)clearFault: (id)fault
|
||||
{
|
||||
EOFaultHandler *handler;
|
||||
EOFault *aFault = (EOFault *)fault;
|
||||
BOOL gcEnabled = NO;
|
||||
unsigned gcCountainedObjectRefCount = 0;
|
||||
int refs = 0;
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"START fault=%p", fault);
|
||||
|
||||
if ([EOFault isFault:fault] == NO)
|
||||
{
|
||||
//REVOIR!!!
|
||||
/*
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"%@ -- %@ 0x%x: object %@ of class %@ is not a fault object",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
fault,
|
||||
[fault class]];
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
handler = aFault->_handler;
|
||||
|
||||
[handler faultWillFire: fault];
|
||||
|
||||
refs = [handler extraRefCount];
|
||||
gcEnabled = [handler isGarbageCollectable];
|
||||
gcCountainedObjectRefCount = aFault->_handler->gcCountainedObjectRefCount;
|
||||
|
||||
aFault->isa = [handler targetClass];
|
||||
aFault->_handler = [handler extraData];
|
||||
|
||||
[handler autorelease];
|
||||
|
||||
refs -= [fault retainCount];
|
||||
|
||||
if (refs > 0)
|
||||
while (refs-- > 0)
|
||||
[aFault retain];
|
||||
else
|
||||
while (refs++ < 0)
|
||||
[aFault release];
|
||||
|
||||
if(gcEnabled)
|
||||
{
|
||||
[aFault gcIncrementRefCount];
|
||||
[aFault gcSetNextObject: [self gcNextObject]];
|
||||
[aFault gcSetPreviousObject: [self gcPreviousObject]];
|
||||
|
||||
while (gcCountainedObjectRefCount-- > 0)
|
||||
[aFault gcIncrementRefCountOfContainedObjects];
|
||||
}
|
||||
}
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"STOP fault=%p", fault);
|
||||
}
|
||||
|
||||
+ (EOFaultHandler *)handlerForFault:(id)fault
|
||||
{
|
||||
BOOL isFault = [EOFault isFault: fault];
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"object %p is%s a fault", fault, (isFault ? "" : " not"));
|
||||
|
||||
if (isFault)
|
||||
return ((EOFault *)fault)->_handler;
|
||||
else
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (Class)targetClassForFault: (id)fault
|
||||
{
|
||||
if ([EOFault isFault:fault])
|
||||
return [((EOFault *)fault)->_handler targetClass];
|
||||
else
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
// Fault Instance methods
|
||||
|
||||
- superclass
|
||||
{
|
||||
return [[_handler targetClass] superclass];
|
||||
}
|
||||
|
||||
- (Class)class
|
||||
{
|
||||
return [_handler targetClass];
|
||||
}
|
||||
|
||||
- (BOOL)isKindOfClass: (Class)aclass;
|
||||
{
|
||||
Class class;
|
||||
BOOL koc=NO;
|
||||
|
||||
class = [_handler targetClass];
|
||||
|
||||
for (; !koc && class != Nil; class = class_get_super_class(class))
|
||||
if (class == aclass)
|
||||
koc = YES;
|
||||
|
||||
return koc;
|
||||
}
|
||||
|
||||
- (BOOL)isMemberOfClass: (Class)aclass
|
||||
{
|
||||
return [_handler targetClass] == aclass;
|
||||
}
|
||||
|
||||
- (BOOL)conformsToProtocol: (Protocol *)protocol
|
||||
{
|
||||
int i;
|
||||
struct objc_protocol_list* protos;
|
||||
Class class, sClass;
|
||||
|
||||
class = [_handler targetClass];
|
||||
|
||||
for (protos = class->protocols; protos; protos = protos->next)
|
||||
{
|
||||
for (i = 0; i < protos->count; i++)
|
||||
if ([protos->list[i] conformsTo: protocol])
|
||||
return YES;
|
||||
}
|
||||
|
||||
sClass = [class superclass];
|
||||
|
||||
if (sClass)
|
||||
return [sClass conformsToProtocol: protocol];
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)respondsToSelector: (SEL)aSelector
|
||||
{
|
||||
Class class;
|
||||
BOOL respondsToSelector;
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"START self=%p", self);
|
||||
|
||||
class = [_handler targetClass];
|
||||
NSDebugFLLog(@"gsdb", @"class=%@ aSelector=%s", class, sel_get_name(aSelector));
|
||||
|
||||
respondsToSelector = ((IMP)class_get_instance_method(class, aSelector)
|
||||
!= (IMP)0);
|
||||
NSDebugFLLog(@"gsdb", @"STOP self=%p", self);
|
||||
|
||||
return respondsToSelector;
|
||||
}
|
||||
|
||||
- (NSMethodSignature *)methodSignatureForSelector: (SEL)aSelector
|
||||
{
|
||||
NSMethodSignature *sig;
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"START self=%p", self);
|
||||
NSDebugFLLog(@"gsdb", @"_handler=%p", _handler);
|
||||
|
||||
sig = [_handler methodSignatureForSelector: aSelector
|
||||
forFault: self];
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"STOP self=%p", self);
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
||||
- retain
|
||||
{
|
||||
[_handler incrementExtraRefCount];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)release
|
||||
{
|
||||
if ([_handler extraRefCount] <= 0)
|
||||
[self dealloc];
|
||||
else
|
||||
[_handler decrementExtraRefCountWasZero];
|
||||
}
|
||||
|
||||
- autorelease
|
||||
{
|
||||
[NSAutoreleasePool addObject: self];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (unsigned)retainCount
|
||||
{
|
||||
return [_handler extraRefCount];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [_handler descriptionForObject: self];
|
||||
}
|
||||
|
||||
- (NSString *)descriptionWithIndent: (unsigned)level
|
||||
{
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (NSString *)descriptionWithLocale: (NSDictionary *)locale
|
||||
{
|
||||
//OK
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (NSString *)descriptionWithLocale: (NSDictionary *)locale
|
||||
indent: (unsigned)level
|
||||
{
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (NSString *)descriptionWithLocale: (NSDictionary *)locale
|
||||
indent: (unsigned)level
|
||||
to: (id<GNUDescriptionDestination>)output;
|
||||
{
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (NSString *)eoDescription
|
||||
{
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (NSString *)eoShallowDescription
|
||||
{
|
||||
return [self description];
|
||||
}
|
||||
|
||||
- (EOKeyGlobalID *)globalID
|
||||
{
|
||||
if ([_handler respondsToSelector: @selector(globalID)])
|
||||
return [(id)_handler globalID];
|
||||
else
|
||||
{
|
||||
[_handler completeInitializationOfObject: self];
|
||||
return [self globalID];
|
||||
}
|
||||
}
|
||||
|
||||
- (EODatabaseContext *)databaseContext
|
||||
{
|
||||
if ([_handler respondsToSelector: @selector(databaseContext)])
|
||||
return [(id)_handler databaseContext];
|
||||
else
|
||||
{
|
||||
[_handler completeInitializationOfObject: self];
|
||||
return [self databaseContext];
|
||||
}
|
||||
}
|
||||
|
||||
- (EOEditingContext *)editingContext
|
||||
{
|
||||
if ([_handler respondsToSelector: @selector(editingContext)])
|
||||
return [_handler editingContext];
|
||||
else
|
||||
{
|
||||
[_handler completeInitializationOfObject: self];
|
||||
|
||||
return [self editingContext];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
- (EOKeyGlobalID *)sourceGlobalID;
|
||||
- (NSString *)relationshipName;
|
||||
*/
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[EOFault clearFault: self];
|
||||
[self dealloc];
|
||||
}
|
||||
|
||||
- (NSZone *)zone
|
||||
{
|
||||
return NSZoneFromPointer(self);
|
||||
}
|
||||
|
||||
- (BOOL)isProxy
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (id)self
|
||||
{
|
||||
[_handler completeInitializationOfObject: self];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)doesNotRecognizeSelector: (SEL)sel
|
||||
{
|
||||
[NSException raise: NSInvalidArgumentException
|
||||
format: @"%@ -- %@ 0x%x: selector \"%@\" not recognized",
|
||||
NSStringFromSelector(_cmd),
|
||||
NSStringFromClass([self class]),
|
||||
self,
|
||||
NSStringFromSelector(sel)];
|
||||
}
|
||||
|
||||
- (retval_t)forward: (SEL)sel
|
||||
: (arglist_t)args
|
||||
{
|
||||
retval_t ret;
|
||||
NSInvocation *inv;
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"START self=%p", self);
|
||||
|
||||
inv = [[[NSInvocation alloc] initWithArgframe: args
|
||||
selector: sel]
|
||||
autorelease];
|
||||
[self forwardInvocation: inv];
|
||||
|
||||
ret = [inv returnFrame: args];
|
||||
NSDebugFLLog(@"gsdb", @"STOP self=%p", self);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
- (void)forwardInvocation: (NSInvocation *)invocation
|
||||
{
|
||||
NSDebugFLLog(@"gsdb", @"START self=%p", self);
|
||||
|
||||
if ([_handler shouldPerformInvocation: invocation])
|
||||
[_handler completeInitializationOfObject: self];
|
||||
|
||||
[invocation invoke];
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"STOP self=%p", self);
|
||||
}
|
||||
|
||||
- (unsigned int)hash
|
||||
{
|
||||
unsigned int hash;
|
||||
EOFaultHandler *handler;
|
||||
Class fault;
|
||||
|
||||
fault = isa;
|
||||
handler = _handler;
|
||||
|
||||
isa = [handler targetClass];
|
||||
_handler = [handler extraData];
|
||||
|
||||
hash = [self hash];
|
||||
|
||||
isa = fault;
|
||||
_handler = handler;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
// GC
|
||||
|
||||
- gcSetNextObject: (id)anObject
|
||||
{
|
||||
return [_handler gcSetNextObject: anObject];
|
||||
}
|
||||
|
||||
- gcSetPreviousObject: (id)anObject
|
||||
{
|
||||
return [_handler gcSetPreviousObject: anObject];
|
||||
}
|
||||
|
||||
- (id)gcNextObject
|
||||
{
|
||||
return [_handler gcNextObject];
|
||||
}
|
||||
|
||||
- (id)gcPreviousObject
|
||||
{
|
||||
return [_handler gcPreviousObject];
|
||||
}
|
||||
|
||||
- (BOOL)gcAlreadyVisited
|
||||
{
|
||||
return [_handler gcAlreadyVisited];
|
||||
}
|
||||
|
||||
- (void)gcSetVisited: (BOOL)flag
|
||||
{
|
||||
[_handler gcSetVisited: flag];
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCountOfContainedObjects
|
||||
{
|
||||
[_handler gcDecrementRefCountOfContainedObjects];
|
||||
}
|
||||
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects
|
||||
{
|
||||
return [_handler gcIncrementRefCountOfContainedObjects];
|
||||
}
|
||||
|
||||
- (BOOL)isGarbageCollectable
|
||||
{
|
||||
return [_handler isGarbageCollectable];
|
||||
}
|
||||
|
||||
- (void)gcIncrementRefCount
|
||||
{
|
||||
[_handler gcIncrementRefCount];
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCount
|
||||
{
|
||||
NSDebugFLLog(@"gsdb", @"START self=%p", self);
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"handler gcDecrementRefCount");
|
||||
|
||||
[_handler gcDecrementRefCount];
|
||||
|
||||
NSDebugFLLog(@"gsdb", @"STOP self=%p", self);
|
||||
}
|
||||
|
||||
@end
|
||||
|
374
EOControl/EOFaultHandler.m
Normal file
374
EOControl/EOFaultHandler.m
Normal file
|
@ -0,0 +1,374 @@
|
|||
/**
|
||||
EOFaultHandler.m <title>EOFaultHandler Class</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSObjCRuntime.h>
|
||||
|
||||
#import <extensions/NSException.h>
|
||||
#import <extensions/exceptions/GeneralExceptions.h>
|
||||
#import <extensions/GCObject.h>
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EOFault.h>
|
||||
|
||||
|
||||
BOOL __isGCEnabled(Class class_)
|
||||
{
|
||||
Class gcObjectClass = [GCObject class];
|
||||
|
||||
if ([class_ conformsToProtocol: @protocol(GarbageCollecting)])
|
||||
return YES;
|
||||
else if ([class_ instancesRespondToSelector: @selector(gcIncrementRefCount)])
|
||||
return YES;
|
||||
else
|
||||
{
|
||||
Class class;
|
||||
|
||||
for (class = class_;
|
||||
class != Nil;
|
||||
class = class_get_super_class (class))
|
||||
{
|
||||
if (class == gcObjectClass)
|
||||
return YES;
|
||||
else if ([class instancesRespondToSelector: @selector(gcIncrementRefCount)])
|
||||
return YES;
|
||||
else if ([class instancesRespondToSelector: @selector(gcNextObject)])
|
||||
return YES;
|
||||
else if ([class conformsToProtocol: @protocol(GarbageCollecting )])
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
@implementation EOFaultHandler
|
||||
|
||||
- (id)init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setTargetClass: (Class)target
|
||||
extraData: (void *)data
|
||||
{
|
||||
_targetClass = target;
|
||||
_extraData = data;
|
||||
|
||||
gcEnabled = __isGCEnabled(_targetClass);
|
||||
|
||||
if (gcEnabled)
|
||||
_extraRefCount++;
|
||||
}
|
||||
|
||||
- (Class)targetClass
|
||||
{
|
||||
return _targetClass;
|
||||
}
|
||||
|
||||
- (void *)extraData
|
||||
{
|
||||
return _extraData;
|
||||
}
|
||||
|
||||
- (void)incrementExtraRefCount
|
||||
{
|
||||
_extraRefCount++;
|
||||
}
|
||||
|
||||
- (BOOL)decrementExtraRefCountWasZero
|
||||
{
|
||||
if (!(--_extraRefCount))
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (unsigned)extraRefCount
|
||||
{
|
||||
return _extraRefCount;
|
||||
}
|
||||
|
||||
- (NSString *)descriptionForObject: object
|
||||
{
|
||||
return [NSString stringWithFormat: @"%@ (EOFault 0x%08x)",
|
||||
NSStringFromClass(_targetClass), object];
|
||||
}
|
||||
|
||||
- (Class)classForFault: (id)fault
|
||||
{
|
||||
return [self targetClass];
|
||||
}
|
||||
|
||||
- (BOOL)isKindOfClass: (Class)aclass
|
||||
forFault: (id)fault
|
||||
{
|
||||
Class class;
|
||||
|
||||
for (class = _targetClass; class != Nil; class = class_get_super_class(class))
|
||||
{
|
||||
if (class == aclass)
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)isMemberOfClass: (Class)aclass
|
||||
forFault: (id)fault
|
||||
{
|
||||
return _targetClass == aclass;
|
||||
}
|
||||
|
||||
- (BOOL)conformsToProtocol: (Protocol *)protocol
|
||||
forFault: (id)fault
|
||||
{
|
||||
int i;
|
||||
struct objc_protocol_list *proto_list;
|
||||
Class class;
|
||||
|
||||
for(class = _targetClass; class != Nil; class = class_get_super_class(class))
|
||||
{
|
||||
for (proto_list =
|
||||
((struct objc_class *)_targetClass)->class_pointer->protocols;
|
||||
proto_list; proto_list = proto_list->next)
|
||||
{
|
||||
for (i = 0; i < proto_list->count; i++)
|
||||
{
|
||||
if ([proto_list->list[i] conformsTo: protocol])
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)respondsToSelector: (SEL)sel
|
||||
forFault: (id)fault
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return NO;
|
||||
// return __objc_responds_to((id)&self, sel);
|
||||
}
|
||||
|
||||
- (NSMethodSignature *)methodSignatureForSelector: (SEL)selector
|
||||
forFault: (id)fault
|
||||
{ // TODO
|
||||
NSMethodSignature *sig;
|
||||
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
NSDebugMLLog(@"gsdb", @"_targetClass=%p", _targetClass);
|
||||
NSDebugMLLog(@"gsdb", @"_targetClass=%@", _targetClass);
|
||||
NSDebugMLLog(@"gsdb", @"selector=%@", NSStringFromSelector(selector));
|
||||
//TODO VERIFY
|
||||
NSAssert(_targetClass, @"No target class");
|
||||
|
||||
sig = [_targetClass instanceMethodSignatureForSelector: selector];
|
||||
|
||||
NSDebugMLLog(@"gsdb",@"sig=%p", (void*)sig);
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
||||
- (void)completeInitializationOfObject: (id)object
|
||||
{
|
||||
[self subclassResponsibility: _cmd];
|
||||
}
|
||||
|
||||
- (BOOL)shouldPerformInvocation: (NSInvocation *)invocation
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)faultWillFire: (id)object
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// GC
|
||||
|
||||
+ allocWithZone: (NSZone *)zone_
|
||||
{
|
||||
id newObject = [super allocWithZone: zone_];
|
||||
|
||||
((EOFaultHandler *)newObject)->gcFlags.refCount = 0;
|
||||
|
||||
return newObject;
|
||||
}
|
||||
|
||||
/*
|
||||
- retain
|
||||
{
|
||||
if (gcEnabled)
|
||||
{
|
||||
gcFlags.refCount++;
|
||||
return self;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [super retain];
|
||||
};
|
||||
}
|
||||
|
||||
- (unsigned int)retainCount
|
||||
{
|
||||
if (gcEnabled)
|
||||
{
|
||||
return gcFlags.refCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
return [super retainCount];
|
||||
};
|
||||
}
|
||||
*/
|
||||
- gcSetNextObject: (id)anObject
|
||||
{
|
||||
if (gcEnabled)
|
||||
gcNextObject = anObject;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- gcSetPreviousObject: (id)anObject
|
||||
{
|
||||
if (gcEnabled)
|
||||
gcPreviousObject = anObject;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)gcNextObject
|
||||
{
|
||||
if (gcEnabled)
|
||||
return gcNextObject;
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id)gcPreviousObject
|
||||
{
|
||||
if (gcEnabled)
|
||||
return gcPreviousObject;
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)gcAlreadyVisited
|
||||
{
|
||||
if (gcEnabled)
|
||||
return gcFlags.gcVisited;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)gcSetVisited: (BOOL)flag
|
||||
{
|
||||
if (gcEnabled)
|
||||
gcFlags.gcVisited = flag;
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCountOfContainedObjects
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if (gcEnabled)
|
||||
gcCountainedObjectRefCount--;
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
}
|
||||
|
||||
- (BOOL)gcIncrementRefCountOfContainedObjects
|
||||
{
|
||||
if (gcEnabled)
|
||||
{
|
||||
if (gcFlags.gcVisited)
|
||||
return NO;
|
||||
|
||||
gcCountainedObjectRefCount++;
|
||||
gcFlags.gcVisited = YES;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)isGarbageCollectable
|
||||
{
|
||||
return gcEnabled;
|
||||
}
|
||||
|
||||
- (void)gcIncrementRefCount
|
||||
{
|
||||
if (gcEnabled);
|
||||
//gcFlags.refCount++;
|
||||
// faultReferences++;
|
||||
}
|
||||
|
||||
- (void)gcDecrementRefCount
|
||||
{
|
||||
if(gcEnabled);
|
||||
//gcFlags.refCount--;
|
||||
// faultReferences--;
|
||||
}
|
||||
|
||||
/*
|
||||
- (BOOL)afterFault
|
||||
{
|
||||
if (gcEnabled)
|
||||
{
|
||||
[fault gcIncrementRefCount];
|
||||
[fault gcSetNextObject:[self gcNextObject]];
|
||||
[fault gcSetPreviousObject:[self gcPreviousObject]];
|
||||
while(gcCountainedObjectRefCount-- > 0)
|
||||
[fault gcIncrementRefCountOfContainedObjects];
|
||||
};
|
||||
return NO;
|
||||
}
|
||||
*/
|
||||
|
||||
@end
|
146
EOControl/EOFetchSpecification.h
Normal file
146
EOControl/EOFetchSpecification.h
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
EOFetchSpecification.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOFetchSpecification_h__
|
||||
#define __EOFetchSpecification_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@class EOQualifier;
|
||||
@class EOKeyValueArchiver;
|
||||
@class EOKeyValueUnarchiver;
|
||||
|
||||
@interface EOFetchSpecification : NSObject <NSCopying, NSCoding>
|
||||
{
|
||||
EOQualifier *_qualifier;
|
||||
NSArray *_sortOrderings;
|
||||
NSString *_entityName;
|
||||
NSDictionary *_hints;
|
||||
unsigned int _fetchLimit;
|
||||
NSArray *_prefetchingRelationshipKeys;
|
||||
NSArray *_rawAttributeKeys;
|
||||
struct {
|
||||
unsigned usesDistinct:1;
|
||||
unsigned isDeep:1;
|
||||
unsigned locksObjects:1;
|
||||
unsigned refreshesRefetchedObjects:1;
|
||||
unsigned promptsAfterFetchLimit:1;
|
||||
unsigned allVariablesRequiredFromBindings:1;
|
||||
unsigned :26; //padding
|
||||
}_flags;
|
||||
}
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecification;
|
||||
|
||||
- init;
|
||||
|
||||
- initWithEntityName: (NSString *)entityName
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
sortOrderings: (NSArray *)sortOrderings
|
||||
usesDistinct: (BOOL)usesDistinct
|
||||
isDeep: (BOOL)isDeep
|
||||
hints: (NSDictionary *)hints;
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationByApplyingBindings: (id)bindings;
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationWithQualifierBindings: (NSDictionary *)bindings;
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecificationNamed: (NSString *)name
|
||||
entityNamed: (NSString *)entityName;
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecificationWithEntityName: (NSString *)name
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
sortOrderings: (NSArray *)sortOrderings;
|
||||
|
||||
|
||||
- copyWithZone:(NSZone *)zone;
|
||||
|
||||
- (id) initWithKeyValueUnarchiver: (EOKeyValueUnarchiver*)unarchiver;
|
||||
- (void) encodeWithKeyValueArchiver: (EOKeyValueUnarchiver*)archiver;
|
||||
|
||||
- (void)setEntityName: (NSString *)entityName;
|
||||
- (NSString *)entityName;
|
||||
|
||||
- (void)setSortOrderings: (NSArray *)sortOrderings;
|
||||
- (NSArray *)sortOrderings;
|
||||
|
||||
- (void)setQualifier: (EOQualifier *)qualifier;
|
||||
- (EOQualifier *)qualifier;
|
||||
|
||||
- (void)setUsesDistinct: (BOOL)usesDistinct;
|
||||
- (BOOL)usesDistinct;
|
||||
|
||||
- (void)setIsDeep: (BOOL)isDeep;
|
||||
- (BOOL)isDeep;
|
||||
|
||||
- (void)setLocksObjects: (BOOL)setLocksObjects;
|
||||
- (BOOL)locksObjects;
|
||||
|
||||
- (void)setRefreshesRefetchedObjects: (BOOL)refreshesRefetchedObjects;
|
||||
- (BOOL)refreshesRefetchedObjects;
|
||||
|
||||
- (void)setFetchLimit: (unsigned)fetchLimit;
|
||||
- (unsigned)fetchLimit;
|
||||
|
||||
- (void)setPromptsAfterFetchLimit: (BOOL)promptsAfterFetchLimit;
|
||||
- (BOOL)promptsAfterFetchLimit;
|
||||
|
||||
- (void)setAllVariablesRequiredFromBindings: (BOOL)allVariablesRequired;
|
||||
- (BOOL)allVariablesRequiredFromBindings;
|
||||
|
||||
- (void)setPrefetchingRelationshipKeyPaths: (NSArray *)prefetchingRelationshipKeys;
|
||||
- (NSArray *)prefetchingRelationshipKeyPaths;
|
||||
|
||||
- (void)setRawAttributeKeys: (NSArray *)rawAttributeKeys;
|
||||
- (NSArray *)rawAttributeKeys;
|
||||
|
||||
- (void)setFetchesRawRows: (BOOL)fetchRawRows;
|
||||
- (BOOL)fetchesRawRows;
|
||||
|
||||
- (void)setHints: (NSDictionary *)hints;
|
||||
- (NSDictionary *)hints;
|
||||
- (NSDictionary *)_hints;
|
||||
|
||||
- (NSArray *)rawRowKeyPaths;
|
||||
- (void)setRawRowKeyPaths: (NSArray *)rawRowKeyPaths;
|
||||
|
||||
- (BOOL)requiresAllQualifierBindingVariables;
|
||||
- (void)setRequiresAllQualifierBindingVariables: (BOOL)flag;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
extern NSString *EOPrefetchingRelationshipHintKey;
|
||||
|
||||
extern NSString *EOFetchLimitHintKey;
|
||||
|
||||
extern NSString *EOPromptsAfterFetchLimitHintKey;
|
||||
|
||||
|
||||
#endif
|
||||
|
497
EOControl/EOFetchSpecification.m
Normal file
497
EOControl/EOFetchSpecification.m
Normal file
|
@ -0,0 +1,497 @@
|
|||
/**
|
||||
EOFetchSpecification.m <title>EOFetchSpecification</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <EOControl/EOFetchSpecification.h>
|
||||
#import <EOControl/EOKeyValueArchiver.h>
|
||||
#import <EOControl/EOObserver.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
#import <EOControl/EONSAddOns.h>
|
||||
|
||||
#import <EOAccess/EOModelGroup.h>
|
||||
|
||||
|
||||
@implementation EOFetchSpecification
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecification
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
}
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_flags.isDeep = YES;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
// Turbocat
|
||||
- (void)dealloc
|
||||
{
|
||||
#ifdef DEBUG
|
||||
NSString *fmt = GSDebugMethodMsg(self, _cmd, __FILE__, __LINE__, @"FNSTOP");
|
||||
EOFLOGObjectFnStartOrCond(@"EOFetchSpecification");
|
||||
#endif
|
||||
|
||||
DESTROY(_qualifier);
|
||||
DESTROY(_sortOrderings);
|
||||
DESTROY(_entityName);
|
||||
DESTROY(_hints);
|
||||
DESTROY(_prefetchingRelationshipKeys);
|
||||
DESTROY(_rawAttributeKeys);
|
||||
|
||||
[super dealloc];
|
||||
|
||||
#ifdef DEBUG
|
||||
EOFLOGObjectFnStopOrCondPlain(@"EOFetchSpecification", fmt);
|
||||
#endif
|
||||
}
|
||||
|
||||
- (id) initWithEntityName: (NSString *)entityName
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
sortOrderings: (NSArray *)sortOrderings
|
||||
usesDistinct: (BOOL)usesDistinct
|
||||
isDeep: (BOOL)isDeep
|
||||
hints: (NSDictionary *)hints
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(_entityName, entityName);
|
||||
ASSIGN(_qualifier, qualifier);
|
||||
ASSIGN(_sortOrderings, sortOrderings);
|
||||
|
||||
[self setUsesDistinct: usesDistinct];
|
||||
[self setIsDeep: isDeep];
|
||||
[self setHints: hints];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationByApplyingBindings: (id)bindings
|
||||
{
|
||||
[self notImplemented:_cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (EOFetchSpecification *)fetchSpecificationWithQualifierBindings: (NSDictionary *)bindings
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecificationNamed: (NSString *)name
|
||||
entityNamed: (NSString *)entityName
|
||||
{
|
||||
EOFetchSpecification *newEOFetchSpecification = nil;
|
||||
EOModelGroup *anModelGroup;
|
||||
|
||||
EOFLOGClassFnStartOrCond(@"EOFetchSpecification");
|
||||
|
||||
anModelGroup = [EOModelGroup defaultGroup];
|
||||
|
||||
if (anModelGroup)
|
||||
newEOFetchSpecification = [anModelGroup fetchSpecificationNamed: name
|
||||
entityNamed: entityName];
|
||||
|
||||
EOFLOGObjectFnStopOrCond(@"EOFetchSpecification");
|
||||
|
||||
return newEOFetchSpecification;
|
||||
}
|
||||
|
||||
+ (EOFetchSpecification *)fetchSpecificationWithEntityName: (NSString *)name
|
||||
qualifier: (EOQualifier *)qualifier
|
||||
sortOrderings: (NSArray *)sortOrderings
|
||||
{
|
||||
return [[[EOFetchSpecification alloc]
|
||||
initWithEntityName: name
|
||||
qualifier: qualifier
|
||||
sortOrderings: sortOrderings
|
||||
usesDistinct: NO
|
||||
isDeep: YES
|
||||
hints: nil] autorelease];
|
||||
}
|
||||
|
||||
|
||||
- (id) copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOFetchSpecification *ret = [EOFetchSpecification allocWithZone:zone];
|
||||
//order: hints, isdeep, usesDistinct,sortOrderings, qualifier,entityName
|
||||
//and call nitWithEntityName:qualifier:sortOrderings:usesDistinct:isDeep:hints:
|
||||
//after:
|
||||
/* [fetch setLocksObjects:[_fetchSpecification locksObjects]];
|
||||
[fetch setRefreshesRefetchedObjects:[_fetchSpecification refreshesRefetchedObjects]];
|
||||
[fetch setPrefetchingRelationshipKeyPaths:[_fetchSpecification prefetchingRelationshipKeyPaths
|
||||
[fetch setRawRowKeyPaths:[_fetchSpecification rawRowKeyPaths
|
||||
setFetchLimit:fetchLimit
|
||||
setPromptsAfterFetchLimit: promptsAfterFetchLimit
|
||||
setRequiresAllQualifierBindingVariables:requiresAllQualifierBindingVariables
|
||||
*/
|
||||
//call setXX fn instead to have "willChange" ??
|
||||
ret->_qualifier = [(<NSCopying>)_qualifier copyWithZone: zone];
|
||||
ret->_sortOrderings = [_sortOrderings copyWithZone: zone]; //mirko: ASSIGN(ret->_sortOrderings, _sortOrderings);
|
||||
ret->_entityName = [_entityName copyWithZone: zone];
|
||||
ret->_hints = [_hints copyWithZone: zone];
|
||||
ret->_prefetchingRelationshipKeys = [_prefetchingRelationshipKeys copyWithZone: zone];
|
||||
ret->_rawAttributeKeys = [_rawAttributeKeys copyWithZone: zone];
|
||||
ret->_fetchLimit = _fetchLimit;
|
||||
ret->_flags = _flags;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
[coder encodeObject: _qualifier];
|
||||
[coder encodeObject: _sortOrderings];
|
||||
[coder encodeObject: _entityName];
|
||||
[coder encodeObject: _hints];
|
||||
[coder encodeValueOfObjCType: @encode(unsigned int) at: &_fetchLimit];
|
||||
[coder encodeObject: _prefetchingRelationshipKeys];
|
||||
[coder encodeObject: _rawAttributeKeys];
|
||||
[coder encodeValueOfObjCType: @encode(unsigned int) at: &_flags];
|
||||
}
|
||||
|
||||
- (id)initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
_qualifier = [[coder decodeObject] retain];
|
||||
_sortOrderings = [[coder decodeObject] retain];
|
||||
_entityName = [[coder decodeObject] retain];
|
||||
_hints = [[coder decodeObject] retain];
|
||||
[coder decodeValueOfObjCType: @encode(unsigned int) at: &_fetchLimit];
|
||||
_prefetchingRelationshipKeys = [[coder decodeObject] retain];
|
||||
_rawAttributeKeys = [[coder decodeObject] retain];
|
||||
[coder decodeValueOfObjCType: @encode(unsigned int) at: &_flags];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id) initWithKeyValueUnarchiver: (EOKeyValueUnarchiver*)unarchiver
|
||||
{
|
||||
if ((self = [self init]))
|
||||
{
|
||||
ASSIGN(_hints, [unarchiver decodeObjectForKey: @"hints"]);
|
||||
ASSIGN(_qualifier, [unarchiver decodeObjectForKey: @"qualifier"]);
|
||||
ASSIGN(_sortOrderings, [unarchiver decodeObjectForKey: @"sortOrderings"]);
|
||||
ASSIGN(_entityName, [unarchiver decodeObjectForKey: @"entityName"]);
|
||||
ASSIGN(_prefetchingRelationshipKeys,
|
||||
[unarchiver decodeObjectForKey: @"prefetchingRelationshipKeyPaths"]);
|
||||
ASSIGN(_rawAttributeKeys, [unarchiver decodeObjectForKey: @"rawRowKeyPaths"]);
|
||||
|
||||
_fetchLimit = [unarchiver decodeIntForKey: @"fetchLimit"];
|
||||
_flags.usesDistinct = [unarchiver decodeBoolForKey: @"usesDistinct"];
|
||||
_flags.isDeep = [unarchiver decodeBoolForKey: @"isDeep"];
|
||||
_flags.locksObjects = [unarchiver decodeBoolForKey: @"locksObjects"];
|
||||
_flags.refreshesRefetchedObjects =
|
||||
[unarchiver decodeBoolForKey: @"refreshesRefetchedObjects"];
|
||||
_flags.promptsAfterFetchLimit =
|
||||
[unarchiver decodeBoolForKey: @"promptsAfterFetchLimit"];
|
||||
_flags.allVariablesRequiredFromBindings =
|
||||
[unarchiver decodeBoolForKey: @"requiresAllQualifierBindingVariables"];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) encodeWithKeyValueArchiver: (EOKeyValueUnarchiver*)archiver
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (NSString*)description
|
||||
{
|
||||
NSMutableString *desc = [NSMutableString string];
|
||||
|
||||
[desc appendString: @"{\n"];
|
||||
[desc appendString: [NSString stringWithFormat: @"hints = %@;\n",
|
||||
[_hints description]]];
|
||||
[desc appendString: [NSString stringWithFormat: @"qualifier = %@;\n",
|
||||
_qualifier]];
|
||||
[desc appendString: [NSString stringWithFormat: @"sortOrderings = %@;\n",
|
||||
[_sortOrderings description]]];
|
||||
[desc appendString: [NSString stringWithFormat: @"entityName = %@;\n",
|
||||
_entityName]];
|
||||
[desc appendString: [NSString stringWithFormat: @"prefetchingRelationshipKeyPaths = %@;\n",
|
||||
[_prefetchingRelationshipKeys description]]];
|
||||
[desc appendString: [NSString stringWithFormat: @"rawRowKeyPaths = %@;\n",
|
||||
[_rawAttributeKeys description]]];
|
||||
[desc appendString: [NSString stringWithFormat: @"fetchLimit = %d;\n",
|
||||
_fetchLimit]];
|
||||
[desc appendString: [NSString stringWithFormat: @"usesDistinct = %s;\n",
|
||||
_flags.usesDistinct ? "YES" : "NO"]];
|
||||
[desc appendString: [NSString stringWithFormat: @"isDeep = %s;\n",
|
||||
_flags.isDeep ? "YES" : "NO"]];
|
||||
[desc appendString: [NSString stringWithFormat: @"locksObjects = %s;\n",
|
||||
_flags.locksObjects ? "YES" : "NO"]];
|
||||
[desc appendString: [NSString stringWithFormat: @"refreshesRefetchedObjects = %s;\n",
|
||||
_flags.refreshesRefetchedObjects ? "YES" : "NO"]];
|
||||
[desc appendString: [NSString stringWithFormat: @"promptsAfterFetchLimit = %s;\n",
|
||||
_flags.promptsAfterFetchLimit ? "YES" : "NO"]];
|
||||
[desc appendString: [NSString stringWithFormat: @"requiresAllQualifierBindingVariables = %s;\n",
|
||||
_flags.allVariablesRequiredFromBindings ? "YES" : "NO"]];
|
||||
[desc appendString: @"}"];
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
- (void)setEntityName: (NSString *)entityName
|
||||
{
|
||||
[self willChange];
|
||||
ASSIGN(_entityName, entityName);
|
||||
}
|
||||
|
||||
- (NSString *)entityName
|
||||
{
|
||||
return _entityName;
|
||||
}
|
||||
|
||||
- (void)setSortOrderings: (NSArray *)sortOrderings
|
||||
{
|
||||
ASSIGN(_sortOrderings, sortOrderings);
|
||||
}
|
||||
|
||||
- (NSArray *)sortOrderings
|
||||
{
|
||||
return _sortOrderings;
|
||||
}
|
||||
|
||||
- (void)setQualifier: (EOQualifier *)qualifier
|
||||
{
|
||||
[self willChange];
|
||||
ASSIGN(_qualifier, qualifier);
|
||||
}
|
||||
|
||||
- (EOQualifier *)qualifier
|
||||
{
|
||||
return _qualifier;
|
||||
}
|
||||
|
||||
- (void)setUsesDistinct: (BOOL)usesDistinct
|
||||
{
|
||||
[self willChange];
|
||||
_flags.usesDistinct = usesDistinct;
|
||||
}
|
||||
|
||||
- (BOOL)usesDistinct
|
||||
{
|
||||
return _flags.usesDistinct;
|
||||
}
|
||||
|
||||
- (void)setIsDeep: (BOOL)isDeep
|
||||
{
|
||||
[self willChange];
|
||||
_flags.isDeep = isDeep;
|
||||
}
|
||||
|
||||
- (BOOL)isDeep
|
||||
{
|
||||
return _flags.isDeep;
|
||||
}
|
||||
|
||||
- (void)setLocksObjects: (BOOL)locksObjects
|
||||
{
|
||||
[self willChange];
|
||||
_flags.locksObjects = locksObjects;
|
||||
}
|
||||
|
||||
- (BOOL)locksObjects
|
||||
{
|
||||
return _flags.locksObjects;
|
||||
}
|
||||
|
||||
- (void)setRefreshesRefetchedObjects: (BOOL)refreshesRefetchedObjects
|
||||
{
|
||||
[self willChange];
|
||||
_flags.refreshesRefetchedObjects = refreshesRefetchedObjects;
|
||||
}
|
||||
|
||||
- (BOOL)refreshesRefetchedObjects
|
||||
{
|
||||
return _flags.refreshesRefetchedObjects;
|
||||
}
|
||||
|
||||
- (void)setFetchLimit: (unsigned)fetchLimit
|
||||
{
|
||||
[self willChange];
|
||||
_fetchLimit = fetchLimit;
|
||||
}
|
||||
|
||||
- (unsigned)fetchLimit
|
||||
{
|
||||
return _fetchLimit;
|
||||
}
|
||||
|
||||
- (void)setPromptsAfterFetchLimit: (BOOL)promptsAfterFetchLimit
|
||||
{
|
||||
[self willChange];
|
||||
_flags.promptsAfterFetchLimit = promptsAfterFetchLimit;
|
||||
}
|
||||
|
||||
- (BOOL)promptsAfterFetchLimit
|
||||
{
|
||||
return _flags.promptsAfterFetchLimit;
|
||||
}
|
||||
|
||||
- (void)setAllVariablesRequiredFromBindings: (BOOL)allVariablesRequired
|
||||
{
|
||||
_flags.allVariablesRequiredFromBindings = allVariablesRequired;
|
||||
}
|
||||
|
||||
- (BOOL)allVariablesRequiredFromBindings
|
||||
{
|
||||
return _flags.allVariablesRequiredFromBindings;
|
||||
}
|
||||
|
||||
- (void)setPrefetchingRelationshipKeyPaths: (NSArray *)prefetchingRelationshipKeys
|
||||
{
|
||||
[self willChange];
|
||||
ASSIGN(_prefetchingRelationshipKeys, prefetchingRelationshipKeys);
|
||||
}
|
||||
|
||||
- (NSArray *)prefetchingRelationshipKeyPaths
|
||||
{
|
||||
return _prefetchingRelationshipKeys;
|
||||
}
|
||||
|
||||
- (void)setRawAttributeKeys: (NSArray *)rawAttributeKeys
|
||||
{
|
||||
ASSIGN(_rawAttributeKeys, rawAttributeKeys);
|
||||
}
|
||||
|
||||
- (NSArray *)rawAttributeKeys
|
||||
{
|
||||
return _rawAttributeKeys;
|
||||
}
|
||||
|
||||
- (void)setFetchesRawRows: (BOOL)fetchRawRows
|
||||
{
|
||||
if (fetchRawRows)
|
||||
[self setRawRowKeyPaths: [NSArray array]];
|
||||
else
|
||||
[self setRawRowKeyPaths: nil];
|
||||
}
|
||||
|
||||
- (BOOL)fetchesRawRows
|
||||
{
|
||||
if ([self rawRowKeyPaths])
|
||||
return YES;
|
||||
else
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)setHints: (NSDictionary *)hints
|
||||
{
|
||||
//TODO: set fetchLimit,... from hints ???
|
||||
[self willChange];
|
||||
//even if nil: initWithDictionary:copyItems:
|
||||
//thedict objectForKey:EOPrefetchingRelationshipHintKey
|
||||
//EOFetchLimitHintKey
|
||||
//EOPromptAfterFetchLimitHintKey
|
||||
ASSIGN(_hints, hints);
|
||||
}
|
||||
|
||||
- (NSDictionary *)_hints
|
||||
{
|
||||
return _hints;
|
||||
}
|
||||
|
||||
- (NSDictionary *)hints
|
||||
{
|
||||
NSMutableDictionary *hints = _hints;
|
||||
BOOL promptsAfterFetchLimit;
|
||||
NSArray *prefetchingRelationshipKeyPaths;
|
||||
unsigned fetchLimit;
|
||||
|
||||
fetchLimit = [self fetchLimit];
|
||||
promptsAfterFetchLimit = [self promptsAfterFetchLimit];
|
||||
prefetchingRelationshipKeyPaths = [self prefetchingRelationshipKeyPaths];
|
||||
|
||||
if (fetchLimit != 0 || promptsAfterFetchLimit
|
||||
|| [prefetchingRelationshipKeyPaths count] > 0)
|
||||
{
|
||||
NSMutableDictionary *mutableHints = [NSMutableDictionary
|
||||
dictionaryWithDictionary: hints];
|
||||
|
||||
hints = mutableHints;
|
||||
|
||||
if (fetchLimit != 0)
|
||||
{
|
||||
[mutableHints setObject: [NSNumber numberWithInt: fetchLimit]
|
||||
forKey: @"EOFetchLimitHintKey"];
|
||||
}
|
||||
|
||||
if (promptsAfterFetchLimit)
|
||||
{
|
||||
[mutableHints setObject: [NSNumber numberWithBool:
|
||||
promptsAfterFetchLimit]
|
||||
forKey: @"EOPromptAfterFetchLimitHintKey"];
|
||||
}
|
||||
|
||||
if ([prefetchingRelationshipKeyPaths count] > 0)
|
||||
{
|
||||
[mutableHints setObject: prefetchingRelationshipKeyPaths
|
||||
forKey: @"EOPrefetchingRelationshipHintKey"];
|
||||
}
|
||||
}
|
||||
|
||||
return hints;
|
||||
}
|
||||
|
||||
- (NSArray *)rawRowKeyPaths
|
||||
{
|
||||
return _rawAttributeKeys;
|
||||
}
|
||||
|
||||
- (void)setRawRowKeyPaths: (NSArray *)rawRowKeyPaths
|
||||
{
|
||||
[self willChange];
|
||||
ASSIGN(_rawAttributeKeys, rawRowKeyPaths);
|
||||
}
|
||||
|
||||
- (BOOL)requiresAllQualifierBindingVariables
|
||||
{
|
||||
NSDebugMLLog(@"gsdb", @"self=%p", self);
|
||||
return _flags.allVariablesRequiredFromBindings;
|
||||
}
|
||||
|
||||
- (void)setRequiresAllQualifierBindingVariables: (BOOL)flag
|
||||
{
|
||||
[self willChange];
|
||||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
@end
|
61
EOControl/EOGenericRecord.h
Normal file
61
EOControl/EOGenericRecord.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
EOGenericRecord.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOGenericRecord_h__
|
||||
#define __EOGenericRecord_h__
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@class NSString;
|
||||
@class NSMutableDictionary;
|
||||
@class EOClassDescription;
|
||||
@class EOEditingContext;
|
||||
@class EOGlobalID;
|
||||
@class EOMutableKnownKeyDictionary;
|
||||
|
||||
@interface EOGenericRecord : NSObject
|
||||
{
|
||||
EOClassDescription *classDescription;
|
||||
EOMutableKnownKeyDictionary *dictionary;
|
||||
}
|
||||
|
||||
// Initializing new instances
|
||||
|
||||
- initWithEditingContext: (EOEditingContext *)context
|
||||
classDescription: (EOClassDescription *)classDesc
|
||||
globalID: (EOGlobalID *)globalID;
|
||||
|
||||
- (id)valueForKey: (NSString *)key;
|
||||
- (void)takeValue: (id)value
|
||||
forKey: (NSString *)key;
|
||||
|
||||
+ (void)eoCalculateAllSizeWith: (NSMutableDictionary*)dict;
|
||||
- (unsigned int)eoCalculateSizeWith: (NSMutableDictionary*)dict;
|
||||
|
||||
@end /* EOGenericRecord */
|
||||
|
||||
|
||||
#endif /* __EOGenericRecord_h__ */
|
1354
EOControl/EOGenericRecord.m
Normal file
1354
EOControl/EOGenericRecord.m
Normal file
File diff suppressed because it is too large
Load diff
67
EOControl/EOGlobalID.h
Normal file
67
EOControl/EOGlobalID.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
EOGlobalID.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOGlobalID_h__
|
||||
#define __EOGlobalID_h__
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
extern NSString *EOGlobalIDChangedNotification;
|
||||
|
||||
@interface EOGlobalID : NSObject <NSCopying>
|
||||
- (BOOL)isEqual:other;
|
||||
- (unsigned)hash;
|
||||
|
||||
- (BOOL)isTemporary;
|
||||
|
||||
@end
|
||||
|
||||
enum {
|
||||
EOUniqueBinaryKeyLength = 12
|
||||
};
|
||||
|
||||
|
||||
@interface EOTemporaryGlobalID : EOGlobalID <NSCoding>
|
||||
{
|
||||
unsigned _refCount;
|
||||
unsigned char _bytes[EOUniqueBinaryKeyLength+1];
|
||||
}
|
||||
|
||||
+ (EOTemporaryGlobalID *)temporaryGlobalID;
|
||||
+ (void)assignGloballyUniqueBytes: (unsigned char *)buffer;
|
||||
// < Sequence [2], ProcessID [2] , Time [4], IP Addr [4] >
|
||||
|
||||
- init;
|
||||
|
||||
- (BOOL)isTemporary;
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)aCoder;
|
||||
- (id)initWithCoder: (NSCoder *)aDecoder;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
176
EOControl/EOGlobalID.m
Normal file
176
EOControl/EOGlobalID.m
Normal file
|
@ -0,0 +1,176 @@
|
|||
/**
|
||||
EOGlobalID.m <title>EOGlobalID</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <EOControl/EOControl.h>
|
||||
#import <EOControl/EOGlobalID.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
NSString *EOGlobalIDChangedNotification = @"EOGlobalIDChangedNotification";
|
||||
|
||||
|
||||
@implementation EOGlobalID
|
||||
|
||||
- (BOOL)isEqual: other
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (unsigned)hash
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (BOOL)isTemporary
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (id)copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOGlobalID *gid = [[[self class] alloc] init];
|
||||
|
||||
return gid;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation EOTemporaryGlobalID
|
||||
|
||||
static unsigned short sequence = 65535;
|
||||
static unsigned long sequenceRev = 0;
|
||||
|
||||
|
||||
+ (EOTemporaryGlobalID *)temporaryGlobalID
|
||||
{
|
||||
return [[[self alloc] init] autorelease];
|
||||
}
|
||||
|
||||
// < Sequence [2], ProcessID [2] , Time [4], IP Addr [4] >
|
||||
+ (void)assignGloballyUniqueBytes: (unsigned char *)buffer
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
// sprintf(buffer, "%02x%02x%04x%04x", sequence++ % 0xff, 0, (unsigned int)time( NULL ) % 0xffffffff, 0); // <-- overwrite memory
|
||||
|
||||
// buffer should have space for EOUniqueBinaryKeyLength (12) bytes.
|
||||
// Assigns a world-wide unique ID made up of:
|
||||
// < Sequence [2], ProcessID [2] , Time [4], IP Addr [4] >
|
||||
|
||||
//printf("sequence : %d (%02x,%02x,%04x,%04x)\n",sequence -1, (sequence - 1) % 0xff, getpid() % 0xff, (unsigned int)time( NULL ) % 0xffff, (sequenceRev+1) % 0xffff);
|
||||
|
||||
snprintf(buffer, 12,
|
||||
"%02x%02x%04x%04x",
|
||||
sequence-- % 0xff,
|
||||
getpid() % 0xff,
|
||||
(unsigned int)time( NULL ) % 0xffff,
|
||||
sequenceRev++ % 0xffff);
|
||||
|
||||
if (sequence == 0)
|
||||
sequence = 65535;
|
||||
|
||||
if (sequenceRev == 4294967295UL)
|
||||
sequenceRev = 1;
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return; // TODO
|
||||
}
|
||||
|
||||
- init
|
||||
{
|
||||
EOFLOGObjectFnStart();
|
||||
|
||||
if ((self = [super init]))
|
||||
{
|
||||
[EOTemporaryGlobalID assignGloballyUniqueBytes:_bytes];
|
||||
}
|
||||
|
||||
EOFLOGObjectFnStop();
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)isTemporary
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (unsigned char *)_bytes
|
||||
{
|
||||
return _bytes;
|
||||
}
|
||||
|
||||
- (BOOL)isEqual:other
|
||||
{
|
||||
if (self == other)
|
||||
return YES;
|
||||
|
||||
if ([other isKindOfClass: [EOTemporaryGlobalID class]] == NO)
|
||||
return NO;
|
||||
|
||||
if (!memcmp(_bytes, [other _bytes], sizeof(_bytes)))
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
[coder encodeValueOfObjCType: @encode(unsigned) at: &_refCount];
|
||||
[coder encodeValueOfObjCType: @encode(unsigned char[]) at: _bytes];
|
||||
}
|
||||
|
||||
- (id)initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
[coder decodeValueOfObjCType: @encode(unsigned) at: &_refCount];
|
||||
[coder decodeValueOfObjCType: @encode(unsigned char[]) at: _bytes];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOTemporaryGlobalID *gid = [super copyWithZone:zone];
|
||||
|
||||
gid->_refCount = _refCount;
|
||||
memcpy(gid->_bytes, _bytes, sizeof(_bytes));
|
||||
|
||||
return gid;
|
||||
}
|
||||
|
||||
@end
|
171
EOControl/EOKeyComparisonQualifier.m
Normal file
171
EOControl/EOKeyComparisonQualifier.m
Normal file
|
@ -0,0 +1,171 @@
|
|||
/**
|
||||
EOKeyComparisonQualifier.m <title>EOKeyComparisonQualifier</title>
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: February 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSUtilities.h>
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
#import <EOControl/EOKeyValueCoding.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
|
||||
#import <EOAccess/EOSQLExpression.h>
|
||||
|
||||
|
||||
@implementation EOKeyComparisonQualifier
|
||||
|
||||
+ (EOQualifier *)qualifierWithLeftKey: (NSString *)leftKey
|
||||
operatorSelector: (SEL)selector
|
||||
rightKey: (id)rightKey
|
||||
{
|
||||
return [[[self alloc] initWithLeftKey: leftKey
|
||||
operatorSelector: selector
|
||||
rightKey: rightKey] autorelease];
|
||||
}
|
||||
|
||||
- initWithLeftKey: (NSString *)leftKey
|
||||
operatorSelector: (SEL)selector
|
||||
rightKey: (id)rightKey
|
||||
{
|
||||
if ((self = [super init]))
|
||||
{
|
||||
_selector = selector;
|
||||
ASSIGN(_leftKey, leftKey);
|
||||
ASSIGN(_rightKey, rightKey);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
DESTROY(_leftKey);
|
||||
DESTROY(_rightKey);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (SEL)selector
|
||||
{
|
||||
return _selector;
|
||||
}
|
||||
|
||||
- (NSString *)leftKey
|
||||
{
|
||||
return _leftKey;
|
||||
}
|
||||
|
||||
- (NSString *)rightKey
|
||||
{
|
||||
return _rightKey;
|
||||
}
|
||||
|
||||
- (id)copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOKeyComparisonQualifier *qual = [[EOKeyComparisonQualifier
|
||||
allocWithZone: zone] init];
|
||||
|
||||
qual->_selector = _selector;
|
||||
qual->_leftKey = [_leftKey copyWithZone: zone];
|
||||
qual->_rightKey = [_rightKey copyWithZone: zone];
|
||||
|
||||
return qual;
|
||||
}
|
||||
|
||||
- (BOOL)evaluateWithObject: (id)object
|
||||
{
|
||||
id leftKey, rightKey;
|
||||
|
||||
leftKey = [object valueForKey: _leftKey];
|
||||
rightKey = [object valueForKey: _rightKey];
|
||||
|
||||
if (sel_eq(_selector, EOQualifierOperatorEqual) == YES)
|
||||
{
|
||||
return [leftKey isEqual: rightKey] == NSOrderedSame;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorNotEqual) == YES)
|
||||
{
|
||||
return [leftKey isEqual: rightKey] != NSOrderedSame;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorLessThan) == YES)
|
||||
{
|
||||
return [leftKey compare: rightKey] == NSOrderedAscending;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorGreaterThan) == YES)
|
||||
{
|
||||
return [leftKey compare: rightKey] == NSOrderedDescending;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorLessThanOrEqualTo) == YES)
|
||||
{
|
||||
return [leftKey compare: rightKey] != NSOrderedDescending;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorGreaterThanOrEqualTo) == YES)
|
||||
{
|
||||
return [leftKey compare: rightKey] != NSOrderedAscending;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorContains) == YES)
|
||||
{
|
||||
[self notImplemented: _cmd];
|
||||
|
||||
return NO;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorLike) == YES)
|
||||
{
|
||||
NSEmitTODO(); //TODO
|
||||
return [leftKey isEqual: rightKey]
|
||||
== NSOrderedSame;
|
||||
}
|
||||
else if (sel_eq(_selector, EOQualifierOperatorCaseInsensitiveLike) == YES)
|
||||
{
|
||||
NSEmitTODO(); //TODO
|
||||
return [[leftKey uppercaseString] isEqual: [rightKey uppercaseString]]
|
||||
== NSOrderedSame;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
return [NSString stringWithFormat:@"<%s %p - %@ %@ %@>",
|
||||
object_get_class_name(self),
|
||||
(void*)self,
|
||||
_leftKey,
|
||||
[isa stringForOperatorSelector:_selector],
|
||||
_rightKey];
|
||||
}
|
||||
|
||||
@end
|
||||
|
63
EOControl/EOKeyGlobalID.h
Normal file
63
EOControl/EOKeyGlobalID.h
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
EOKeyGlobalID.h
|
||||
|
||||
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EOKeyGlobalID_h__
|
||||
#define __EOKeyGlobalID_h__
|
||||
|
||||
#import <EOControl/EOGlobalID.h>
|
||||
|
||||
@interface EOKeyGlobalID : EOGlobalID <NSCoding>
|
||||
{
|
||||
unsigned short _keyCount;
|
||||
NSString *_entityName;
|
||||
id *_keyValues;
|
||||
}
|
||||
|
||||
+ (id)globalIDWithEntityName: (NSString *)entityName
|
||||
keys: (id *)keys
|
||||
keyCount: (unsigned)count
|
||||
zone: (NSZone *)zone;
|
||||
|
||||
- (NSString *)entityName;
|
||||
|
||||
- (id *)keyValues;
|
||||
|
||||
- (unsigned)keyCount;
|
||||
- (NSArray *)keyValuesArray;
|
||||
|
||||
- (BOOL)isEqual: other;
|
||||
- (unsigned)hash;
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)aCoder;
|
||||
- (id)initWithCoder: (NSCoder *)aDecoder;
|
||||
|
||||
- (BOOL) isFinal;
|
||||
- (NSString*)description;
|
||||
- (BOOL)areKeysAllNulls;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
221
EOControl/EOKeyGlobalID.m
Normal file
221
EOControl/EOKeyGlobalID.m
Normal file
|
@ -0,0 +1,221 @@
|
|||
/**
|
||||
EOKeyGlobalID.m <title>EOKeyGlobalID Class</title>
|
||||
|
||||
Copyright (C) 2000-2002 Free Software Foundation, Inc.
|
||||
|
||||
Author: Mirko Viviani <mirko.viviani@rccr.cremona.it>
|
||||
Date: June 2000
|
||||
|
||||
$Revision$
|
||||
$Date$
|
||||
|
||||
<abstract></abstract>
|
||||
|
||||
This file is part of the GNUstep Database Library.
|
||||
|
||||
<license>
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
</license>
|
||||
**/
|
||||
|
||||
static char rcsId[] = "$Id$";
|
||||
|
||||
#import <EOControl/EOKeyGlobalID.h>
|
||||
#import <EOControl/EODebug.h>
|
||||
#import <EOControl/EONull.h>
|
||||
|
||||
|
||||
@implementation EOKeyGlobalID
|
||||
|
||||
+ (id)globalIDWithEntityName: (NSString *)entityName
|
||||
keys: (id *)keys
|
||||
keyCount: (unsigned)count
|
||||
zone: (NSZone *)zone
|
||||
{
|
||||
EOKeyGlobalID *gid = [[[EOKeyGlobalID allocWithZone: zone] init]
|
||||
autorelease];
|
||||
int i;
|
||||
|
||||
ASSIGN(gid->_entityName, entityName);
|
||||
gid->_keyCount = count;
|
||||
|
||||
gid->_keyValues = NSZoneMalloc(zone, count * sizeof(id));
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
gid->_keyValues[i] = nil;
|
||||
ASSIGN(gid->_keyValues[i], keys[i]);
|
||||
}
|
||||
|
||||
if ([gid areKeysAllNulls])
|
||||
NSWarnLog(@"All key of globalID %p (%@) are nulls",
|
||||
gid,
|
||||
gid);
|
||||
|
||||
return gid;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < _keyCount; i++)
|
||||
DESTROY(_keyValues[i]);
|
||||
|
||||
NSZoneFree(NULL, _keyValues);
|
||||
|
||||
DESTROY(_entityName);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (NSString *)entityName
|
||||
{
|
||||
return _entityName;
|
||||
}
|
||||
|
||||
- (id *)keyValues
|
||||
{
|
||||
return _keyValues;
|
||||
}
|
||||
|
||||
- (unsigned)keyCount
|
||||
{
|
||||
return _keyCount;
|
||||
}
|
||||
|
||||
- (NSArray *)keyValuesArray
|
||||
{
|
||||
return [NSArray arrayWithObjects: _keyValues count: _keyCount];
|
||||
}
|
||||
|
||||
- (BOOL)isEqual: other
|
||||
{
|
||||
unsigned short oCount;
|
||||
int i;
|
||||
id *oValues;
|
||||
|
||||
if (self == other)
|
||||
return YES;
|
||||
|
||||
if ([self hash] != [other hash])
|
||||
return NO;
|
||||
|
||||
if ([_entityName isEqualToString: [other entityName]] == NO)
|
||||
return NO;
|
||||
|
||||
oCount = [other keyCount];
|
||||
oValues = [other keyValues];
|
||||
|
||||
for (i = 0; i < oCount; i++)
|
||||
if ([_keyValues[i] isEqual: oValues[i]] == NO)
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
- (unsigned int)hash // TODO
|
||||
{
|
||||
int i;
|
||||
unsigned int hash = 0;
|
||||
|
||||
for (i = 0; i < _keyCount; i++)
|
||||
hash += [_keyValues[i] hash];
|
||||
|
||||
hash += [_entityName hash];
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder: (NSCoder *)coder
|
||||
{
|
||||
[coder encodeValueOfObjCType: @encode(unsigned short) at: &_keyCount];
|
||||
[coder encodeObject: _entityName];
|
||||
[coder encodeArrayOfObjCType: @encode(id) count: _keyCount at: _keyValues];
|
||||
}
|
||||
|
||||
- (id)initWithCoder: (NSCoder *)coder
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
[coder decodeValueOfObjCType: @encode(unsigned short) at: &_keyCount];
|
||||
_entityName = [[coder decodeObject] retain];
|
||||
|
||||
_keyValues = NSZoneMalloc([coder objectZone], _keyCount);
|
||||
[coder decodeArrayOfObjCType: @encode(id) count: _keyCount at: _keyValues];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)copyWithZone: (NSZone *)zone
|
||||
{
|
||||
EOKeyGlobalID *gid = [super copyWithZone: zone];
|
||||
int i;
|
||||
|
||||
ASSIGN(gid->_entityName, _entityName);
|
||||
gid->_keyCount = _keyCount;
|
||||
|
||||
gid->_keyValues = NSZoneMalloc(zone, _keyCount * sizeof(id));
|
||||
|
||||
for (i = 0; i < _keyCount; i++)
|
||||
{
|
||||
gid->_keyValues[i] = nil;
|
||||
ASSIGN(gid->_keyValues[i], _keyValues[i]);
|
||||
}
|
||||
|
||||
return gid;
|
||||
}
|
||||
|
||||
- (BOOL) isFinal
|
||||
{
|
||||
// [self notImplemented:_cmd]; //TODO
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSString*)description
|
||||
{
|
||||
NSString *dscr;
|
||||
int i;
|
||||
|
||||
dscr = [NSString stringWithFormat: @"<%s %p - Entity %@ - keysValues:",
|
||||
object_get_class_name(self),
|
||||
(void*)self,
|
||||
_entityName];
|
||||
|
||||
for(i = 0; i < _keyCount; i++)
|
||||
{
|
||||
dscr = [dscr stringByAppendingFormat: @"\"%@\" (%@) ",
|
||||
_keyValues[i],
|
||||
[_keyValues[i] class]];
|
||||
}
|
||||
dscr = [dscr stringByAppendingString: @">"];
|
||||
|
||||
return dscr;
|
||||
}
|
||||
|
||||
-(BOOL)areKeysAllNulls
|
||||
{
|
||||
int i;
|
||||
BOOL areNulls = YES;
|
||||
|
||||
for (i = 0; areNulls && i < _keyCount; i++)
|
||||
areNulls = isNilOrEONull(_keyValues[i]);
|
||||
|
||||
return areNulls;
|
||||
}
|
||||
|
||||
@end
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue