Initial Commit of AgileBill Open Source
This commit is contained in:
parent
ae5a0fc25e
commit
02306ccc47
315
LICENSE
Normal file
315
LICENSE
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
OPEN AGILEBILL LICENSE V1.4
|
||||||
|
|
||||||
|
1.0 DEFINITIONS
|
||||||
|
|
||||||
|
1.1 "Commercial Use" means distribution or otherwise making the
|
||||||
|
Original Code available to a third party.
|
||||||
|
|
||||||
|
1.2 "Contributor Version" means the combination of the Original
|
||||||
|
Code, and the Modifications made by that particular Contributor.
|
||||||
|
|
||||||
|
1.3 "Electronic Distribution Mechanism" means a mechanism generally
|
||||||
|
accepted in the software development community for the electronic transfer
|
||||||
|
of data.
|
||||||
|
|
||||||
|
1.4 "Executable" means Original Code in any form other than Source
|
||||||
|
Code.
|
||||||
|
|
||||||
|
1.5 "Initial Developer" means the individual or entity identified
|
||||||
|
as the Initial Developer in the Source Code notice required by Exhibit
|
||||||
|
A.
|
||||||
|
|
||||||
|
1.6 "Larger Work" means a work which combines Original Code or
|
||||||
|
portions thereof with code not governed by the terms of this License.
|
||||||
|
|
||||||
|
1.7 "License" means this document.
|
||||||
|
|
||||||
|
1.8 "Licensable" means having the right to grant, to the maximum
|
||||||
|
extent possible, whether at the time of the initial grant or subsequently
|
||||||
|
acquired, any and all of the rights conveyed herein.
|
||||||
|
|
||||||
|
1.9 "Modifications" means any addition to or deletion from the
|
||||||
|
substance or structure of either the Original Code or any previous
|
||||||
|
Modifications.
|
||||||
|
|
||||||
|
A Modification is:
|
||||||
|
|
||||||
|
A. Any addition to or deletion from the contents of a file containing
|
||||||
|
Original Code or previous Modifications.
|
||||||
|
|
||||||
|
B. Any new file that contains any part of the Original
|
||||||
|
Code or previous Modifications.
|
||||||
|
|
||||||
|
1.10 "Original Code" means Source Code of computer software code
|
||||||
|
which is described in the Source Code notice required by Exhibit A as Original
|
||||||
|
Code.
|
||||||
|
|
||||||
|
1.11 "Patent Claims" means any patent claim(s), now owned or
|
||||||
|
hereafter acquired, including without limitation, method, process, and
|
||||||
|
apparatus claims, in any patent Licensable by grantor.
|
||||||
|
|
||||||
|
1.12 "Source Code" means the preferred form of the Original Code
|
||||||
|
for making modifications to it, including all modules it contains, plus
|
||||||
|
any associated interface definition files, or scripts used to control
|
||||||
|
compilation and installation of an Executable.
|
||||||
|
|
||||||
|
1.13 "Standards" means the standards identified in Exhibit B.
|
||||||
|
|
||||||
|
1.14 "You" (or "Your") means an individual or a legal entity
|
||||||
|
exercising rights under, and complying with all of the terms of, this License
|
||||||
|
or a future version of this License issued under Section 6.1. For legal
|
||||||
|
entities, "You" includes any entity which controls, is controlled by,
|
||||||
|
or is under common control with You. For purposes of this definition, "control"
|
||||||
|
means (a) the power, direct or indirect, to cause the direction or management
|
||||||
|
of such entity, whether by contract or otherwise, or (b) ownership of more
|
||||||
|
than fifty percent (50%) of the outstanding shares or beneficial ownership
|
||||||
|
of such entity.
|
||||||
|
|
||||||
|
2.0 SOURCE CODE LICENSE
|
||||||
|
|
||||||
|
2.1 The Initial Developer Grant
|
||||||
|
|
||||||
|
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||||
|
non-exclusive license, subject to third party intellectual property
|
||||||
|
claims:
|
||||||
|
|
||||||
|
(a) under intellectual property rights (other than patent or
|
||||||
|
trademark) Licensable by Initial Developer to use, reproduce, modify, display,
|
||||||
|
perform, sublicense and distribute the Original Code (or portions thereof)
|
||||||
|
with or without Modifications, and/or as part of a Larger Work; and
|
||||||
|
|
||||||
|
(b) under Patents Claims infringed by the making, using or selling
|
||||||
|
of Original Code, to make, have made, use, practice, sell, and offer for
|
||||||
|
sale, and/or otherwise dispose of the Original Code (or portions thereof).
|
||||||
|
|
||||||
|
(c) the licenses granted in this Section 2.1(a) and (b) are effective
|
||||||
|
on the date Initial Developer first distributes Original Code under the
|
||||||
|
terms of this License.
|
||||||
|
|
||||||
|
(d) Notwithstanding Section
|
||||||
|
2.1(b) above, no patent license is granted: 1) for code that You delete from
|
||||||
|
the Original Code; 2) separate from the Original Code; or 3) for infringements
|
||||||
|
caused by: i) the modification of the Original Code or ii) the combination of
|
||||||
|
the Original Code with other software or devices, including but not limited to
|
||||||
|
Modifications.
|
||||||
|
|
||||||
|
3.0 DISTRIBUTION OBLIGATIONS
|
||||||
|
|
||||||
|
3.1 Application of License.
|
||||||
|
|
||||||
|
The Source Code version of Original Code may be distributed only under
|
||||||
|
the terms of this License or a future version of this License released
|
||||||
|
under Section 6.1, and You must include a copy of this License with every
|
||||||
|
copy of the Source Code You distribute. You may not offer or impose any
|
||||||
|
terms on any Source Code version that alters or restricts the applicable
|
||||||
|
version of this License or the recipients' rights hereunder. Your license
|
||||||
|
for shipment of the Contributor Version is conditioned upon Your full compliance
|
||||||
|
with this Section. The Modifications which You create must comply with
|
||||||
|
all requirements set out by the Standards body in effect one hundred twenty
|
||||||
|
(120) days before You ship the Contributor Version. In the event that the
|
||||||
|
Modifications do not meet such requirements, You agree to publish either
|
||||||
|
(i) any deviation from the Standards protocol resulting from implementation
|
||||||
|
of Your Modifications and a reference implementation of Your Modifications
|
||||||
|
or (ii) Your Modifications in Source Code form, and to make any such deviation
|
||||||
|
and reference implementation or Modifications available to all third parties
|
||||||
|
under the same terms as this license on a royalty free basis within thirty
|
||||||
|
(30) days of Your first customer shipment of Your Modifications.
|
||||||
|
|
||||||
|
3.2 Required Notices.
|
||||||
|
|
||||||
|
You must duplicate the notice in Exhibit A in each file of the
|
||||||
|
Source Code. If it is not possible to put such notice in a particular Source
|
||||||
|
Code file due to its structure, then You must include such notice in a
|
||||||
|
location (such as a relevant directory) where a user would be likely to
|
||||||
|
look for such a notice. If You created one or more Modification(s) You
|
||||||
|
may add Your name as a Contributor to the notice described in Exhibit
|
||||||
|
A. You must also duplicate this License in any documentation for the
|
||||||
|
Source Code where You describe recipients' rights or ownership rights relating
|
||||||
|
to Initial Code. You may choose to offer, and to charge a fee for, warranty,
|
||||||
|
support, indemnity or liability obligations to one or more recipients of
|
||||||
|
Your version of the Code. However, You may do so only on Your own behalf,
|
||||||
|
and not on behalf of the Initial Developer. You must make it absolutely
|
||||||
|
clear than any such warranty, support, indemnity or liability obligation
|
||||||
|
is offered by You alone, and You hereby agree to indemnify the Initial
|
||||||
|
Developer for any liability incurred by the Initial Developer as a result
|
||||||
|
of warranty, support, indemnity or liability terms You offer.
|
||||||
|
|
||||||
|
The copyright notices and links must remain visible and functional in each
|
||||||
|
HTML of every installed copy of the Code, in this format:
|
||||||
|
|
||||||
|
<a href="http://www.agileco.com">Billing Software</a> Powered by AgileBill.
|
||||||
|
Copyright 2004-2008 <a href="http://www.agileco.com/">Agileco, LLC</a>
|
||||||
|
|
||||||
|
These notices and links cannot be removed, disabled, or caused to be hidden or obscured
|
||||||
|
from view from by modifying any part of the Source Code. The font size for the
|
||||||
|
notices may not be modified to a font size smaller than 10pt. The font color,
|
||||||
|
background colors, or any other attributes of the font text, background, or links may not be
|
||||||
|
modified in any way that renders them illegible, invisble, or unreadable to the
|
||||||
|
human eye, or causes the links to point to any URL other than shown in the format
|
||||||
|
above. No attributes may be added to the A HREF tags.
|
||||||
|
|
||||||
|
|
||||||
|
3.3 Distribution of Original Code.
|
||||||
|
|
||||||
|
You may distribute Original Code only in Source form (not Executable),
|
||||||
|
and You must include a notice stating that the Source Code version of the
|
||||||
|
Original Code is available under the terms of this License. The notice
|
||||||
|
must be conspicuously included in any notice in an distributed versions,
|
||||||
|
related documentation or collateral in which You describe
|
||||||
|
recipients' rights relating to the Original Code. You may distribute the
|
||||||
|
Source versions of Your version of the Code or ownership
|
||||||
|
rights under a license of Your choice, which may contain terms different
|
||||||
|
from this License, provided that You are in compliance with the terms of
|
||||||
|
this License. If You distribute the Source versions under
|
||||||
|
a different license You must make it absolutely clear that any terms which
|
||||||
|
differ from this License are offered by You alone, not by the Initial Developer.
|
||||||
|
|
||||||
|
You hereby agree to indemnify the Initial Developer for any liability incurred
|
||||||
|
by the Initial Developer as a result of any such terms You offer.
|
||||||
|
|
||||||
|
3.4 Larger Works.
|
||||||
|
|
||||||
|
You may create a Larger Work by combining Original Code with other
|
||||||
|
code not governed by the terms of this License and distribute the Larger
|
||||||
|
Work as a single product. In such a case, You must make sure the requirements
|
||||||
|
of this License are fulfilled for the Original Code.
|
||||||
|
|
||||||
|
4.0 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION
|
||||||
|
|
||||||
|
If it is impossible for You to comply with any of the terms of this
|
||||||
|
License with respect to some or all of the Original Code due to statute,
|
||||||
|
judicial order, or regulation then You must: (a) comply with the terms
|
||||||
|
of this License to the maximum extent possible; and (b) describe the limitations
|
||||||
|
and the code they affect. Such description must be included in the LEGAL
|
||||||
|
file described in Section 3.2 and must be included with all distributions
|
||||||
|
of the Source Code. Except to the extent prohibited by statute or regulation,
|
||||||
|
such description must be sufficiently detailed for a recipient of ordinary
|
||||||
|
skill to be able to understand it.
|
||||||
|
|
||||||
|
5.0 APPLICATION OF THIS LICENSE
|
||||||
|
|
||||||
|
This License applies to code to which the Initial Developer has attached
|
||||||
|
the notice in Exhibit A and to related Modifications as set out in Section
|
||||||
|
3.1.
|
||||||
|
|
||||||
|
6.0 VERSIONS OF THE LICENSE
|
||||||
|
|
||||||
|
6.1 New Versions.
|
||||||
|
|
||||||
|
Agileco may publish revised and/or new versions of the License from time
|
||||||
|
to time. Each version will be given a distinguishing version number.
|
||||||
|
|
||||||
|
6.2 Effect of New Versions.
|
||||||
|
|
||||||
|
Once Original Code has been published under a particular version of
|
||||||
|
the License, You may always continue to use it under the terms of that
|
||||||
|
version. You may also choose to use such Original Code under the terms
|
||||||
|
of any subsequent version of the License published by Agile. No one other
|
||||||
|
than Agileco has the right to modify the terms applicable to Original Code.
|
||||||
|
|
||||||
|
7.0 DISCLAIMER OF WARRANTY
|
||||||
|
|
||||||
|
ORIGINAL CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
|
||||||
|
LIMITATION,
|
||||||
|
WARRANTIES THAT THE ORIGINAL CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT
|
||||||
|
FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY
|
||||||
|
AND PERFORMANCE OF THE ORIGINAL CODE IS WITH YOU. SHOULD ANY ORIGINAL CODE
|
||||||
|
PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER) ASSUME
|
||||||
|
THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||||
|
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY
|
||||||
|
ORIGINAL CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||||
|
|
||||||
|
8.0 TERMINATION
|
||||||
|
|
||||||
|
8.1 This License and the rights granted hereunder will terminate
|
||||||
|
automatically if You fail to comply with terms herein and fail to cure
|
||||||
|
such breach within 30 days of becoming aware of the breach. All sublicenses
|
||||||
|
to the Original Code which are properly granted shall survive any termination
|
||||||
|
of this License. Provisions which, by their nature, must remain in effect
|
||||||
|
beyond the termination of this License shall survive.
|
||||||
|
|
||||||
|
8.2 In the event of termination under Section 8.1 above, all
|
||||||
|
end user license agreements (excluding distributors and resellers) which
|
||||||
|
have been validly granted by You or any distributor hereunder prior to
|
||||||
|
termination shall survive termination.
|
||||||
|
|
||||||
|
9.0 LIMIT OF LIABILITY
|
||||||
|
|
||||||
|
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
|
||||||
|
NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER,
|
||||||
|
ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF ORIGINAL CODE, OR ANY SUPPLIER
|
||||||
|
OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL,
|
||||||
|
INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
|
||||||
|
LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE
|
||||||
|
OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN
|
||||||
|
IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR
|
||||||
|
PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE
|
||||||
|
LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
|
||||||
|
OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
|
||||||
|
AND LIMITATION MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
10.0 U.S. GOVERNMENT END USERS
|
||||||
|
|
||||||
|
U.S. Government: If this Software is being acquired by or on behalf
|
||||||
|
of the U.S. Government or by a U.S. Government prime contractor or subcontractor
|
||||||
|
(at any tier), then the Government's rights in the Software and accompanying
|
||||||
|
documentation shall be only as set forth in this license; this is in accordance
|
||||||
|
with 48 C.F.R. 227.7201 through 227.7202-4 (for Department of Defense (DoD)
|
||||||
|
acquisitions) and with 48 C.F.R. 2.101 and 12.212 (for non-DoD acquisitions).
|
||||||
|
|
||||||
|
11.0 MISCELLANEOUS
|
||||||
|
|
||||||
|
This License represents the complete agreement concerning subject matter
|
||||||
|
hereof. If any provision of this License is held to be unenforceable, such
|
||||||
|
provision shall be reformed only to the extent necessary to make it enforceable.
|
||||||
|
|
||||||
|
This License shall be governed by South Carolina law provisions (except to
|
||||||
|
the extent applicable law, if any, provides otherwise), excluding its
|
||||||
|
conflict-of-law
|
||||||
|
provisions. With respect to disputes in which at least one party is a citizen
|
||||||
|
of, or an entity chartered or registered to do business in the United States
|
||||||
|
of America, any litigation relating to this License shall be subject to
|
||||||
|
the jurisdiction of the Federal Courts of South Carolina,
|
||||||
|
with venue lying in Greenville, South Carolina, with the losing party
|
||||||
|
responsible for costs, including without limitation, court costs and reasonable
|
||||||
|
attorneys' fees and expenses. The application of the United Nations Convention
|
||||||
|
on Contracts for the International Sale of Goods is expressly excluded.
|
||||||
|
Any law or regulation which provides that the language of a contract shall
|
||||||
|
be construed against the drafter shall not apply to this License.
|
||||||
|
|
||||||
|
EXHIBIT A - Open AgileBill License
|
||||||
|
|
||||||
|
"The contents of this file are subject to the Open AgileBill License v1.4 (the "License");
|
||||||
|
You may not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at http://www.agileco.com/agilebill/license1-4.txt
|
||||||
|
|
||||||
|
Software distributed under the License is distributed on
|
||||||
|
an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
|
||||||
|
express or implied. See the License for the specific
|
||||||
|
language governing rights and limitations under the License.
|
||||||
|
|
||||||
|
The Original Code is ______________________________________.
|
||||||
|
|
||||||
|
The Initial Developer of the Original Code is:
|
||||||
|
Agileco, LLC
|
||||||
|
|
||||||
|
Portions created by: _______________________________________
|
||||||
|
|
||||||
|
are Copyright (C): _______________________________________
|
||||||
|
|
||||||
|
All Rights Reserved.
|
||||||
|
|
||||||
|
Contributor(s): _______________________________________
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EXHIBIT B - Standards
|
||||||
|
|
||||||
|
The Standard is defined as the following:
|
||||||
|
|
||||||
|
OpenOffice.org XML File Format Specification, located at http://xml.openoffice.org
|
||||||
|
|
||||||
|
OpenOffice.org Application Programming Interface Specification, located
|
||||||
|
at http://api.openoffice.org
|
26
admin.php
Normal file
26
admin.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AgileBill - Open Billing Software
|
||||||
|
*
|
||||||
|
* This body of work is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Open AgileBill License
|
||||||
|
* License as published at http://www.agileco.com/agilebill/license1-4.txt
|
||||||
|
*
|
||||||
|
* For questions, help, comments, discussion, etc., please join the
|
||||||
|
* Agileco community forums at http://forum.agileco.com/
|
||||||
|
*
|
||||||
|
* @link http://www.agileco.com/
|
||||||
|
* @copyright 2004-2008 Agileco, LLC.
|
||||||
|
* @license http://www.agileco.com/agilebill/license1-4.txt
|
||||||
|
* @author Tony Landis <tony@agileco.com>
|
||||||
|
* @package AgileBill
|
||||||
|
* @version 1.4.93
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_POST["default_admin"]) && !isset($_POST["default_admin"]))
|
||||||
|
{
|
||||||
|
DEFINE('ADMIN_FORCE', true);
|
||||||
|
}
|
||||||
|
include_once('index.php');
|
||||||
|
?>
|
49
ajax.php
Normal file
49
ajax.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AgileBill - Open Billing Software
|
||||||
|
*
|
||||||
|
* This body of work is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Open AgileBill License
|
||||||
|
* License as published at http://www.agileco.com/agilebill/license1-4.txt
|
||||||
|
*
|
||||||
|
* For questions, help, comments, discussion, etc., please join the
|
||||||
|
* Agileco community forums at http://forum.agileco.com/
|
||||||
|
*
|
||||||
|
* @link http://www.agileco.com/
|
||||||
|
* @copyright 2004-2008 Agileco, LLC.
|
||||||
|
* @license http://www.agileco.com/agilebill/license1-4.txt
|
||||||
|
* @author Tony Landis <tony@agileco.com>
|
||||||
|
* @package AgileBill
|
||||||
|
* @version 1.4.93
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
define('AJAX', 1);
|
||||||
|
require_once('config.inc.php');
|
||||||
|
require_once('modules/core/vars.inc.php');
|
||||||
|
$C_vars = new CORE_vars;
|
||||||
|
$VAR = $C_vars->f;
|
||||||
|
require_once('includes/adodb/adodb.inc.php');
|
||||||
|
require_once('modules/core/auth.inc.php');
|
||||||
|
require_once('modules/core/database.inc.php');
|
||||||
|
require_once('modules/core/method_ajax.inc.php');
|
||||||
|
require_once('modules/core/session.inc.php');
|
||||||
|
require_once('modules/core/setup.inc.php');
|
||||||
|
$C_debug = new CORE_debugger;
|
||||||
|
$C_setup = new CORE_setup;
|
||||||
|
$C_sess = new CORE_session;
|
||||||
|
$C_sess->session_constant();
|
||||||
|
$C_method = new CORE_method;
|
||||||
|
if ((isset($VAR['_login'])) && (isset($VAR['_username'])) && (isset($VAR['_password']))) {
|
||||||
|
require_once(PATH_CORE . 'login.inc.php');
|
||||||
|
$C_login = new CORE_login_handler();
|
||||||
|
$C_login->login($VAR);
|
||||||
|
}
|
||||||
|
$C_sess->session_constant_log();
|
||||||
|
$C_auth = new CORE_auth (false);
|
||||||
|
$C_method->do_all();
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
?>
|
64
config.inc.php
Normal file
64
config.inc.php
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
# Main path settings, iclude trailing slashes!
|
||||||
|
define ('PATH_AGILE', 'C:/WLMP/HTDOCS/agilebill/');
|
||||||
|
|
||||||
|
# Base site for cookies, example: '.domain.com'
|
||||||
|
define ('AGILE_COOKIE', '');
|
||||||
|
|
||||||
|
# Enable multiple simultaneous sessions for a single user
|
||||||
|
define ('ALLOW_MULTI_LOGIN', false);
|
||||||
|
|
||||||
|
# Database settings
|
||||||
|
define ('AGILE_DB_LIMIT', '25' );
|
||||||
|
define ('AGILE_DB_TYPE', 'mysql' );
|
||||||
|
define ('AGILE_DB_HOST', 'localhost' );
|
||||||
|
define ('AGILE_DB_DATABASE', 'agilebill' );
|
||||||
|
define ('AGILE_DB_USERNAME', 'root' );
|
||||||
|
define ('AGILE_DB_PASSWORD', '' );
|
||||||
|
define ('AGILE_DB_PREFIX', 'ab_' );
|
||||||
|
define ('AGILE_DB_PORT', '' );
|
||||||
|
define ('AGILE_DB_PCONNECT', false);
|
||||||
|
|
||||||
|
# No need to change anything after this line!
|
||||||
|
define ('DEFAULT_SITE', '1');
|
||||||
|
define ('DEF_THEME_N', 'default');
|
||||||
|
define ('PATH_CORE', PATH_AGILE . 'modules/core/');
|
||||||
|
define ('PATH_MODULES', PATH_AGILE . 'modules/');
|
||||||
|
define ('PATH_LANGUAGE', PATH_AGILE . 'language/');
|
||||||
|
define ('PATH_THEMES', PATH_AGILE . 'themes/');
|
||||||
|
define ('PATH_PLUGINS', PATH_AGILE . 'plugins/');
|
||||||
|
define ('PATH_INCLUDES', PATH_AGILE . 'includes/');
|
||||||
|
define ('AGILE_PDF_INVOICE_PATH',PATH_AGILE . 'includes/files/');
|
||||||
|
define ('PATH_FILES', PATH_AGILE . 'includes/files/');
|
||||||
|
define ('PATH_IMAGES', PATH_AGILE . 'includes/images/');
|
||||||
|
define ('URL_IMAGES', 'includes/images/');
|
||||||
|
define ('PATH_ADODB', PATH_AGILE . 'includes/adodb/');
|
||||||
|
$ADODB_CACHE_DIR = PATH_ADODB . 'cache';
|
||||||
|
define ('PATH_FPDF', PATH_AGILE . 'includes/pdf/');
|
||||||
|
define ('PATH_FPDF_TMP', PATH_AGILE . 'includes/pdf/tmp/');
|
||||||
|
define ('FPDF_FONTPATH', PATH_AGILE . 'includes/pdf/font/');
|
||||||
|
define ('PATH_SMARTY', PATH_AGILE . 'includes/smarty/');
|
||||||
|
define ('PATH_GRAPH', PATH_AGILE . 'includes/jpgraph/');
|
||||||
|
//define('SMARTY_DIR', PATH_SMARTY);
|
||||||
|
|
||||||
|
if (isset($REMOTE_ADDR)) define ('USER_IP', $REMOTE_ADDR);
|
||||||
|
elseif (isset($REMOTE_HOST)) define ('USER_IP', $REMOTE_HOST);
|
||||||
|
elseif (getenv('HTTP_X_FORWARDED_FOR')) define ('USER_IP', getenv('HTTP_X_FORWARD_FOR'));
|
||||||
|
else define ('USER_IP', getenv('REMOTE_ADDR'));
|
||||||
|
|
||||||
|
if (!extension_loaded('gd')) define('GD', false);
|
||||||
|
else define('GD', true);
|
||||||
|
|
||||||
|
$_PAGE_SHORTCUTS = Array ( Array ( 's' => '_news', 'p' => 'newsletter:newsletter' ),
|
||||||
|
Array ( 's' => '_affiliate', 'p' => 'affiliate:affiliate' ),
|
||||||
|
Array ( 's' => '_contact', 'p' => 'staff:staff' ),
|
||||||
|
Array ( 's' => '_ticket', 'p' => 'ticket:ticket' ),
|
||||||
|
Array ( 's' => '_account', 'p' => 'account:account' ),
|
||||||
|
Array ( 's' => '_products', 'p' => 'product:cat' ),
|
||||||
|
Array ( 's' => '_product', 'p' => 'product:details' ),
|
||||||
|
Array ( 's' => '_cart', 'p' => 'cart:cart' ),
|
||||||
|
Array ( 's' => '_checkout', 'p' => 'checkout:checkout' ),
|
||||||
|
Array ( 's' => '_static', 'p' => 'static_page:show' )
|
||||||
|
);
|
||||||
|
?>
|
103
cookie.index.php
Normal file
103
cookie.index.php
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
# Require the needed files...
|
||||||
|
require_once('config.inc.php');
|
||||||
|
require_once(PATH_ADODB . 'adodb.inc.php');
|
||||||
|
require_once(PATH_CORE . 'auth.inc.php');
|
||||||
|
require_once(PATH_CORE . 'database.inc.php');
|
||||||
|
require_once(PATH_CORE . 'session.inc.php');
|
||||||
|
require_once(PATH_CORE . 'setup.inc.php');
|
||||||
|
require_once(PATH_CORE . 'vars.inc.php');
|
||||||
|
require_once(PATH_CORE . 'xml.inc.php');
|
||||||
|
|
||||||
|
# start the debugger
|
||||||
|
$C_debug = new CORE_debugger;
|
||||||
|
|
||||||
|
# remove conflicting s variable
|
||||||
|
if (isset($_GET['s']))
|
||||||
|
{
|
||||||
|
$_GET_s = $_GET['s'];
|
||||||
|
unset($_GET['s']);
|
||||||
|
}
|
||||||
|
else if( isset($_POST['s']))
|
||||||
|
{
|
||||||
|
$_POST_s = $_POST['s'];
|
||||||
|
unset($_POST['s']);
|
||||||
|
}
|
||||||
|
|
||||||
|
# get the vars...
|
||||||
|
$C_vars = new CORE_vars;
|
||||||
|
$VAR = $C_vars->f;
|
||||||
|
|
||||||
|
# initialize the site setup
|
||||||
|
$C_setup = new CORE_setup;
|
||||||
|
|
||||||
|
# initialize the session handler
|
||||||
|
$C_sess = new CORE_session;
|
||||||
|
|
||||||
|
# define the other session variables as constants
|
||||||
|
$C_sess->session_constant();
|
||||||
|
|
||||||
|
# update the session constants
|
||||||
|
$C_sess->session_constant_log();
|
||||||
|
|
||||||
|
# initialze the authentication handler
|
||||||
|
$force = false;
|
||||||
|
$C_auth = new CORE_auth ($force);
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
# Verify the User's Access
|
||||||
|
$authorized = false;
|
||||||
|
if(defined("SESS_LOGGED") && SESS_LOGGED == "1" && agile_check_auth ( _HTACCESS_ID ) )
|
||||||
|
$authorized = true;
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
## forward to login page:
|
||||||
|
if ( !$authorized )
|
||||||
|
{
|
||||||
|
header("Location: ".URL."?_page=account:login_cookie&_htaccess_id=" . _HTACCESS_ID. "&_next_page="._RETURN_URL);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### Reset the 's' var
|
||||||
|
if(isset($_POST_s))
|
||||||
|
{
|
||||||
|
$_POST['s'] = $_POST_s;
|
||||||
|
}
|
||||||
|
else if (isset($_GET_s))
|
||||||
|
{
|
||||||
|
$_GET['s'] = $_GET_s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
##############################
|
||||||
|
## Check Authentication ##
|
||||||
|
##############################
|
||||||
|
function agile_check_auth($id)
|
||||||
|
{
|
||||||
|
### Check if user is a member of one of the authorized groups:
|
||||||
|
$db = &DB();
|
||||||
|
$sql = 'SELECT status,group_avail FROM ' . AGILE_DB_PREFIX . 'htaccess WHERE
|
||||||
|
site_id = ' . $db->qstr(DEFAULT_SITE) . ' AND
|
||||||
|
status = ' . $db->qstr('1') . ' AND
|
||||||
|
id = ' . $db->qstr($id);
|
||||||
|
$result = $db->Execute($sql);
|
||||||
|
if($result->RecordCount() > 0)
|
||||||
|
{
|
||||||
|
global $C_auth;
|
||||||
|
@$arr = unserialize($result->fields['group_avail']);
|
||||||
|
for($i=0; $i<count($arr); $i++)
|
||||||
|
{
|
||||||
|
if($C_auth->auth_group_by_id($arr[$i]))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_end_flush();
|
||||||
|
?>
|
266
htaccess_index.php
Normal file
266
htaccess_index.php
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
<?php
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
# Define the file types
|
||||||
|
$_IncludeFiles = Array ( 'htm', 'html', 'php', 'php3', 'php4', 'phtml', 'inc', 'phps' );
|
||||||
|
$_VirtualFiles = Array ( 'cgi', 'shtml', 'pl' );
|
||||||
|
$_PassFiles = Array
|
||||||
|
(
|
||||||
|
Array ('name' => 'jpg', 'type' => 'image/jpeg', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'jpeg', 'type' => 'image/jpeg', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'jpe', 'type' => 'image/jpeg', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'gif', 'type' => 'image/gif', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'bmp', 'type' => 'image/bmp', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'tif', 'type' => 'image/tif', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'png', 'type' => 'image/png', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'wbmp', 'type' => 'image/vnd.wap.wbmp', 'disposition' => 'inline'),
|
||||||
|
|
||||||
|
Array ('name' => 'pdf', 'type' => 'application/pdf', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'exe', 'type' => 'application/octet-stream', 'disposition'=> 'attatchment'),
|
||||||
|
Array ('name' => 'zip', 'type' => 'application/x-zip', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'gzip', 'type' => 'application/gzip', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'tgz', 'type' => 'application/tgz', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'gz', 'type' => 'application/gz', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'doc', 'type' => 'application/ms-word', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'xls', 'type' => 'application/ms-excel', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'csv', 'type' => 'application/ms-excel', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'swf', 'type' => 'application/x-shockwave-flash', 'disposition' => 'inline'),
|
||||||
|
|
||||||
|
Array ('name' => 'txt', 'type' => 'text/plain', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'text', 'type' => 'text/plain', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'rtf', 'type' => 'text/richtext', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'xml', 'type' => 'text/xml', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'css', 'type' => 'text/css', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'js', 'type' => 'text/plain', 'disposition' => 'inline'),
|
||||||
|
Array ('name' => 'wml', 'type' => 'text/vnd.wap.wml', 'disposition' => 'inline'),
|
||||||
|
|
||||||
|
Array ('name' => 'avi', 'type' => 'video/avi', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'mpg', 'type' => 'video/mpeg', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'mpeg', 'type' => 'video/mpeg', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'mpe', 'type' => 'video/mpeg', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'wmv', 'type' => 'video/x-ms-wmv', 'disposition' => 'attatchment'),
|
||||||
|
Array ('name' => 'asf', 'type' => 'video/x-ms-asf', 'disposition' => 'attatchment')
|
||||||
|
);
|
||||||
|
|
||||||
|
# Load the config file:
|
||||||
|
require_once('config.inc.php');
|
||||||
|
|
||||||
|
# Require the needed files...
|
||||||
|
require_once(PATH_ADODB . 'adodb.inc.php');
|
||||||
|
require_once(PATH_CORE . 'auth.inc.php');
|
||||||
|
require_once(PATH_CORE . 'database.inc.php');
|
||||||
|
require_once(PATH_CORE . 'method.inc.php');
|
||||||
|
require_once(PATH_CORE . 'session.inc.php');
|
||||||
|
require_once(PATH_CORE . 'translate.inc.php');
|
||||||
|
require_once(PATH_CORE . 'setup.inc.php');
|
||||||
|
require_once(PATH_CORE . 'vars.inc.php');
|
||||||
|
require_once(PATH_CORE . 'xml.inc.php');
|
||||||
|
|
||||||
|
## Path to the error file
|
||||||
|
define ( 'ERROR_GIF', PATH_THEMES.DEF_THEME_N.'/images/htaccess_error.gif' );
|
||||||
|
|
||||||
|
# start the debugger
|
||||||
|
$C_debug = new CORE_debugger;
|
||||||
|
|
||||||
|
# initialize the GET/POST vars
|
||||||
|
$C_vars = new CORE_vars;
|
||||||
|
$VAR = $C_vars->f;
|
||||||
|
|
||||||
|
# initialize the site setup
|
||||||
|
$C_setup = new CORE_setup;
|
||||||
|
|
||||||
|
# initialize the session handler
|
||||||
|
$C_sess = new CORE_session;
|
||||||
|
|
||||||
|
# define the other session variables as constants
|
||||||
|
$C_sess->session_constant();
|
||||||
|
|
||||||
|
# initialize the translation handler
|
||||||
|
$C_translate = new CORE_translate;
|
||||||
|
|
||||||
|
# update the session constants
|
||||||
|
$C_sess->session_constant_log();
|
||||||
|
|
||||||
|
# initialze the authentication handler
|
||||||
|
$force = false;
|
||||||
|
$C_auth = new CORE_auth ($force);
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Verify the User's Access
|
||||||
|
$authorized = false;
|
||||||
|
if(defined("SESS_LOGGED"))
|
||||||
|
if(SESS_LOGGED == "1" && check_auth($VAR['_HTACCESS_ID']))
|
||||||
|
$authorized = true;
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
## If this was a GET:
|
||||||
|
if ( isset($REQUEST_URI ) )
|
||||||
|
{
|
||||||
|
$ARRAY = explode ( '?', $REQUEST_URI);
|
||||||
|
$REQUEST_URI = $ARRAY[0] ;
|
||||||
|
}
|
||||||
|
|
||||||
|
## Define global system vars...
|
||||||
|
if(!isset($DOCUMENT_ROOT)) $DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
|
||||||
|
if(!isset($REQUEST_URI)) $REQUEST_URI = $_SERVER["REQUEST_URI"];
|
||||||
|
if(!isset($SCRIPT_FILENAME)) $SCRIPT_FILENAME = $_SERVER["SCRIPT_FILENAME"];
|
||||||
|
|
||||||
|
|
||||||
|
############################################################################
|
||||||
|
### Check if File Exists:
|
||||||
|
if (file_exists($DOCUMENT_ROOT.$REQUEST_URI) &&
|
||||||
|
($SCRIPT_FILENAME != $DOCUMENT_ROOT.$REQUEST_URI) &&
|
||||||
|
($REQUEST_URI != "/") &&
|
||||||
|
(!ereg( '[////]{2,}$', $REQUEST_URI ) ) )
|
||||||
|
{
|
||||||
|
|
||||||
|
$url = $REQUEST_URI;
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check Passthu File Types:
|
||||||
|
|
||||||
|
for ($i=0; $i<count($_PassFiles); $i++)
|
||||||
|
{
|
||||||
|
$ext = substr (strrchr ($DOCUMENT_ROOT.$url, "."), 1);
|
||||||
|
if ( strtolower ( $ext ) == $_PassFiles[$i]["name"] )
|
||||||
|
{
|
||||||
|
if ($authorized)
|
||||||
|
{
|
||||||
|
# determine the filename:
|
||||||
|
$ext1 = $_PassFiles[$i]['name'];
|
||||||
|
@$arr2 = explode('/', $REQUEST_URI);
|
||||||
|
$file_name = 'download.'.$ext1;
|
||||||
|
for($ii=0; $ii<count($arr2); $ii++)
|
||||||
|
$file_name = $arr2[$ii];
|
||||||
|
|
||||||
|
# Set the correct header info:
|
||||||
|
header("Content-type: " . $_PassFiles[$i]['type']);
|
||||||
|
header("Content-Disposition: " . $_PassFiles[$i]['disposition'] . ";filename=$file_name");
|
||||||
|
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||||
|
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||||
|
header("Pragma: no-cache");
|
||||||
|
@readfile ($DOCUMENT_ROOT.$url, "r");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
# Display the error gif:
|
||||||
|
header("Content-type: image/gif");
|
||||||
|
header("Content-Disposition: inline;filename=error.gif");
|
||||||
|
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||||
|
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||||
|
header("Pragma: no-cache");
|
||||||
|
@readfile (ERROR_GIF, "r");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check Include File Types:
|
||||||
|
|
||||||
|
for ($i=0; $i<count($_IncludeFiles); $i++)
|
||||||
|
{
|
||||||
|
$ext = substr (strrchr ($DOCUMENT_ROOT.$url, "."), 1);
|
||||||
|
if ( strtolower ( $ext ) == $_IncludeFiles[$i] )
|
||||||
|
{
|
||||||
|
if ($authorized)
|
||||||
|
{
|
||||||
|
## run:
|
||||||
|
include_once ( $DOCUMENT_ROOT.$url );
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
## forward to login page:
|
||||||
|
header("Location: ".URL."?_page=account:login_htaccess&_htaccess_id=" . $VAR['_HTACCESS_ID'] . '&_htaccess_dir_id=' . $VAR['_HTACCESS_DIR_ID']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check Virtual File Types:
|
||||||
|
for ($i=0; $i<count($_VirtualFiles); $i++)
|
||||||
|
{
|
||||||
|
$ext = substr (strrchr ($DOCUMENT_ROOT.$url, "."), 1);
|
||||||
|
if ( strtolower ( $ext ) == $_VirtualFiles[$i] )
|
||||||
|
{
|
||||||
|
virtual ( $DOCUMENT_ROOT.$url . "?" . $variables); // < needs some work!
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
### Load the index file:
|
||||||
|
|
||||||
|
$url=strip_tags($REQUEST_URI);
|
||||||
|
$url_array=explode("/",$url);
|
||||||
|
array_shift($url_array);
|
||||||
|
if ( $authorized ) {
|
||||||
|
if(!empty($url_array) && file_exists($DOCUMENT_ROOT.$url.INDEX_FILE) ) {
|
||||||
|
include(INDEX_FILE);
|
||||||
|
exit();
|
||||||
|
} else {
|
||||||
|
## Locate the index file, if any
|
||||||
|
for($i=0; $i<count($_IncludeFiles); $i++) {
|
||||||
|
if(file_exists($DOCUMENT_ROOT.$url.'index.'.$_IncludeFiles[$i])) {
|
||||||
|
include($DOCUMENT_ROOT.$url.'index.'.$_IncludeFiles[$i]);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
## No index located!
|
||||||
|
echo "<BR><BR><B><CENTER>PAGE NOT FOUND</CENTER></B>";
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
## forward to login page:
|
||||||
|
header("Location: ".URL."?_page=account:login_htaccess&_htaccess_id=" . $VAR['_HTACCESS_ID'] . '&_htaccess_dir_id=' . $VAR['_HTACCESS_DIR_ID']);
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Filetype not defined, force download:
|
||||||
|
|
||||||
|
header("Pragma: public");
|
||||||
|
header("Expires: 0");
|
||||||
|
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
|
||||||
|
header("Content-Type: application/force-download");
|
||||||
|
header("Content-Type: application/octet-stream");
|
||||||
|
header("Content-Type: application/download");
|
||||||
|
header("Content-Disposition: attachment; filename=".@basename($DOCUMENT_ROOT.$url).";");
|
||||||
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
header("Content-Length: ".@filesize($DOCUMENT_ROOT.$url));
|
||||||
|
@readfile("$DOCUMENT_ROOT.$url");
|
||||||
|
exit();
|
||||||
|
|
||||||
|
|
||||||
|
##############################
|
||||||
|
## Check Authentication ##
|
||||||
|
##############################
|
||||||
|
function check_auth($id)
|
||||||
|
{
|
||||||
|
### Check if user is a member of one of the authorized groups:
|
||||||
|
$db = &DB();
|
||||||
|
$sql = 'SELECT status,group_avail FROM ' . AGILE_DB_PREFIX . 'htaccess WHERE
|
||||||
|
site_id = ' . $db->qstr(DEFAULT_SITE) . ' AND
|
||||||
|
status = ' . $db->qstr('1') . ' AND
|
||||||
|
id = ' . $db->qstr($id);
|
||||||
|
$result = $db->Execute($sql);
|
||||||
|
if($result->RecordCount() > 0) {
|
||||||
|
global $C_auth;
|
||||||
|
@$arr = unserialize($result->fields['group_avail']);
|
||||||
|
for($i=0; $i<count($arr); $i++)
|
||||||
|
if($C_auth->auth_group_by_id($arr[$i]))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_end_flush();
|
||||||
|
?>
|
317
includes/adodb/adodb-csvlib.inc.php
Normal file
317
includes/adodb/adodb-csvlib.inc.php
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
global $ADODB_INCLUDED_CSV;
|
||||||
|
$ADODB_INCLUDED_CSV = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Library for CSV serialization. This is used by the csv/proxy driver and is the
|
||||||
|
CacheExecute() serialization format.
|
||||||
|
|
||||||
|
==== NOTE ====
|
||||||
|
Format documented at http://php.weblogs.com/ADODB_CSV
|
||||||
|
==============
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert a recordset into special format
|
||||||
|
*
|
||||||
|
* @param rs the recordset
|
||||||
|
*
|
||||||
|
* @return the CSV formated data
|
||||||
|
*/
|
||||||
|
function _rs2serialize(&$rs,$conn=false,$sql='')
|
||||||
|
{
|
||||||
|
$max = ($rs) ? $rs->FieldCount() : 0;
|
||||||
|
|
||||||
|
if ($sql) $sql = urlencode($sql);
|
||||||
|
// metadata setup
|
||||||
|
|
||||||
|
if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete
|
||||||
|
if (is_object($conn)) {
|
||||||
|
$sql .= ','.$conn->Affected_Rows();
|
||||||
|
$sql .= ','.$conn->Insert_ID();
|
||||||
|
} else
|
||||||
|
$sql .= ',,';
|
||||||
|
|
||||||
|
$text = "====-1,0,$sql\n";
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
$tt = ($rs->timeCreated) ? $rs->timeCreated : time();
|
||||||
|
|
||||||
|
## changed format from ====0 to ====1
|
||||||
|
$line = "====1,$tt,$sql\n";
|
||||||
|
|
||||||
|
if ($rs->databaseType == 'array') {
|
||||||
|
$rows = $rs->_array;
|
||||||
|
} else {
|
||||||
|
$rows = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
$rows[] = $rs->fields;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for($i=0; $i < $max; $i++) {
|
||||||
|
$o = $rs->FetchField($i);
|
||||||
|
$flds[] = $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
$savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
|
||||||
|
$class = $rs->connection->arrayClass;
|
||||||
|
$rs2 = new $class();
|
||||||
|
$rs2->sql = $rs->sql;
|
||||||
|
$rs2->oldProvider = $rs->dataProvider;
|
||||||
|
$rs2->InitArrayFields($rows,$flds);
|
||||||
|
$rs2->fetchMode = $savefetch;
|
||||||
|
return $line.serialize($rs2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open CSV file and convert it into Data.
|
||||||
|
*
|
||||||
|
* @param url file/ftp/http url
|
||||||
|
* @param err returns the error message
|
||||||
|
* @param timeout dispose if recordset has been alive for $timeout secs
|
||||||
|
*
|
||||||
|
* @return recordset, or false if error occured. If no
|
||||||
|
* error occurred in sql INSERT/UPDATE/DELETE,
|
||||||
|
* empty recordset is returned
|
||||||
|
*/
|
||||||
|
function csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array')
|
||||||
|
{
|
||||||
|
$false = false;
|
||||||
|
$err = false;
|
||||||
|
$fp = @fopen($url,'rb');
|
||||||
|
if (!$fp) {
|
||||||
|
$err = $url.' file/URL not found';
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
@flock($fp, LOCK_SH);
|
||||||
|
$arr = array();
|
||||||
|
$ttl = 0;
|
||||||
|
|
||||||
|
if ($meta = fgetcsv($fp, 32000, ",")) {
|
||||||
|
// check if error message
|
||||||
|
if (strncmp($meta[0],'****',4) === 0) {
|
||||||
|
$err = trim(substr($meta[0],4,1024));
|
||||||
|
fclose($fp);
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
// check for meta data
|
||||||
|
// $meta[0] is -1 means return an empty recordset
|
||||||
|
// $meta[1] contains a time
|
||||||
|
|
||||||
|
if (strncmp($meta[0], '====',4) === 0) {
|
||||||
|
|
||||||
|
if ($meta[0] == "====-1") {
|
||||||
|
if (sizeof($meta) < 5) {
|
||||||
|
$err = "Corrupt first line for format -1";
|
||||||
|
fclose($fp);
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
|
||||||
|
if ($timeout > 0) {
|
||||||
|
$err = " Illegal Timeout $timeout ";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = new $rsclass($val=true);
|
||||||
|
$rs->fields = array();
|
||||||
|
$rs->timeCreated = $meta[1];
|
||||||
|
$rs->EOF = true;
|
||||||
|
$rs->_numOfFields = 0;
|
||||||
|
$rs->sql = urldecode($meta[2]);
|
||||||
|
$rs->affectedrows = (integer)$meta[3];
|
||||||
|
$rs->insertid = $meta[4];
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
# Under high volume loads, we want only 1 thread/process to _write_file
|
||||||
|
# so that we don't have 50 processes queueing to write the same data.
|
||||||
|
# We use probabilistic timeout, ahead of time.
|
||||||
|
#
|
||||||
|
# -4 sec before timeout, give processes 1/32 chance of timing out
|
||||||
|
# -2 sec before timeout, give processes 1/16 chance of timing out
|
||||||
|
# -1 sec after timeout give processes 1/4 chance of timing out
|
||||||
|
# +0 sec after timeout, give processes 100% chance of timing out
|
||||||
|
if (sizeof($meta) > 1) {
|
||||||
|
if($timeout >0){
|
||||||
|
$tdiff = (integer)( $meta[1]+$timeout - time());
|
||||||
|
if ($tdiff <= 2) {
|
||||||
|
switch($tdiff) {
|
||||||
|
case 4:
|
||||||
|
case 3:
|
||||||
|
if ((rand() & 31) == 0) {
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Timeout 3";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if ((rand() & 15) == 0) {
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Timeout 2";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if ((rand() & 3) == 0) {
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Timeout 1";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Timeout 0";
|
||||||
|
return $false;
|
||||||
|
} // switch
|
||||||
|
|
||||||
|
} // if check flush cache
|
||||||
|
}// (timeout>0)
|
||||||
|
$ttl = $meta[1];
|
||||||
|
}
|
||||||
|
//================================================
|
||||||
|
// new cache format - use serialize extensively...
|
||||||
|
if ($meta[0] === '====1') {
|
||||||
|
// slurp in the data
|
||||||
|
$MAXSIZE = 128000;
|
||||||
|
|
||||||
|
$text = fread($fp,$MAXSIZE);
|
||||||
|
if (strlen($text)) {
|
||||||
|
while ($txt = fread($fp,$MAXSIZE)) {
|
||||||
|
$text .= $txt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
$rs = unserialize($text);
|
||||||
|
if (is_object($rs)) $rs->timeCreated = $ttl;
|
||||||
|
else {
|
||||||
|
$err = "Unable to unserialize recordset";
|
||||||
|
//echo htmlspecialchars($text),' !--END--!<p>';
|
||||||
|
}
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
$meta = false;
|
||||||
|
$meta = fgetcsv($fp, 32000, ",");
|
||||||
|
if (!$meta) {
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Unexpected EOF 1";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Column definitions
|
||||||
|
$flds = array();
|
||||||
|
foreach($meta as $o) {
|
||||||
|
$o2 = explode(':',$o);
|
||||||
|
if (sizeof($o2)!=3) {
|
||||||
|
$arr[] = $meta;
|
||||||
|
$flds = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = urldecode($o2[0]);
|
||||||
|
$fld->type = $o2[1];
|
||||||
|
$fld->max_length = $o2[2];
|
||||||
|
$flds[] = $fld;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fclose($fp);
|
||||||
|
$err = "Recordset had unexpected EOF 2";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// slurp in the data
|
||||||
|
$MAXSIZE = 128000;
|
||||||
|
|
||||||
|
$text = '';
|
||||||
|
while ($txt = fread($fp,$MAXSIZE)) {
|
||||||
|
$text .= $txt;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fp);
|
||||||
|
@$arr = unserialize($text);
|
||||||
|
//var_dump($arr);
|
||||||
|
if (!is_array($arr)) {
|
||||||
|
$err = "Recordset had unexpected EOF (in serialized recordset)";
|
||||||
|
if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$rs = new $rsclass();
|
||||||
|
$rs->timeCreated = $ttl;
|
||||||
|
$rs->InitArrayFields($arr,$flds);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save a file $filename and its $contents (normally for caching) with file locking
|
||||||
|
* Returns true if ok, false if fopen/fwrite error, 0 if rename error (eg. file is locked)
|
||||||
|
*/
|
||||||
|
function adodb_write_file($filename, $contents,$debug=false)
|
||||||
|
{
|
||||||
|
# http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows
|
||||||
|
# So to simulate locking, we assume that rename is an atomic operation.
|
||||||
|
# First we delete $filename, then we create a $tempfile write to it and
|
||||||
|
# rename to the desired $filename. If the rename works, then we successfully
|
||||||
|
# modified the file exclusively.
|
||||||
|
# What a stupid need - having to simulate locking.
|
||||||
|
# Risks:
|
||||||
|
# 1. $tempfile name is not unique -- very very low
|
||||||
|
# 2. unlink($filename) fails -- ok, rename will fail
|
||||||
|
# 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs
|
||||||
|
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
|
||||||
|
if (strncmp(PHP_OS,'WIN',3) === 0) {
|
||||||
|
// skip the decimal place
|
||||||
|
$mtime = substr(str_replace(' ','_',microtime()),2);
|
||||||
|
// getmypid() actually returns 0 on Win98 - never mind!
|
||||||
|
$tmpname = $filename.uniqid($mtime).getmypid();
|
||||||
|
if (!($fd = @fopen($tmpname,'w'))) return false;
|
||||||
|
if (fwrite($fd,$contents)) $ok = true;
|
||||||
|
else $ok = false;
|
||||||
|
fclose($fd);
|
||||||
|
|
||||||
|
if ($ok) {
|
||||||
|
@chmod($tmpname,0644);
|
||||||
|
// the tricky moment
|
||||||
|
@unlink($filename);
|
||||||
|
if (!@rename($tmpname,$filename)) {
|
||||||
|
unlink($tmpname);
|
||||||
|
$ok = 0;
|
||||||
|
}
|
||||||
|
if (!$ok) {
|
||||||
|
if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ok;
|
||||||
|
}
|
||||||
|
if (!($fd = @fopen($filename, 'a'))) return false;
|
||||||
|
if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) {
|
||||||
|
if (fwrite( $fd, $contents )) $ok = true;
|
||||||
|
else $ok = false;
|
||||||
|
fclose($fd);
|
||||||
|
@chmod($filename,0644);
|
||||||
|
}else {
|
||||||
|
fclose($fd);
|
||||||
|
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
|
||||||
|
$ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ok;
|
||||||
|
}
|
||||||
|
?>
|
1001
includes/adodb/adodb-datadict.inc.php
Normal file
1001
includes/adodb/adodb-datadict.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
258
includes/adodb/adodb-error.inc.php
Normal file
258
includes/adodb/adodb-error.inc.php
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* The following code is adapted from the PEAR DB error handling code.
|
||||||
|
* Portions (c)1997-2002 The PHP Group.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if (!defined("DB_ERROR")) define("DB_ERROR",-1);
|
||||||
|
|
||||||
|
if (!defined("DB_ERROR_SYNTAX")) {
|
||||||
|
define("DB_ERROR_SYNTAX", -2);
|
||||||
|
define("DB_ERROR_CONSTRAINT", -3);
|
||||||
|
define("DB_ERROR_NOT_FOUND", -4);
|
||||||
|
define("DB_ERROR_ALREADY_EXISTS", -5);
|
||||||
|
define("DB_ERROR_UNSUPPORTED", -6);
|
||||||
|
define("DB_ERROR_MISMATCH", -7);
|
||||||
|
define("DB_ERROR_INVALID", -8);
|
||||||
|
define("DB_ERROR_NOT_CAPABLE", -9);
|
||||||
|
define("DB_ERROR_TRUNCATED", -10);
|
||||||
|
define("DB_ERROR_INVALID_NUMBER", -11);
|
||||||
|
define("DB_ERROR_INVALID_DATE", -12);
|
||||||
|
define("DB_ERROR_DIVZERO", -13);
|
||||||
|
define("DB_ERROR_NODBSELECTED", -14);
|
||||||
|
define("DB_ERROR_CANNOT_CREATE", -15);
|
||||||
|
define("DB_ERROR_CANNOT_DELETE", -16);
|
||||||
|
define("DB_ERROR_CANNOT_DROP", -17);
|
||||||
|
define("DB_ERROR_NOSUCHTABLE", -18);
|
||||||
|
define("DB_ERROR_NOSUCHFIELD", -19);
|
||||||
|
define("DB_ERROR_NEED_MORE_DATA", -20);
|
||||||
|
define("DB_ERROR_NOT_LOCKED", -21);
|
||||||
|
define("DB_ERROR_VALUE_COUNT_ON_ROW", -22);
|
||||||
|
define("DB_ERROR_INVALID_DSN", -23);
|
||||||
|
define("DB_ERROR_CONNECT_FAILED", -24);
|
||||||
|
define("DB_ERROR_EXTENSION_NOT_FOUND",-25);
|
||||||
|
define("DB_ERROR_NOSUCHDB", -25);
|
||||||
|
define("DB_ERROR_ACCESS_VIOLATION", -26);
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_errormsg($value)
|
||||||
|
{
|
||||||
|
global $ADODB_LANG,$ADODB_LANG_ARRAY;
|
||||||
|
|
||||||
|
if (empty($ADODB_LANG)) $ADODB_LANG = 'en';
|
||||||
|
if (isset($ADODB_LANG_ARRAY['LANG']) && $ADODB_LANG_ARRAY['LANG'] == $ADODB_LANG) ;
|
||||||
|
else {
|
||||||
|
include_once(ADODB_DIR."/lang/adodb-$ADODB_LANG.inc.php");
|
||||||
|
}
|
||||||
|
return isset($ADODB_LANG_ARRAY[$value]) ? $ADODB_LANG_ARRAY[$value] : $ADODB_LANG_ARRAY[DB_ERROR];
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error($provider,$dbType,$errno)
|
||||||
|
{
|
||||||
|
//var_dump($errno);
|
||||||
|
if (is_numeric($errno) && $errno == 0) return 0;
|
||||||
|
switch($provider) {
|
||||||
|
case 'mysql': $map = adodb_error_mysql(); break;
|
||||||
|
|
||||||
|
case 'oracle':
|
||||||
|
case 'oci8': $map = adodb_error_oci8(); break;
|
||||||
|
|
||||||
|
case 'ibase': $map = adodb_error_ibase(); break;
|
||||||
|
|
||||||
|
case 'odbc': $map = adodb_error_odbc(); break;
|
||||||
|
|
||||||
|
case 'mssql':
|
||||||
|
case 'sybase': $map = adodb_error_mssql(); break;
|
||||||
|
|
||||||
|
case 'informix': $map = adodb_error_ifx(); break;
|
||||||
|
|
||||||
|
case 'postgres': return adodb_error_pg($errno); break;
|
||||||
|
|
||||||
|
case 'sqlite': return $map = adodb_error_sqlite(); break;
|
||||||
|
default:
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
//print_r($map);
|
||||||
|
//var_dump($errno);
|
||||||
|
if (isset($map[$errno])) return $map[$errno];
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
//**************************************************************************************
|
||||||
|
|
||||||
|
function adodb_error_pg($errormsg)
|
||||||
|
{
|
||||||
|
if (is_numeric($errormsg)) return (integer) $errormsg;
|
||||||
|
static $error_regexps = array(
|
||||||
|
'/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/i' => DB_ERROR_NOSUCHTABLE,
|
||||||
|
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/i' => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
'/divide by zero$/i' => DB_ERROR_DIVZERO,
|
||||||
|
'/pg_atoi: error in .*: can\'t parse /i' => DB_ERROR_INVALID_NUMBER,
|
||||||
|
'/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/i' => DB_ERROR_NOSUCHFIELD,
|
||||||
|
'/parser: parse error at or near \"/i' => DB_ERROR_SYNTAX,
|
||||||
|
'/referential integrity violation/i' => DB_ERROR_CONSTRAINT,
|
||||||
|
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/i'
|
||||||
|
=> DB_ERROR_ALREADY_EXISTS
|
||||||
|
);
|
||||||
|
reset($error_regexps);
|
||||||
|
while (list($regexp,$code) = each($error_regexps)) {
|
||||||
|
if (preg_match($regexp, $errormsg)) {
|
||||||
|
return $code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Fall back to DB_ERROR if there was no mapping.
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_odbc()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
'01004' => DB_ERROR_TRUNCATED,
|
||||||
|
'07001' => DB_ERROR_MISMATCH,
|
||||||
|
'21S01' => DB_ERROR_MISMATCH,
|
||||||
|
'21S02' => DB_ERROR_MISMATCH,
|
||||||
|
'22003' => DB_ERROR_INVALID_NUMBER,
|
||||||
|
'22008' => DB_ERROR_INVALID_DATE,
|
||||||
|
'22012' => DB_ERROR_DIVZERO,
|
||||||
|
'23000' => DB_ERROR_CONSTRAINT,
|
||||||
|
'24000' => DB_ERROR_INVALID,
|
||||||
|
'34000' => DB_ERROR_INVALID,
|
||||||
|
'37000' => DB_ERROR_SYNTAX,
|
||||||
|
'42000' => DB_ERROR_SYNTAX,
|
||||||
|
'IM001' => DB_ERROR_UNSUPPORTED,
|
||||||
|
'S0000' => DB_ERROR_NOSUCHTABLE,
|
||||||
|
'S0001' => DB_ERROR_NOT_FOUND,
|
||||||
|
'S0002' => DB_ERROR_NOSUCHTABLE,
|
||||||
|
'S0011' => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
'S0012' => DB_ERROR_NOT_FOUND,
|
||||||
|
'S0021' => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
'S0022' => DB_ERROR_NOT_FOUND,
|
||||||
|
'S1000' => DB_ERROR_NOSUCHTABLE,
|
||||||
|
'S1009' => DB_ERROR_INVALID,
|
||||||
|
'S1090' => DB_ERROR_INVALID,
|
||||||
|
'S1C00' => DB_ERROR_NOT_CAPABLE
|
||||||
|
);
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_ibase()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
-104 => DB_ERROR_SYNTAX,
|
||||||
|
-150 => DB_ERROR_ACCESS_VIOLATION,
|
||||||
|
-151 => DB_ERROR_ACCESS_VIOLATION,
|
||||||
|
-155 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
-157 => DB_ERROR_NOSUCHFIELD,
|
||||||
|
-158 => DB_ERROR_VALUE_COUNT_ON_ROW,
|
||||||
|
-170 => DB_ERROR_MISMATCH,
|
||||||
|
-171 => DB_ERROR_MISMATCH,
|
||||||
|
-172 => DB_ERROR_INVALID,
|
||||||
|
-204 => DB_ERROR_INVALID,
|
||||||
|
-205 => DB_ERROR_NOSUCHFIELD,
|
||||||
|
-206 => DB_ERROR_NOSUCHFIELD,
|
||||||
|
-208 => DB_ERROR_INVALID,
|
||||||
|
-219 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
-297 => DB_ERROR_CONSTRAINT,
|
||||||
|
-530 => DB_ERROR_CONSTRAINT,
|
||||||
|
-803 => DB_ERROR_CONSTRAINT,
|
||||||
|
-551 => DB_ERROR_ACCESS_VIOLATION,
|
||||||
|
-552 => DB_ERROR_ACCESS_VIOLATION,
|
||||||
|
-922 => DB_ERROR_NOSUCHDB,
|
||||||
|
-923 => DB_ERROR_CONNECT_FAILED,
|
||||||
|
-924 => DB_ERROR_CONNECT_FAILED
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_ifx()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
'-201' => DB_ERROR_SYNTAX,
|
||||||
|
'-206' => DB_ERROR_NOSUCHTABLE,
|
||||||
|
'-217' => DB_ERROR_NOSUCHFIELD,
|
||||||
|
'-329' => DB_ERROR_NODBSELECTED,
|
||||||
|
'-1204' => DB_ERROR_INVALID_DATE,
|
||||||
|
'-1205' => DB_ERROR_INVALID_DATE,
|
||||||
|
'-1206' => DB_ERROR_INVALID_DATE,
|
||||||
|
'-1209' => DB_ERROR_INVALID_DATE,
|
||||||
|
'-1210' => DB_ERROR_INVALID_DATE,
|
||||||
|
'-1212' => DB_ERROR_INVALID_DATE
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_oci8()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
1 => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
900 => DB_ERROR_SYNTAX,
|
||||||
|
904 => DB_ERROR_NOSUCHFIELD,
|
||||||
|
923 => DB_ERROR_SYNTAX,
|
||||||
|
942 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
955 => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
1476 => DB_ERROR_DIVZERO,
|
||||||
|
1722 => DB_ERROR_INVALID_NUMBER,
|
||||||
|
2289 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
2291 => DB_ERROR_CONSTRAINT,
|
||||||
|
2449 => DB_ERROR_CONSTRAINT
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_mssql()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
208 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
2601 => DB_ERROR_ALREADY_EXISTS
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_sqlite()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
1 => DB_ERROR_SYNTAX
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
function adodb_error_mysql()
|
||||||
|
{
|
||||||
|
static $MAP = array(
|
||||||
|
1004 => DB_ERROR_CANNOT_CREATE,
|
||||||
|
1005 => DB_ERROR_CANNOT_CREATE,
|
||||||
|
1006 => DB_ERROR_CANNOT_CREATE,
|
||||||
|
1007 => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
1008 => DB_ERROR_CANNOT_DROP,
|
||||||
|
1045 => DB_ERROR_ACCESS_VIOLATION,
|
||||||
|
1046 => DB_ERROR_NODBSELECTED,
|
||||||
|
1049 => DB_ERROR_NOSUCHDB,
|
||||||
|
1050 => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
1051 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
1054 => DB_ERROR_NOSUCHFIELD,
|
||||||
|
1062 => DB_ERROR_ALREADY_EXISTS,
|
||||||
|
1064 => DB_ERROR_SYNTAX,
|
||||||
|
1100 => DB_ERROR_NOT_LOCKED,
|
||||||
|
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
|
||||||
|
1146 => DB_ERROR_NOSUCHTABLE,
|
||||||
|
1048 => DB_ERROR_CONSTRAINT,
|
||||||
|
2002 => DB_ERROR_CONNECT_FAILED,
|
||||||
|
2005 => DB_ERROR_CONNECT_FAILED
|
||||||
|
);
|
||||||
|
|
||||||
|
return $MAP;
|
||||||
|
}
|
||||||
|
?>
|
79
includes/adodb/adodb-errorhandler.inc.php
Normal file
79
includes/adodb/adodb-errorhandler.inc.php
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// added Claudio Bustos clbustos#entelchile.net
|
||||||
|
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
|
||||||
|
|
||||||
|
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_Handler');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Error Handler. This will be called with the following params
|
||||||
|
*
|
||||||
|
* @param $dbms the RDBMS you are connecting to
|
||||||
|
* @param $fn the name of the calling function (in uppercase)
|
||||||
|
* @param $errno the native error number from the database
|
||||||
|
* @param $errmsg the native error msg from the database
|
||||||
|
* @param $p1 $fn specific parameter - see below
|
||||||
|
* @param $p2 $fn specific parameter - see below
|
||||||
|
* @param $thisConn $current connection object - can be false if no connection object created
|
||||||
|
*/
|
||||||
|
function ADODB_Error_Handler($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
|
||||||
|
{
|
||||||
|
if (error_reporting() == 0) return; // obey @ protocol
|
||||||
|
switch($fn) {
|
||||||
|
case 'EXECUTE':
|
||||||
|
$sql = $p1;
|
||||||
|
$inputparams = $p2;
|
||||||
|
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")\n";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'PCONNECT':
|
||||||
|
case 'CONNECT':
|
||||||
|
$host = $p1;
|
||||||
|
$database = $p2;
|
||||||
|
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn($host, '****', '****', $database)\n";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Log connection error somewhere
|
||||||
|
* 0 message is sent to PHP's system logger, using the Operating System's system
|
||||||
|
* logging mechanism or a file, depending on what the error_log configuration
|
||||||
|
* directive is set to.
|
||||||
|
* 1 message is sent by email to the address in the destination parameter.
|
||||||
|
* This is the only message type where the fourth parameter, extra_headers is used.
|
||||||
|
* This message type uses the same internal function as mail() does.
|
||||||
|
* 2 message is sent through the PHP debugging connection.
|
||||||
|
* This option is only available if remote debugging has been enabled.
|
||||||
|
* In this case, the destination parameter specifies the host name or IP address
|
||||||
|
* and optionally, port number, of the socket receiving the debug information.
|
||||||
|
* 3 message is appended to the file destination
|
||||||
|
*/
|
||||||
|
if (defined('ADODB_ERROR_LOG_TYPE')) {
|
||||||
|
$t = date('Y-m-d H:i:s');
|
||||||
|
if (defined('ADODB_ERROR_LOG_DEST'))
|
||||||
|
error_log("($t) $s", ADODB_ERROR_LOG_TYPE, ADODB_ERROR_LOG_DEST);
|
||||||
|
else
|
||||||
|
error_log("($t) $s", ADODB_ERROR_LOG_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//print "<p>$s</p>";
|
||||||
|
trigger_error($s,ADODB_ERROR_HANDLER_TYPE);
|
||||||
|
}
|
||||||
|
?>
|
88
includes/adodb/adodb-errorpear.inc.php
Normal file
88
includes/adodb/adodb-errorpear.inc.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
include_once('PEAR.php');
|
||||||
|
|
||||||
|
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_PEAR');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enabled the following if you want to terminate scripts when an error occurs
|
||||||
|
*/
|
||||||
|
//PEAR::setErrorHandling (PEAR_ERROR_DIE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Name of the PEAR_Error derived class to call.
|
||||||
|
*/
|
||||||
|
if (!defined('ADODB_PEAR_ERROR_CLASS')) define('ADODB_PEAR_ERROR_CLASS','PEAR_Error');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store the last PEAR_Error object here
|
||||||
|
*/
|
||||||
|
global $ADODB_Last_PEAR_Error; $ADODB_Last_PEAR_Error = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error Handler with PEAR support. This will be called with the following params
|
||||||
|
*
|
||||||
|
* @param $dbms the RDBMS you are connecting to
|
||||||
|
* @param $fn the name of the calling function (in uppercase)
|
||||||
|
* @param $errno the native error number from the database
|
||||||
|
* @param $errmsg the native error msg from the database
|
||||||
|
* @param $p1 $fn specific parameter - see below
|
||||||
|
* @param $P2 $fn specific parameter - see below
|
||||||
|
*/
|
||||||
|
function ADODB_Error_PEAR($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false)
|
||||||
|
{
|
||||||
|
global $ADODB_Last_PEAR_Error;
|
||||||
|
|
||||||
|
if (error_reporting() == 0) return; // obey @ protocol
|
||||||
|
switch($fn) {
|
||||||
|
case 'EXECUTE':
|
||||||
|
$sql = $p1;
|
||||||
|
$inputparams = $p2;
|
||||||
|
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'PCONNECT':
|
||||||
|
case 'CONNECT':
|
||||||
|
$host = $p1;
|
||||||
|
$database = $p2;
|
||||||
|
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn('$host', ?, ?, '$database')";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$class = ADODB_PEAR_ERROR_CLASS;
|
||||||
|
$ADODB_Last_PEAR_Error = new $class($s, $errno,
|
||||||
|
$GLOBALS['_PEAR_default_error_mode'],
|
||||||
|
$GLOBALS['_PEAR_default_error_options'],
|
||||||
|
$errmsg);
|
||||||
|
|
||||||
|
//print "<p>!$s</p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns last PEAR_Error object. This error might be for an error that
|
||||||
|
* occured several sql statements ago.
|
||||||
|
*/
|
||||||
|
function ADODB_PEAR_Error()
|
||||||
|
{
|
||||||
|
global $ADODB_Last_PEAR_Error;
|
||||||
|
|
||||||
|
return $ADODB_Last_PEAR_Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
82
includes/adodb/adodb-exceptions.inc.php
Normal file
82
includes/adodb/adodb-exceptions.inc.php
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
* Exception-handling code using PHP5 exceptions (try-catch-throw).
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
|
||||||
|
define('ADODB_ERROR_HANDLER','adodb_throw');
|
||||||
|
|
||||||
|
class ADODB_Exception extends Exception {
|
||||||
|
var $dbms;
|
||||||
|
var $fn;
|
||||||
|
var $sql = '';
|
||||||
|
var $params = '';
|
||||||
|
var $host = '';
|
||||||
|
var $database = '';
|
||||||
|
|
||||||
|
function __construct($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
|
||||||
|
{
|
||||||
|
switch($fn) {
|
||||||
|
case 'EXECUTE':
|
||||||
|
$this->sql = $p1;
|
||||||
|
$this->params = $p2;
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'PCONNECT':
|
||||||
|
case 'CONNECT':
|
||||||
|
$user = $thisConnection->user;
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->dbms = $dbms;
|
||||||
|
if ($thisConnection) {
|
||||||
|
$this->host = $thisConnection->host;
|
||||||
|
$this->database = $thisConnection->database;
|
||||||
|
}
|
||||||
|
$this->fn = $fn;
|
||||||
|
$this->msg = $errmsg;
|
||||||
|
|
||||||
|
if (!is_numeric($errno)) $errno = -1;
|
||||||
|
parent::__construct($s,$errno);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default Error Handler. This will be called with the following params
|
||||||
|
*
|
||||||
|
* @param $dbms the RDBMS you are connecting to
|
||||||
|
* @param $fn the name of the calling function (in uppercase)
|
||||||
|
* @param $errno the native error number from the database
|
||||||
|
* @param $errmsg the native error msg from the database
|
||||||
|
* @param $p1 $fn specific parameter - see below
|
||||||
|
* @param $P2 $fn specific parameter - see below
|
||||||
|
*/
|
||||||
|
|
||||||
|
function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
|
||||||
|
{
|
||||||
|
global $ADODB_EXCEPTION;
|
||||||
|
|
||||||
|
if (error_reporting() == 0) return; // obey @ protocol
|
||||||
|
if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION;
|
||||||
|
else $errfn = 'ADODB_EXCEPTION';
|
||||||
|
throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
30
includes/adodb/adodb-iterator.inc.php
Normal file
30
includes/adodb/adodb-iterator.inc.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with
|
||||||
|
the ADODB_Iterator class.
|
||||||
|
|
||||||
|
$rs = $db->Execute("select * from adoxyz");
|
||||||
|
foreach($rs as $k => $v) {
|
||||||
|
echo $k; print_r($v); echo "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2
|
||||||
|
|
||||||
|
|
||||||
|
Moved to adodb.inc.php to improve performance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
1180
includes/adodb/adodb-lib.inc.php
Normal file
1180
includes/adodb/adodb-lib.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
290
includes/adodb/adodb-pager.inc.php
Normal file
290
includes/adodb/adodb-pager.inc.php
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
This class provides recordset pagination with
|
||||||
|
First/Prev/Next/Last links.
|
||||||
|
|
||||||
|
Feel free to modify this class for your own use as
|
||||||
|
it is very basic. To learn how to use it, see the
|
||||||
|
example in adodb/tests/testpaging.php.
|
||||||
|
|
||||||
|
"Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks().
|
||||||
|
|
||||||
|
Please note, this class is entirely unsupported,
|
||||||
|
and no free support requests except for bug reports
|
||||||
|
will be entertained by the author.
|
||||||
|
|
||||||
|
*/
|
||||||
|
class ADODB_Pager {
|
||||||
|
var $id; // unique id for pager (defaults to 'adodb')
|
||||||
|
var $db; // ADODB connection object
|
||||||
|
var $sql; // sql used
|
||||||
|
var $rs; // recordset generated
|
||||||
|
var $curr_page; // current page number before Render() called, calculated in constructor
|
||||||
|
var $rows; // number of rows per page
|
||||||
|
var $linksPerPage=10; // number of links per page in navigation bar
|
||||||
|
var $showPageLinks;
|
||||||
|
|
||||||
|
var $gridAttributes = 'width=100% border=1 bgcolor=white';
|
||||||
|
|
||||||
|
// Localize text strings here
|
||||||
|
var $first = '<code>|<</code>';
|
||||||
|
var $prev = '<code><<</code>';
|
||||||
|
var $next = '<code>>></code>';
|
||||||
|
var $last = '<code>>|</code>';
|
||||||
|
var $moreLinks = '...';
|
||||||
|
var $startLinks = '...';
|
||||||
|
var $gridHeader = false;
|
||||||
|
var $htmlSpecialChars = true;
|
||||||
|
var $page = 'Page';
|
||||||
|
var $linkSelectedColor = 'red';
|
||||||
|
var $cache = 0; #secs to cache with CachePageExecute()
|
||||||
|
|
||||||
|
//----------------------------------------------
|
||||||
|
// constructor
|
||||||
|
//
|
||||||
|
// $db adodb connection object
|
||||||
|
// $sql sql statement
|
||||||
|
// $id optional id to identify which pager,
|
||||||
|
// if you have multiple on 1 page.
|
||||||
|
// $id should be only be [a-z0-9]*
|
||||||
|
//
|
||||||
|
function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
|
||||||
|
$curr_page = $id.'_curr_page';
|
||||||
|
if (empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks
|
||||||
|
|
||||||
|
$this->sql = $sql;
|
||||||
|
$this->id = $id;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->showPageLinks = $showPageLinks;
|
||||||
|
|
||||||
|
$next_page = $id.'_next_page';
|
||||||
|
|
||||||
|
if (isset($_GET[$next_page])) {
|
||||||
|
$_SESSION[$curr_page] = (integer) $_GET[$next_page];
|
||||||
|
}
|
||||||
|
if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page
|
||||||
|
|
||||||
|
$this->curr_page = $_SESSION[$curr_page];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------
|
||||||
|
// Display link to first page
|
||||||
|
function Render_First($anchor=true)
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
if ($anchor) {
|
||||||
|
?>
|
||||||
|
<a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
print "$this->first ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------
|
||||||
|
// Display link to next page
|
||||||
|
function render_next($anchor=true)
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
|
||||||
|
if ($anchor) {
|
||||||
|
?>
|
||||||
|
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
print "$this->next ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------
|
||||||
|
// Link to last page
|
||||||
|
//
|
||||||
|
// for better performance with large recordsets, you can set
|
||||||
|
// $this->db->pageExecuteCountRows = false, which disables
|
||||||
|
// last page counting.
|
||||||
|
function render_last($anchor=true)
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
|
||||||
|
if (!$this->db->pageExecuteCountRows) return;
|
||||||
|
|
||||||
|
if ($anchor) {
|
||||||
|
?>
|
||||||
|
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
print "$this->last ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------
|
||||||
|
// original code by "Pablo Costa" <pablo@cbsp.com.br>
|
||||||
|
function render_pagelinks()
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
$pages = $this->rs->LastPageNo();
|
||||||
|
$linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages;
|
||||||
|
for($i=1; $i <= $pages; $i+=$linksperpage)
|
||||||
|
{
|
||||||
|
if($this->rs->AbsolutePage() >= $i)
|
||||||
|
{
|
||||||
|
$start = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$numbers = '';
|
||||||
|
$end = $start+$linksperpage-1;
|
||||||
|
$link = $this->id . "_next_page";
|
||||||
|
if($end > $pages) $end = $pages;
|
||||||
|
|
||||||
|
|
||||||
|
if ($this->startLinks && $start > 1) {
|
||||||
|
$pos = $start - 1;
|
||||||
|
$numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> ";
|
||||||
|
}
|
||||||
|
|
||||||
|
for($i=$start; $i <= $end; $i++) {
|
||||||
|
if ($this->rs->AbsolutePage() == $i)
|
||||||
|
$numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> ";
|
||||||
|
else
|
||||||
|
$numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> ";
|
||||||
|
|
||||||
|
}
|
||||||
|
if ($this->moreLinks && $end < $pages)
|
||||||
|
$numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> ";
|
||||||
|
print $numbers . ' ';
|
||||||
|
}
|
||||||
|
// Link to previous page
|
||||||
|
function render_prev($anchor=true)
|
||||||
|
{
|
||||||
|
global $PHP_SELF;
|
||||||
|
if ($anchor) {
|
||||||
|
?>
|
||||||
|
<a href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
print "$this->prev ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------
|
||||||
|
// Simply rendering of grid. You should override this for
|
||||||
|
// better control over the format of the grid
|
||||||
|
//
|
||||||
|
// We use output buffering to keep code clean and readable.
|
||||||
|
function RenderGrid()
|
||||||
|
{
|
||||||
|
global $gSQLBlockRows; // used by rs2html to indicate how many rows to display
|
||||||
|
include_once(ADODB_DIR.'/tohtml.inc.php');
|
||||||
|
ob_start();
|
||||||
|
$gSQLBlockRows = $this->rows;
|
||||||
|
rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars);
|
||||||
|
$s = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------
|
||||||
|
// Navigation bar
|
||||||
|
//
|
||||||
|
// we use output buffering to keep the code easy to read.
|
||||||
|
function RenderNav()
|
||||||
|
{
|
||||||
|
ob_start();
|
||||||
|
if (!$this->rs->AtFirstPage()) {
|
||||||
|
$this->Render_First();
|
||||||
|
$this->Render_Prev();
|
||||||
|
} else {
|
||||||
|
$this->Render_First(false);
|
||||||
|
$this->Render_Prev(false);
|
||||||
|
}
|
||||||
|
if ($this->showPageLinks){
|
||||||
|
$this->Render_PageLinks();
|
||||||
|
}
|
||||||
|
if (!$this->rs->AtLastPage()) {
|
||||||
|
$this->Render_Next();
|
||||||
|
$this->Render_Last();
|
||||||
|
} else {
|
||||||
|
$this->Render_Next(false);
|
||||||
|
$this->Render_Last(false);
|
||||||
|
}
|
||||||
|
$s = ob_get_contents();
|
||||||
|
ob_end_clean();
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------
|
||||||
|
// This is the footer
|
||||||
|
function RenderPageCount()
|
||||||
|
{
|
||||||
|
if (!$this->db->pageExecuteCountRows) return '';
|
||||||
|
$lastPage = $this->rs->LastPageNo();
|
||||||
|
if ($lastPage == -1) $lastPage = 1; // check for empty rs.
|
||||||
|
if ($this->curr_page > $lastPage) $this->curr_page = 1;
|
||||||
|
return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------
|
||||||
|
// Call this class to draw everything.
|
||||||
|
function Render($rows=10)
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
|
||||||
|
$this->rows = $rows;
|
||||||
|
|
||||||
|
if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL;
|
||||||
|
|
||||||
|
$savec = $ADODB_COUNTRECS;
|
||||||
|
if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true;
|
||||||
|
if ($this->cache)
|
||||||
|
$rs = $this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page);
|
||||||
|
else
|
||||||
|
$rs = $this->db->PageExecute($this->sql,$rows,$this->curr_page);
|
||||||
|
$ADODB_COUNTRECS = $savec;
|
||||||
|
|
||||||
|
$this->rs = $rs;
|
||||||
|
if (!$rs) {
|
||||||
|
print "<h3>Query failed: $this->sql</h3>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
|
||||||
|
$header = $this->RenderNav();
|
||||||
|
else
|
||||||
|
$header = " ";
|
||||||
|
|
||||||
|
$grid = $this->RenderGrid();
|
||||||
|
$footer = $this->RenderPageCount();
|
||||||
|
|
||||||
|
$this->RenderLayout($header,$grid,$footer);
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
$this->rs = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------
|
||||||
|
// override this to control overall layout and formating
|
||||||
|
function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
|
||||||
|
{
|
||||||
|
echo "<table ".$attributes."><tr><td>",
|
||||||
|
$header,
|
||||||
|
"</td></tr><tr><td>",
|
||||||
|
$grid,
|
||||||
|
"</td></tr><tr><td>",
|
||||||
|
$footer,
|
||||||
|
"</td></tr></table>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
374
includes/adodb/adodb-pear.inc.php
Normal file
374
includes/adodb/adodb-pear.inc.php
Normal file
@ -0,0 +1,374 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* PEAR DB Emulation Layer for ADODB.
|
||||||
|
*
|
||||||
|
* The following code is modelled on PEAR DB code by Stig Bakken <ssb@fast.no> |
|
||||||
|
* and Tomas V.V.Cox <cox@idecnet.com>. Portions (c)1997-2002 The PHP Group.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
We support:
|
||||||
|
|
||||||
|
DB_Common
|
||||||
|
---------
|
||||||
|
query - returns PEAR_Error on error
|
||||||
|
limitQuery - return PEAR_Error on error
|
||||||
|
prepare - does not return PEAR_Error on error
|
||||||
|
execute - does not return PEAR_Error on error
|
||||||
|
setFetchMode - supports ASSOC and ORDERED
|
||||||
|
errorNative
|
||||||
|
quote
|
||||||
|
nextID
|
||||||
|
disconnect
|
||||||
|
|
||||||
|
getOne
|
||||||
|
getAssoc
|
||||||
|
getRow
|
||||||
|
getCol
|
||||||
|
getAll
|
||||||
|
|
||||||
|
DB_Result
|
||||||
|
---------
|
||||||
|
numRows - returns -1 if not supported
|
||||||
|
numCols
|
||||||
|
fetchInto - does not support passing of fetchmode
|
||||||
|
fetchRows - does not support passing of fetchmode
|
||||||
|
free
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('ADODB_PEAR',dirname(__FILE__));
|
||||||
|
include_once "PEAR.php";
|
||||||
|
include_once ADODB_PEAR."/adodb-errorpear.inc.php";
|
||||||
|
include_once ADODB_PEAR."/adodb.inc.php";
|
||||||
|
|
||||||
|
if (!defined('DB_OK')) {
|
||||||
|
define("DB_OK", 1);
|
||||||
|
define("DB_ERROR",-1);
|
||||||
|
|
||||||
|
// autoExecute constants
|
||||||
|
define('DB_AUTOQUERY_INSERT', 1);
|
||||||
|
define('DB_AUTOQUERY_UPDATE', 2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a special constant that tells DB the user hasn't specified
|
||||||
|
* any particular get mode, so the default should be used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('DB_FETCHMODE_DEFAULT', 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Column data indexed by numbers, ordered from 0 and up
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('DB_FETCHMODE_ORDERED', 1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Column data indexed by column names
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('DB_FETCHMODE_ASSOC', 2);
|
||||||
|
|
||||||
|
/* for compatibility */
|
||||||
|
|
||||||
|
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
|
||||||
|
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* these are constants for the tableInfo-function
|
||||||
|
* they are bitwised or'ed. so if there are more constants to be defined
|
||||||
|
* in the future, adjust DB_TABLEINFO_FULL accordingly
|
||||||
|
*/
|
||||||
|
|
||||||
|
define('DB_TABLEINFO_ORDER', 1);
|
||||||
|
define('DB_TABLEINFO_ORDERTABLE', 2);
|
||||||
|
define('DB_TABLEINFO_FULL', 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main "DB" class is simply a container class with some static
|
||||||
|
* methods for creating DB objects as well as some utility functions
|
||||||
|
* common to all parts of DB.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DB
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new DB object for the specified database type
|
||||||
|
*
|
||||||
|
* @param $type string database type, for example "mysql"
|
||||||
|
*
|
||||||
|
* @return object a newly created DB object, or a DB error code on
|
||||||
|
* error
|
||||||
|
*/
|
||||||
|
|
||||||
|
function factory($type)
|
||||||
|
{
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-$type.inc.php");
|
||||||
|
$obj = NewADOConnection($type);
|
||||||
|
if (!is_object($obj)) $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new DB object and connect to the specified database
|
||||||
|
*
|
||||||
|
* @param $dsn mixed "data source name", see the DB::parseDSN
|
||||||
|
* method for a description of the dsn format. Can also be
|
||||||
|
* specified as an array of the format returned by DB::parseDSN.
|
||||||
|
*
|
||||||
|
* @param $options mixed if boolean (or scalar), tells whether
|
||||||
|
* this connection should be persistent (for backends that support
|
||||||
|
* this). This parameter can also be an array of options, see
|
||||||
|
* DB_common::setOption for more information on connection
|
||||||
|
* options.
|
||||||
|
*
|
||||||
|
* @return object a newly created DB connection object, or a DB
|
||||||
|
* error object on error
|
||||||
|
*
|
||||||
|
* @see DB::parseDSN
|
||||||
|
* @see DB::isError
|
||||||
|
*/
|
||||||
|
function connect($dsn, $options = false)
|
||||||
|
{
|
||||||
|
if (is_array($dsn)) {
|
||||||
|
$dsninfo = $dsn;
|
||||||
|
} else {
|
||||||
|
$dsninfo = DB::parseDSN($dsn);
|
||||||
|
}
|
||||||
|
switch ($dsninfo["phptype"]) {
|
||||||
|
case 'pgsql': $type = 'postgres7'; break;
|
||||||
|
case 'ifx': $type = 'informix9'; break;
|
||||||
|
default: $type = $dsninfo["phptype"]; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($options) && isset($options["debug"]) &&
|
||||||
|
$options["debug"] >= 2) {
|
||||||
|
// expose php errors with sufficient debug level
|
||||||
|
@include_once("adodb-$type.inc.php");
|
||||||
|
} else {
|
||||||
|
@include_once("adodb-$type.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
@$obj = NewADOConnection($type);
|
||||||
|
if (!is_object($obj)) {
|
||||||
|
$obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
if (is_array($options)) {
|
||||||
|
foreach($options as $k => $v) {
|
||||||
|
switch(strtolower($k)) {
|
||||||
|
case 'persist':
|
||||||
|
case 'persistent': $persist = $v; break;
|
||||||
|
#ibase
|
||||||
|
case 'dialect': $obj->dialect = $v; break;
|
||||||
|
case 'charset': $obj->charset = $v; break;
|
||||||
|
case 'buffers': $obj->buffers = $v; break;
|
||||||
|
#ado
|
||||||
|
case 'charpage': $obj->charPage = $v; break;
|
||||||
|
#mysql
|
||||||
|
case 'clientflags': $obj->clientFlags = $v; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$persist = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket'];
|
||||||
|
else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port'];
|
||||||
|
|
||||||
|
if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
|
||||||
|
else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
|
||||||
|
|
||||||
|
if (!$ok) $obj = ADODB_PEAR_Error();
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the DB API version
|
||||||
|
*
|
||||||
|
* @return int the DB API version number
|
||||||
|
*/
|
||||||
|
function apiVersion()
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether a result code from a DB method is an error
|
||||||
|
*
|
||||||
|
* @param $value int result code
|
||||||
|
*
|
||||||
|
* @return bool whether $value is an error
|
||||||
|
*/
|
||||||
|
function isError($value)
|
||||||
|
{
|
||||||
|
if (!is_object($value)) return false;
|
||||||
|
$class = strtolower(get_class($value));
|
||||||
|
return $class == 'pear_error' || is_subclass_of($value, 'pear_error') ||
|
||||||
|
$class == 'db_error' || is_subclass_of($value, 'db_error');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether a result code from a DB method is a warning.
|
||||||
|
* Warnings differ from errors in that they are generated by DB,
|
||||||
|
* and are not fatal.
|
||||||
|
*
|
||||||
|
* @param $value mixed result value
|
||||||
|
*
|
||||||
|
* @return bool whether $value is a warning
|
||||||
|
*/
|
||||||
|
function isWarning($value)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
/*
|
||||||
|
return is_object($value) &&
|
||||||
|
(get_class( $value ) == "db_warning" ||
|
||||||
|
is_subclass_of($value, "db_warning"));*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a data source name
|
||||||
|
*
|
||||||
|
* @param $dsn string Data Source Name to be parsed
|
||||||
|
*
|
||||||
|
* @return array an associative array with the following keys:
|
||||||
|
*
|
||||||
|
* phptype: Database backend used in PHP (mysql, odbc etc.)
|
||||||
|
* dbsyntax: Database used with regards to SQL syntax etc.
|
||||||
|
* protocol: Communication protocol to use (tcp, unix etc.)
|
||||||
|
* hostspec: Host specification (hostname[:port])
|
||||||
|
* database: Database to use on the DBMS server
|
||||||
|
* username: User name for login
|
||||||
|
* password: Password for login
|
||||||
|
*
|
||||||
|
* The format of the supplied DSN is in its fullest form:
|
||||||
|
*
|
||||||
|
* phptype(dbsyntax)://username:password@protocol+hostspec/database
|
||||||
|
*
|
||||||
|
* Most variations are allowed:
|
||||||
|
*
|
||||||
|
* phptype://username:password@protocol+hostspec:110//usr/db_file.db
|
||||||
|
* phptype://username:password@hostspec/database_name
|
||||||
|
* phptype://username:password@hostspec
|
||||||
|
* phptype://username@hostspec
|
||||||
|
* phptype://hostspec/database
|
||||||
|
* phptype://hostspec
|
||||||
|
* phptype(dbsyntax)
|
||||||
|
* phptype
|
||||||
|
*
|
||||||
|
* @author Tomas V.V.Cox <cox@idecnet.com>
|
||||||
|
*/
|
||||||
|
function parseDSN($dsn)
|
||||||
|
{
|
||||||
|
if (is_array($dsn)) {
|
||||||
|
return $dsn;
|
||||||
|
}
|
||||||
|
|
||||||
|
$parsed = array(
|
||||||
|
'phptype' => false,
|
||||||
|
'dbsyntax' => false,
|
||||||
|
'protocol' => false,
|
||||||
|
'hostspec' => false,
|
||||||
|
'database' => false,
|
||||||
|
'username' => false,
|
||||||
|
'password' => false
|
||||||
|
);
|
||||||
|
|
||||||
|
// Find phptype and dbsyntax
|
||||||
|
if (($pos = strpos($dsn, '://')) !== false) {
|
||||||
|
$str = substr($dsn, 0, $pos);
|
||||||
|
$dsn = substr($dsn, $pos + 3);
|
||||||
|
} else {
|
||||||
|
$str = $dsn;
|
||||||
|
$dsn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get phptype and dbsyntax
|
||||||
|
// $str => phptype(dbsyntax)
|
||||||
|
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
|
||||||
|
$parsed['phptype'] = $arr[1];
|
||||||
|
$parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2];
|
||||||
|
} else {
|
||||||
|
$parsed['phptype'] = $str;
|
||||||
|
$parsed['dbsyntax'] = $str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($dsn)) {
|
||||||
|
return $parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get (if found): username and password
|
||||||
|
// $dsn => username:password@protocol+hostspec/database
|
||||||
|
if (($at = strpos($dsn,'@')) !== false) {
|
||||||
|
$str = substr($dsn, 0, $at);
|
||||||
|
$dsn = substr($dsn, $at + 1);
|
||||||
|
if (($pos = strpos($str, ':')) !== false) {
|
||||||
|
$parsed['username'] = urldecode(substr($str, 0, $pos));
|
||||||
|
$parsed['password'] = urldecode(substr($str, $pos + 1));
|
||||||
|
} else {
|
||||||
|
$parsed['username'] = urldecode($str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find protocol and hostspec
|
||||||
|
// $dsn => protocol+hostspec/database
|
||||||
|
if (($pos=strpos($dsn, '/')) !== false) {
|
||||||
|
$str = substr($dsn, 0, $pos);
|
||||||
|
$dsn = substr($dsn, $pos + 1);
|
||||||
|
} else {
|
||||||
|
$str = $dsn;
|
||||||
|
$dsn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get protocol + hostspec
|
||||||
|
// $str => protocol+hostspec
|
||||||
|
if (($pos=strpos($str, '+')) !== false) {
|
||||||
|
$parsed['protocol'] = substr($str, 0, $pos);
|
||||||
|
$parsed['hostspec'] = urldecode(substr($str, $pos + 1));
|
||||||
|
} else {
|
||||||
|
$parsed['hostspec'] = urldecode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get dabase if any
|
||||||
|
// $dsn => database
|
||||||
|
if (!empty($dsn)) {
|
||||||
|
$parsed['database'] = $dsn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a PHP database extension if it is not loaded already.
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*
|
||||||
|
* @param $name the base name of the extension (without the .so or
|
||||||
|
* .dll suffix)
|
||||||
|
*
|
||||||
|
* @return bool true if the extension was already or successfully
|
||||||
|
* loaded, false if it could not be loaded
|
||||||
|
*/
|
||||||
|
function assertExtension($name)
|
||||||
|
{
|
||||||
|
if (!extension_loaded($name)) {
|
||||||
|
$dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so';
|
||||||
|
@dl($name . $dlext);
|
||||||
|
}
|
||||||
|
if (!extension_loaded($name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
1089
includes/adodb/adodb-perf.inc.php
Normal file
1089
includes/adodb/adodb-perf.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
16
includes/adodb/adodb-php4.inc.php
Normal file
16
includes/adodb/adodb-php4.inc.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_BASE_RS {
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
1426
includes/adodb/adodb-time.inc.php
Normal file
1426
includes/adodb/adodb-time.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
2223
includes/adodb/adodb-xmlschema.inc.php
Normal file
2223
includes/adodb/adodb-xmlschema.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
2404
includes/adodb/adodb-xmlschema03.inc.php
Normal file
2404
includes/adodb/adodb-xmlschema03.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
4376
includes/adodb/adodb.inc.php
Normal file
4376
includes/adodb/adodb.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
95
includes/adodb/datadict/datadict-access.inc.php
Normal file
95
includes/adodb/datadict/datadict-access.inc.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_access extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'access';
|
||||||
|
var $seqField = false;
|
||||||
|
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'TEXT';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'MEMO';
|
||||||
|
|
||||||
|
case 'C2': return 'TEXT'; // up to 32K
|
||||||
|
case 'X2': return 'MEMO';
|
||||||
|
|
||||||
|
case 'B': return 'BINARY';
|
||||||
|
|
||||||
|
case 'D': return 'DATETIME';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
|
||||||
|
case 'L': return 'BYTE';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'BYTE';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'INTEGER';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
if ($fautoinc) {
|
||||||
|
$ftype = 'COUNTER';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (substr($ftype,0,7) == 'DECIMAL') $ftype = 'DECIMAL';
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) {
|
||||||
|
//$suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($this->debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)");
|
||||||
|
}
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateDatabase($dbname,$options=false)
|
||||||
|
{
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function SetSchema($schema)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
143
includes/adodb/datadict/datadict-db2.inc.php
Normal file
143
includes/adodb/datadict/datadict-db2.inc.php
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_db2 extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'db2';
|
||||||
|
var $seqField = false;
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL': return 'CLOB';
|
||||||
|
case 'X': return 'VARCHAR(3600)';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR'; // up to 32K
|
||||||
|
case 'X2': return 'VARCHAR(3600)'; // up to 32000, but default page size too small
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if ($fautoinc) return ' GENERATED ALWAYS AS IDENTITY'; # as identity start with
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ChangeTableSQL($tablename, $flds, $tableoptions = false)
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
Allow basic table changes to DB2 databases
|
||||||
|
DB2 will fatally reject changes to non character columns
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
$validTypes = array("CHAR","VARC");
|
||||||
|
$invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME");
|
||||||
|
// check table exists
|
||||||
|
$cols = $this->MetaColumns($tablename);
|
||||||
|
if ( empty($cols)) {
|
||||||
|
return $this->CreateTableSQL($tablename, $flds, $tableoptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
// already exists, alter table instead
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$alter = 'ALTER TABLE ' . $this->TableName($tablename);
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
foreach ( $lines as $id => $v ) {
|
||||||
|
if ( isset($cols[$id]) && is_object($cols[$id]) ) {
|
||||||
|
/**
|
||||||
|
If the first field of $v is the fieldname, and
|
||||||
|
the second is the field type/size, we assume its an
|
||||||
|
attempt to modify the column size, so check that it is allowed
|
||||||
|
$v can have an indeterminate number of blanks between the
|
||||||
|
fields, so account for that too
|
||||||
|
*/
|
||||||
|
$vargs = explode(' ' , $v);
|
||||||
|
// assume that $vargs[0] is the field name.
|
||||||
|
$i=0;
|
||||||
|
// Find the next non-blank value;
|
||||||
|
for ($i=1;$i<sizeof($vargs);$i++)
|
||||||
|
if ($vargs[$i] != '')
|
||||||
|
break;
|
||||||
|
|
||||||
|
// if $vargs[$i] is one of the following, we are trying to change the
|
||||||
|
// size of the field, if not allowed, simply ignore the request.
|
||||||
|
if (in_array(substr($vargs[$i],0,4),$invalidTypes))
|
||||||
|
continue;
|
||||||
|
// insert the appropriate DB2 syntax
|
||||||
|
if (in_array(substr($vargs[$i],0,4),$validTypes)) {
|
||||||
|
array_splice($vargs,$i,0,array('SET','DATA','TYPE'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now Look for the NOT NULL statement as this is not allowed in
|
||||||
|
// the ALTER table statement. If it is in there, remove it
|
||||||
|
if (in_array('NOT',$vargs) && in_array('NULL',$vargs)) {
|
||||||
|
for ($i=1;$i<sizeof($vargs);$i++)
|
||||||
|
if ($vargs[$i] == 'NOT')
|
||||||
|
break;
|
||||||
|
array_splice($vargs,$i,2,'');
|
||||||
|
}
|
||||||
|
$v = implode(' ',$vargs);
|
||||||
|
$sql[] = $alter . $this->alterCol . ' ' . $v;
|
||||||
|
} else {
|
||||||
|
$sql[] = $alter . $this->addCol . ' ' . $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
151
includes/adodb/datadict/datadict-firebird.inc.php
Normal file
151
includes/adodb/datadict/datadict-firebird.inc.php
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB2_firebird extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'firebird';
|
||||||
|
var $seqField = false;
|
||||||
|
var $seqPrefix = 'gen_';
|
||||||
|
var $blobSize = 40000;
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL': return 'VARCHAR(32000)';
|
||||||
|
case 'X': return 'VARCHAR(4000)';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR'; // up to 32K
|
||||||
|
case 'X2': return 'VARCHAR(4000)';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'INTEGER';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE PRECISION';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function NameQuote($name = NULL)
|
||||||
|
{
|
||||||
|
if (!is_string($name)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = trim($name);
|
||||||
|
|
||||||
|
if ( !is_object($this->connection) ) {
|
||||||
|
return $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
$quote = $this->connection->nameQuote;
|
||||||
|
|
||||||
|
// if name is of the form `name`, quote it
|
||||||
|
if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
|
||||||
|
return $quote . $matches[1] . $quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if name contains special characters, quote it
|
||||||
|
if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) {
|
||||||
|
return $quote . $name . $quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $quote . $name . $quote;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateDatabase($dbname, $options=false)
|
||||||
|
{
|
||||||
|
$options = $this->_Options($options);
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
$sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _DropAutoIncrement($t)
|
||||||
|
{
|
||||||
|
if (strpos($t,'.') !== false) {
|
||||||
|
$tarr = explode('.',$t);
|
||||||
|
return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"';
|
||||||
|
}
|
||||||
|
return 'DROP GENERATOR "GEN_'.$t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fautoinc) $this->seqField = $fname;
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE or replace TRIGGER jaddress_insert
|
||||||
|
before insert on jaddress
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN
|
||||||
|
NEW."seqField" = GEN_ID("GEN_tabname", 1);
|
||||||
|
end;
|
||||||
|
*/
|
||||||
|
function _Triggers($tabname,$tableoptions)
|
||||||
|
{
|
||||||
|
if (!$this->seqField) return array();
|
||||||
|
|
||||||
|
$tab1 = preg_replace( '/"/', '', $tabname );
|
||||||
|
if ($this->schema) {
|
||||||
|
$t = strpos($tab1,'.');
|
||||||
|
if ($t !== false) $tab = substr($tab1,$t+1);
|
||||||
|
else $tab = $tab1;
|
||||||
|
$seqField = $this->seqField;
|
||||||
|
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
|
||||||
|
$trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab;
|
||||||
|
} else {
|
||||||
|
$seqField = $this->seqField;
|
||||||
|
$seqname = $this->seqPrefix.$tab1;
|
||||||
|
$trigname = 'trig_'.$seqname;
|
||||||
|
}
|
||||||
|
if (isset($tableoptions['REPLACE']))
|
||||||
|
{ $sql[] = "DROP GENERATOR \"$seqname\"";
|
||||||
|
$sql[] = "CREATE GENERATOR \"$seqname\"";
|
||||||
|
$sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ $sql[] = "CREATE GENERATOR \"$seqname\"";
|
||||||
|
$sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->seqField = false;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
125
includes/adodb/datadict/datadict-generic.inc.php
Normal file
125
includes/adodb/datadict/datadict-generic.inc.php
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_generic extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'generic';
|
||||||
|
var $seqField = false;
|
||||||
|
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'VARCHAR(250)';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR';
|
||||||
|
case 'X2': return 'VARCHAR(250)';
|
||||||
|
|
||||||
|
case 'B': return 'VARCHAR';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'DATE';
|
||||||
|
|
||||||
|
case 'L': return 'DECIMAL(1)';
|
||||||
|
case 'I': return 'DECIMAL(10)';
|
||||||
|
case 'I1': return 'DECIMAL(3)';
|
||||||
|
case 'I2': return 'DECIMAL(5)';
|
||||||
|
case 'I4': return 'DECIMAL(10)';
|
||||||
|
case 'I8': return 'DECIMAL(20)';
|
||||||
|
|
||||||
|
case 'F': return 'DECIMAL(32,8)';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
//db2
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'X': return 'VARCHAR';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR'; // up to 32K
|
||||||
|
case 'X2': return 'VARCHAR';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ifx
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';// 255
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'NVARCHAR';
|
||||||
|
case 'X2': return 'TEXT';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'DECIMAL(20)';
|
||||||
|
|
||||||
|
case 'F': return 'FLOAT';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
?>
|
67
includes/adodb/datadict/datadict-ibase.inc.php
Normal file
67
includes/adodb/datadict/datadict-ibase.inc.php
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_ibase extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'ibase';
|
||||||
|
var $seqField = false;
|
||||||
|
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'VARCHAR(4000)';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR'; // up to 32K
|
||||||
|
case 'X2': return 'VARCHAR(4000)';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'INTEGER';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE PRECISION';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
80
includes/adodb/datadict/datadict-informix.inc.php
Normal file
80
includes/adodb/datadict/datadict-informix.inc.php
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_informix extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'informix';
|
||||||
|
var $seqField = false;
|
||||||
|
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';// 255
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'NVARCHAR';
|
||||||
|
case 'X2': return 'TEXT';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'DATETIME YEAR TO SECOND';
|
||||||
|
|
||||||
|
case 'L': return 'SMALLINT';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'DECIMAL(20)';
|
||||||
|
|
||||||
|
case 'F': return 'FLOAT';
|
||||||
|
case 'N': return 'DECIMAL';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
if ($fautoinc) {
|
||||||
|
$ftype = 'SERIAL';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
282
includes/adodb/datadict/datadict-mssql.inc.php
Normal file
282
includes/adodb/datadict/datadict-mssql.inc.php
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
|
||||||
|
|
||||||
|
Note Delimiters are for identifiers only. Delimiters cannot be used for keywords,
|
||||||
|
whether or not they are marked as reserved in SQL Server.
|
||||||
|
|
||||||
|
Quoted identifiers are delimited by double quotation marks ("):
|
||||||
|
SELECT * FROM "Blanks in Table Name"
|
||||||
|
|
||||||
|
Bracketed identifiers are delimited by brackets ([ ]):
|
||||||
|
SELECT * FROM [Blanks In Table Name]
|
||||||
|
|
||||||
|
Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default,
|
||||||
|
the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON
|
||||||
|
when they connect.
|
||||||
|
|
||||||
|
In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER,
|
||||||
|
the quoted identifier option of sp_dboption, or the user options option of sp_configure.
|
||||||
|
|
||||||
|
When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER { ON | OFF }
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_mssql extends ADODB_DataDict {
|
||||||
|
var $databaseType = 'mssql';
|
||||||
|
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||||
|
var $renameTable = "EXEC sp_rename '%s','%s'";
|
||||||
|
var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
|
||||||
|
|
||||||
|
var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000)
|
||||||
|
var $typeXL = 'TEXT';
|
||||||
|
|
||||||
|
//var $alterCol = ' ALTER COLUMN ';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$len = -1; // mysql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'R':
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER': return 'I';
|
||||||
|
case 'BIT':
|
||||||
|
case 'TINYINT': return 'I1';
|
||||||
|
case 'SMALLINT': return 'I2';
|
||||||
|
case 'BIGINT': return 'I8';
|
||||||
|
case 'SMALLDATETIME': return 'T';
|
||||||
|
case 'REAL':
|
||||||
|
case 'FLOAT': return 'F';
|
||||||
|
default: return parent::MetaType($t,$len,$fieldobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch(strtoupper($meta)) {
|
||||||
|
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
|
||||||
|
case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
|
||||||
|
case 'C2': return 'NVARCHAR';
|
||||||
|
case 'X2': return 'NTEXT';
|
||||||
|
|
||||||
|
case 'B': return 'IMAGE';
|
||||||
|
|
||||||
|
case 'D': return 'DATETIME';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
case 'L': return 'BIT';
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
case 'I': return 'INT';
|
||||||
|
case 'I1': return 'TINYINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INT';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'REAL';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$f = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$s = "ALTER TABLE $tabname $this->addCol";
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$f[] = "\n $v";
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
if (!is_array($flds))
|
||||||
|
$flds = explode(',',$flds);
|
||||||
|
$f = array();
|
||||||
|
$s = 'ALTER TABLE ' . $tabname;
|
||||||
|
foreach($flds as $v) {
|
||||||
|
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
else if ($suffix == '') $suffix .= ' NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE TABLE
|
||||||
|
[ database_name.[ owner ] . | owner. ] table_name
|
||||||
|
( { < column_definition >
|
||||||
|
| column_name AS computed_column_expression
|
||||||
|
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||||
|
|
||||||
|
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||||
|
)
|
||||||
|
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||||
|
|
||||||
|
< column_definition > ::= { column_name data_type }
|
||||||
|
[ COLLATE < collation_name > ]
|
||||||
|
[ [ DEFAULT constant_expression ]
|
||||||
|
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||||
|
]
|
||||||
|
[ ROWGUIDCOL]
|
||||||
|
[ < column_constraint > ] [ ...n ]
|
||||||
|
|
||||||
|
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ NULL | NOT NULL ]
|
||||||
|
| [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ON {filegroup | DEFAULT} ] ]
|
||||||
|
]
|
||||||
|
| [ [ FOREIGN KEY ]
|
||||||
|
REFERENCES ref_table [ ( ref_column ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( logical_expression )
|
||||||
|
}
|
||||||
|
|
||||||
|
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
]
|
||||||
|
| FOREIGN KEY
|
||||||
|
[ ( column [ ,...n ] ) ]
|
||||||
|
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( search_conditions )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||||
|
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||||
|
[ WITH < index_option > [ ,...n] ]
|
||||||
|
[ ON filegroup ]
|
||||||
|
< index_option > :: =
|
||||||
|
{ PAD_INDEX |
|
||||||
|
FILLFACTOR = fillfactor |
|
||||||
|
IGNORE_DUP_KEY |
|
||||||
|
DROP_EXISTING |
|
||||||
|
STATISTICS_NORECOMPUTE |
|
||||||
|
SORT_IN_TEMPDB
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||||
|
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||||
|
{
|
||||||
|
switch ($ftype) {
|
||||||
|
case 'INT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'TINYINT':
|
||||||
|
case 'BIGINT':
|
||||||
|
return $ftype;
|
||||||
|
}
|
||||||
|
if ($ty == 'T') return $ftype;
|
||||||
|
return parent::_GetSize($ftype, $ty, $fsize, $fprec);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
282
includes/adodb/datadict/datadict-mssqlnative.inc.php
Normal file
282
includes/adodb/datadict/datadict-mssqlnative.inc.php
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
|
||||||
|
|
||||||
|
Note Delimiters are for identifiers only. Delimiters cannot be used for keywords,
|
||||||
|
whether or not they are marked as reserved in SQL Server.
|
||||||
|
|
||||||
|
Quoted identifiers are delimited by double quotation marks ("):
|
||||||
|
SELECT * FROM "Blanks in Table Name"
|
||||||
|
|
||||||
|
Bracketed identifiers are delimited by brackets ([ ]):
|
||||||
|
SELECT * FROM [Blanks In Table Name]
|
||||||
|
|
||||||
|
Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default,
|
||||||
|
the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON
|
||||||
|
when they connect.
|
||||||
|
|
||||||
|
In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER,
|
||||||
|
the quoted identifier option of sp_dboption, or the user options option of sp_configure.
|
||||||
|
|
||||||
|
When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
|
||||||
|
|
||||||
|
Syntax
|
||||||
|
|
||||||
|
SET QUOTED_IDENTIFIER { ON | OFF }
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_mssqlnative extends ADODB_DataDict {
|
||||||
|
var $databaseType = 'mssqlnative';
|
||||||
|
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||||
|
var $renameTable = "EXEC sp_rename '%s','%s'";
|
||||||
|
var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
|
||||||
|
|
||||||
|
var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000)
|
||||||
|
var $typeXL = 'TEXT';
|
||||||
|
|
||||||
|
//var $alterCol = ' ALTER COLUMN ';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$len = -1; // mysql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'R':
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER': return 'I';
|
||||||
|
case 'BIT':
|
||||||
|
case 'TINYINT': return 'I1';
|
||||||
|
case 'SMALLINT': return 'I2';
|
||||||
|
case 'BIGINT': return 'I8';
|
||||||
|
|
||||||
|
case 'REAL':
|
||||||
|
case 'FLOAT': return 'F';
|
||||||
|
default: return parent::MetaType($t,$len,$fieldobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch(strtoupper($meta)) {
|
||||||
|
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
|
||||||
|
case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
|
||||||
|
case 'C2': return 'NVARCHAR';
|
||||||
|
case 'X2': return 'NTEXT';
|
||||||
|
|
||||||
|
case 'B': return 'IMAGE';
|
||||||
|
|
||||||
|
case 'D': return 'DATETIME';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
case 'L': return 'BIT';
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
case 'I': return 'INT';
|
||||||
|
case 'I1': return 'TINYINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INT';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'REAL';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$f = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$s = "ALTER TABLE $tabname $this->addCol";
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$f[] = "\n $v";
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
if (!is_array($flds))
|
||||||
|
$flds = explode(',',$flds);
|
||||||
|
$f = array();
|
||||||
|
$s = 'ALTER TABLE ' . $tabname;
|
||||||
|
foreach($flds as $v) {
|
||||||
|
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
else if ($suffix == '') $suffix .= ' NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE TABLE
|
||||||
|
[ database_name.[ owner ] . | owner. ] table_name
|
||||||
|
( { < column_definition >
|
||||||
|
| column_name AS computed_column_expression
|
||||||
|
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||||
|
|
||||||
|
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||||
|
)
|
||||||
|
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||||
|
|
||||||
|
< column_definition > ::= { column_name data_type }
|
||||||
|
[ COLLATE < collation_name > ]
|
||||||
|
[ [ DEFAULT constant_expression ]
|
||||||
|
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||||
|
]
|
||||||
|
[ ROWGUIDCOL]
|
||||||
|
[ < column_constraint > ] [ ...n ]
|
||||||
|
|
||||||
|
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ NULL | NOT NULL ]
|
||||||
|
| [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ON {filegroup | DEFAULT} ] ]
|
||||||
|
]
|
||||||
|
| [ [ FOREIGN KEY ]
|
||||||
|
REFERENCES ref_table [ ( ref_column ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( logical_expression )
|
||||||
|
}
|
||||||
|
|
||||||
|
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
]
|
||||||
|
| FOREIGN KEY
|
||||||
|
[ ( column [ ,...n ] ) ]
|
||||||
|
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( search_conditions )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||||
|
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||||
|
[ WITH < index_option > [ ,...n] ]
|
||||||
|
[ ON filegroup ]
|
||||||
|
< index_option > :: =
|
||||||
|
{ PAD_INDEX |
|
||||||
|
FILLFACTOR = fillfactor |
|
||||||
|
IGNORE_DUP_KEY |
|
||||||
|
DROP_EXISTING |
|
||||||
|
STATISTICS_NORECOMPUTE |
|
||||||
|
SORT_IN_TEMPDB
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||||
|
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||||
|
{
|
||||||
|
switch ($ftype) {
|
||||||
|
case 'INT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'TINYINT':
|
||||||
|
case 'BIGINT':
|
||||||
|
return $ftype;
|
||||||
|
}
|
||||||
|
if ($ty == 'T') return $ftype;
|
||||||
|
return parent::_GetSize($ftype, $ty, $fsize, $fprec);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
181
includes/adodb/datadict/datadict-mysql.inc.php
Normal file
181
includes/adodb/datadict/datadict-mysql.inc.php
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_mysql extends ADODB_DataDict {
|
||||||
|
var $databaseType = 'mysql';
|
||||||
|
var $alterCol = ' MODIFY COLUMN';
|
||||||
|
var $alterTableAddIndex = true;
|
||||||
|
var $dropTable = 'DROP TABLE IF EXISTS %s'; // requires mysql 3.22 or later
|
||||||
|
|
||||||
|
var $dropIndex = 'DROP INDEX %s ON %s';
|
||||||
|
var $renameColumn = 'ALTER TABLE %s CHANGE COLUMN %s %s %s'; // needs column-definition!
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment;
|
||||||
|
|
||||||
|
$len = -1; // mysql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'STRING':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'TINYBLOB':
|
||||||
|
case 'TINYTEXT':
|
||||||
|
case 'ENUM':
|
||||||
|
case 'SET':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
case 'LONGTEXT':
|
||||||
|
case 'MEDIUMTEXT':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
// php_mysql extension always returns 'blob' even if 'text'
|
||||||
|
// so we have to check whether binary...
|
||||||
|
case 'IMAGE':
|
||||||
|
case 'LONGBLOB':
|
||||||
|
case 'BLOB':
|
||||||
|
case 'MEDIUMBLOB':
|
||||||
|
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||||
|
|
||||||
|
case 'YEAR':
|
||||||
|
case 'DATE': return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'DATETIME':
|
||||||
|
case 'TIMESTAMP': return 'T';
|
||||||
|
|
||||||
|
case 'FLOAT':
|
||||||
|
case 'DOUBLE':
|
||||||
|
return 'F';
|
||||||
|
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER': return $is_serial ? 'R' : 'I';
|
||||||
|
case 'TINYINT': return $is_serial ? 'R' : 'I1';
|
||||||
|
case 'SMALLINT': return $is_serial ? 'R' : 'I2';
|
||||||
|
case 'MEDIUMINT': return $is_serial ? 'R' : 'I4';
|
||||||
|
case 'BIGINT': return $is_serial ? 'R' : 'I8';
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch(strtoupper($meta)) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':return 'LONGTEXT';
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR';
|
||||||
|
case 'X2': return 'LONGTEXT';
|
||||||
|
|
||||||
|
case 'B': return 'LONGBLOB';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
case 'L': return 'TINYINT';
|
||||||
|
|
||||||
|
case 'R':
|
||||||
|
case 'I4':
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'TINYINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'DOUBLE';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if ($funsigned) $suffix .= ' UNSIGNED';
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fautoinc) $suffix .= ' AUTO_INCREMENT';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
||||||
|
[table_options] [select_statement]
|
||||||
|
create_definition:
|
||||||
|
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
|
||||||
|
[PRIMARY KEY] [reference_definition]
|
||||||
|
or PRIMARY KEY (index_col_name,...)
|
||||||
|
or KEY [index_name] (index_col_name,...)
|
||||||
|
or INDEX [index_name] (index_col_name,...)
|
||||||
|
or UNIQUE [INDEX] [index_name] (index_col_name,...)
|
||||||
|
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
|
||||||
|
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
|
||||||
|
[reference_definition]
|
||||||
|
or CHECK (expr)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [UNIQUE|FULLTEXT] INDEX index_name
|
||||||
|
ON tbl_name (col_name[(length)],... )
|
||||||
|
*/
|
||||||
|
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname";
|
||||||
|
else $sql[] = sprintf($this->dropIndex, $idxname, $tabname);
|
||||||
|
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($idxoptions['FULLTEXT'])) {
|
||||||
|
$unique = ' FULLTEXT';
|
||||||
|
} elseif (isset($idxoptions['UNIQUE'])) {
|
||||||
|
$unique = ' UNIQUE';
|
||||||
|
} else {
|
||||||
|
$unique = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is_array($flds) ) $flds = implode(', ',$flds);
|
||||||
|
|
||||||
|
if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname ";
|
||||||
|
else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname;
|
||||||
|
|
||||||
|
$s .= ' (' . $flds . ')';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
291
includes/adodb/datadict/datadict-oci8.inc.php
Normal file
291
includes/adodb/datadict/datadict-oci8.inc.php
Normal file
@ -0,0 +1,291 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_oci8 extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'oci8';
|
||||||
|
var $seqField = false;
|
||||||
|
var $seqPrefix = 'SEQ_';
|
||||||
|
var $dropTable = "DROP TABLE %s CASCADE CONSTRAINTS";
|
||||||
|
var $trigPrefix = 'TRIG_';
|
||||||
|
var $alterCol = ' MODIFY ';
|
||||||
|
var $typeX = 'VARCHAR(4000)';
|
||||||
|
var $typeXL = 'CLOB';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'VARCHAR2':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'VARBINARY':
|
||||||
|
case 'BINARY':
|
||||||
|
if (isset($this) && $len <= $this->blobSize) return 'C';
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
case 'NCHAR':
|
||||||
|
case 'NVARCHAR2':
|
||||||
|
case 'NVARCHAR':
|
||||||
|
if (isset($this) && $len <= $this->blobSize) return 'C2';
|
||||||
|
return 'X2';
|
||||||
|
|
||||||
|
case 'NCLOB':
|
||||||
|
case 'CLOB':
|
||||||
|
return 'XL';
|
||||||
|
|
||||||
|
case 'LONG RAW':
|
||||||
|
case 'LONG VARBINARY':
|
||||||
|
case 'BLOB':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'DATE':
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
case 'INT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'INTEGER':
|
||||||
|
return 'I';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'X': return $this->typeX;
|
||||||
|
case 'XL': return $this->typeXL;
|
||||||
|
|
||||||
|
case 'C2': return 'NVARCHAR2';
|
||||||
|
case 'X2': return 'NVARCHAR2(4000)';
|
||||||
|
|
||||||
|
case 'B': return 'BLOB';
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
case 'T': return 'DATE';
|
||||||
|
case 'L': return 'NUMBER(1)';
|
||||||
|
case 'I1': return 'NUMBER(3)';
|
||||||
|
case 'I2': return 'NUMBER(5)';
|
||||||
|
case 'I':
|
||||||
|
case 'I4': return 'NUMBER(10)';
|
||||||
|
|
||||||
|
case 'I8': return 'NUMBER(20)';
|
||||||
|
case 'F': return 'NUMBER';
|
||||||
|
case 'N': return 'NUMBER';
|
||||||
|
case 'R': return 'NUMBER(20)';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateDatabase($dbname, $options=false)
|
||||||
|
{
|
||||||
|
$options = $this->_Options($options);
|
||||||
|
$password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
|
||||||
|
$tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
|
||||||
|
$sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
|
||||||
|
$sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$f = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$s = "ALTER TABLE $tabname ADD (";
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$f[] = "\n $v";
|
||||||
|
}
|
||||||
|
|
||||||
|
$s .= implode(', ',$f).')';
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$f = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$s = "ALTER TABLE $tabname MODIFY(";
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$f[] = "\n $v";
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f).')';
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||||
|
foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v);
|
||||||
|
|
||||||
|
$sql = array();
|
||||||
|
$s = "ALTER TABLE $tabname DROP(";
|
||||||
|
$s .= implode(', ',$flds).') CASCADE CONSTRAINTS';
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _DropAutoIncrement($t)
|
||||||
|
{
|
||||||
|
if (strpos($t,'.') !== false) {
|
||||||
|
$tarr = explode('.',$t);
|
||||||
|
return "drop sequence ".$tarr[0].".seq_".$tarr[1];
|
||||||
|
}
|
||||||
|
return "drop sequence seq_".$t;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
|
||||||
|
if ($fdefault == "''" && $fnotnull) {// this is null in oracle
|
||||||
|
$fnotnull = false;
|
||||||
|
if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
|
||||||
|
if ($fautoinc) $this->seqField = $fname;
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE or replace TRIGGER jaddress_insert
|
||||||
|
before insert on jaddress
|
||||||
|
for each row
|
||||||
|
begin
|
||||||
|
select seqaddress.nextval into :new.A_ID from dual;
|
||||||
|
end;
|
||||||
|
*/
|
||||||
|
function _Triggers($tabname,$tableoptions)
|
||||||
|
{
|
||||||
|
if (!$this->seqField) return array();
|
||||||
|
|
||||||
|
if ($this->schema) {
|
||||||
|
$t = strpos($tabname,'.');
|
||||||
|
if ($t !== false) $tab = substr($tabname,$t+1);
|
||||||
|
else $tab = $tabname;
|
||||||
|
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
|
||||||
|
$trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab;
|
||||||
|
} else {
|
||||||
|
$seqname = $this->seqPrefix.$tabname;
|
||||||
|
$trigname = $this->trigPrefix.$seqname;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen($seqname) > 30) {
|
||||||
|
$seqname = $this->seqPrefix.uniqid('');
|
||||||
|
} // end if
|
||||||
|
if (strlen($trigname) > 30) {
|
||||||
|
$trigname = $this->trigPrefix.uniqid('');
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
|
||||||
|
$seqCache = '';
|
||||||
|
if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
|
||||||
|
$seqIncr = '';
|
||||||
|
if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
|
||||||
|
$seqStart = '';
|
||||||
|
if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
|
||||||
|
$sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
|
||||||
|
$sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
|
||||||
|
|
||||||
|
$this->seqField = false;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
||||||
|
[table_options] [select_statement]
|
||||||
|
create_definition:
|
||||||
|
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
|
||||||
|
[PRIMARY KEY] [reference_definition]
|
||||||
|
or PRIMARY KEY (index_col_name,...)
|
||||||
|
or KEY [index_name] (index_col_name,...)
|
||||||
|
or INDEX [index_name] (index_col_name,...)
|
||||||
|
or UNIQUE [INDEX] [index_name] (index_col_name,...)
|
||||||
|
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
|
||||||
|
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
|
||||||
|
[reference_definition]
|
||||||
|
or CHECK (expr)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($idxoptions['BITMAP'])) {
|
||||||
|
$unique = ' BITMAP';
|
||||||
|
} elseif (isset($idxoptions['UNIQUE'])) {
|
||||||
|
$unique = ' UNIQUE';
|
||||||
|
} else {
|
||||||
|
$unique = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
if (isset($idxoptions['oci8']))
|
||||||
|
$s .= $idxoptions['oci8'];
|
||||||
|
|
||||||
|
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetCommentSQL($table,$col)
|
||||||
|
{
|
||||||
|
$table = $this->connection->qstr($table);
|
||||||
|
$col = $this->connection->qstr($col);
|
||||||
|
return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetCommentSQL($table,$col,$cmt)
|
||||||
|
{
|
||||||
|
$cmt = $this->connection->qstr($cmt);
|
||||||
|
return "COMMENT ON COLUMN $table.$col IS $cmt";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
447
includes/adodb/datadict/datadict-postgres.inc.php
Normal file
447
includes/adodb/datadict/datadict-postgres.inc.php
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_postgres extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'postgres';
|
||||||
|
var $seqField = false;
|
||||||
|
var $seqPrefix = 'SEQ_';
|
||||||
|
var $addCol = ' ADD COLUMN';
|
||||||
|
var $quote = '"';
|
||||||
|
var $renameTable = 'ALTER TABLE %s RENAME TO %s'; // at least since 7.1
|
||||||
|
var $dropTable = 'DROP TABLE %s CASCADE';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique &&
|
||||||
|
$fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval(';
|
||||||
|
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'INTERVAL':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'CHARACTER':
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'NAME':
|
||||||
|
case 'BPCHAR':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
case 'IMAGE': // user defined type
|
||||||
|
case 'BLOB': // user defined type
|
||||||
|
case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
|
||||||
|
case 'VARBIT':
|
||||||
|
case 'BYTEA':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'BOOL':
|
||||||
|
case 'BOOLEAN':
|
||||||
|
return 'L';
|
||||||
|
|
||||||
|
case 'DATE':
|
||||||
|
return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'DATETIME':
|
||||||
|
case 'TIMESTAMP':
|
||||||
|
case 'TIMESTAMPTZ':
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
case 'INTEGER': return !$is_serial ? 'I' : 'R';
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'INT2': return !$is_serial ? 'I2' : 'R';
|
||||||
|
case 'INT4': return !$is_serial ? 'I4' : 'R';
|
||||||
|
case 'BIGINT':
|
||||||
|
case 'INT8': return !$is_serial ? 'I8' : 'R';
|
||||||
|
|
||||||
|
case 'OID':
|
||||||
|
case 'SERIAL':
|
||||||
|
return 'R';
|
||||||
|
|
||||||
|
case 'FLOAT4':
|
||||||
|
case 'FLOAT8':
|
||||||
|
case 'DOUBLE PRECISION':
|
||||||
|
case 'REAL':
|
||||||
|
return 'F';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR';
|
||||||
|
case 'X2': return 'TEXT';
|
||||||
|
|
||||||
|
case 'B': return 'BYTEA';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'BOOLEAN';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'INT2';
|
||||||
|
case 'I4': return 'INT4';
|
||||||
|
case 'I8': return 'INT8';
|
||||||
|
|
||||||
|
case 'F': return 'FLOAT8';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adding a new Column
|
||||||
|
*
|
||||||
|
* reimplementation of the default function as postgres does NOT allow to set the default in the same statement
|
||||||
|
*
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-names and types for the changed columns
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
|
||||||
|
foreach($lines as $v) {
|
||||||
|
if (($not_null = preg_match('/NOT NULL/i',$v))) {
|
||||||
|
$v = preg_replace('/NOT NULL/i','',$v);
|
||||||
|
}
|
||||||
|
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||||
|
list(,$colname,$default) = $matches;
|
||||||
|
$sql[] = $alter . str_replace('DEFAULT '.$default,'',$v);
|
||||||
|
$sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default;
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||||
|
} else {
|
||||||
|
$sql[] = $alter . $v;
|
||||||
|
}
|
||||||
|
if ($not_null) {
|
||||||
|
list($colname) = explode(' ',$v);
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function DropIndexSQL ($idxname, $tabname = NULL)
|
||||||
|
{
|
||||||
|
return array(sprintf($this->dropIndex, $this->TableName($idxname), $this->TableName($tabname)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the definition of one column
|
||||||
|
*
|
||||||
|
* Postgres can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||||
|
* to allow, recreating the table and copying the content over to the new table
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-name and type for the changed column
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||||
|
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
if (!$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
// Check if alter single column datatype available - works with 8.0+
|
||||||
|
$has_alter_column = 8.0 <= (float) @$this->serverInfo['version'];
|
||||||
|
|
||||||
|
if ($has_alter_column) {
|
||||||
|
$tabname = $this->TableName($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
|
||||||
|
foreach($lines as $v) {
|
||||||
|
if ($not_null = preg_match('/NOT NULL/i',$v)) {
|
||||||
|
$v = preg_replace('/NOT NULL/i','',$v);
|
||||||
|
}
|
||||||
|
// this next block doesn't work - there is no way that I can see to
|
||||||
|
// explicitly ask a column to be null using $flds
|
||||||
|
else if ($set_null = preg_match('/NULL/i',$v)) {
|
||||||
|
// if they didn't specify not null, see if they explicitely asked for null
|
||||||
|
$v = preg_replace('/\sNULL/i','',$v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||||
|
list(,$colname,$default) = $matches;
|
||||||
|
$v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v);
|
||||||
|
$sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v);
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// drop default?
|
||||||
|
preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches);
|
||||||
|
list (,$colname,$rest) = $matches;
|
||||||
|
$sql[] = $alter . $colname . ' TYPE ' . $rest;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($colname) = explode(' ',$v);
|
||||||
|
if ($not_null) {
|
||||||
|
// this does not error out if the column is already not null
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||||
|
}
|
||||||
|
if ($set_null) {
|
||||||
|
// this does not error out if the column is already null
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// does not have alter column
|
||||||
|
if (!$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop one column
|
||||||
|
*
|
||||||
|
* Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||||
|
* to allow, recreating the table and copying the content over to the new table
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-name and type for the changed column
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||||
|
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
$has_drop_column = 7.3 <= (float) @$this->serverInfo['version'];
|
||||||
|
if (!$has_drop_column && !$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
if ($has_drop_column) {
|
||||||
|
return ADODB_DataDict::DropColumnSQL($tabname, $flds);
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the content into a temp. table, drop and recreate the original table and copy the content back in
|
||||||
|
*
|
||||||
|
* We also take care to set the values of the sequenz and recreate the indexes.
|
||||||
|
* All this is done in a transaction, to not loose the content of the table, if something went wrong!
|
||||||
|
* @internal
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $dropflds column-names to drop
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres
|
||||||
|
* @param array/string $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='')
|
||||||
|
{
|
||||||
|
if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds);
|
||||||
|
$copyflds = array();
|
||||||
|
foreach($this->MetaColumns($tabname) as $fld) {
|
||||||
|
if (!$dropflds || !in_array($fld->name,$dropflds)) {
|
||||||
|
// we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one
|
||||||
|
if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) &&
|
||||||
|
in_array($fld->type,array('varchar','char','text','bytea'))) {
|
||||||
|
$copyflds[] = "to_number($fld->name,'S9999999999999D99')";
|
||||||
|
} else {
|
||||||
|
$copyflds[] = $fld->name;
|
||||||
|
}
|
||||||
|
// identify the sequence name and the fld its on
|
||||||
|
if ($fld->primary_key && $fld->has_default &&
|
||||||
|
preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) {
|
||||||
|
$seq_name = $matches[1];
|
||||||
|
$seq_fld = $fld->name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$copyflds = implode(', ',$copyflds);
|
||||||
|
|
||||||
|
$tempname = $tabname.'_tmp';
|
||||||
|
$aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table
|
||||||
|
$aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname";
|
||||||
|
$aSql = array_merge($aSql,$this->DropTableSQL($tabname));
|
||||||
|
$aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions));
|
||||||
|
$aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname";
|
||||||
|
if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again
|
||||||
|
$seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence
|
||||||
|
$aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname";
|
||||||
|
}
|
||||||
|
$aSql[] = "DROP TABLE $tempname";
|
||||||
|
// recreate the indexes, if they not contain one of the droped columns
|
||||||
|
foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data)
|
||||||
|
{
|
||||||
|
if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) {
|
||||||
|
$aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'],
|
||||||
|
$idx_data['unique'] ? array('UNIQUE') : False));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$aSql[] = 'COMMIT';
|
||||||
|
return $aSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropTableSQL($tabname)
|
||||||
|
{
|
||||||
|
$sql = ADODB_DataDict::DropTableSQL($tabname);
|
||||||
|
|
||||||
|
$drop_seq = $this->_DropAutoIncrement($tabname);
|
||||||
|
if ($drop_seq) $sql[] = $drop_seq;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
if ($fautoinc) {
|
||||||
|
$ftype = 'SERIAL';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search for a sequece for the given table (asumes the seqence-name contains the table-name!)
|
||||||
|
// if yes return sql to drop it
|
||||||
|
// this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!!
|
||||||
|
function _DropAutoIncrement($tabname)
|
||||||
|
{
|
||||||
|
$tabname = $this->connection->quote('%'.$tabname.'%');
|
||||||
|
|
||||||
|
$seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'");
|
||||||
|
|
||||||
|
// check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly
|
||||||
|
if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
return "DROP SEQUENCE ".$seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RenameTableSQL($tabname,$newname)
|
||||||
|
{
|
||||||
|
if (!empty($this->schema)) {
|
||||||
|
$rename_from = $this->TableName($tabname);
|
||||||
|
$schema_save = $this->schema;
|
||||||
|
$this->schema = false;
|
||||||
|
$rename_to = $this->TableName($newname);
|
||||||
|
$this->schema = $schema_save;
|
||||||
|
return array (sprintf($this->renameTable, $rename_from, $rename_to));
|
||||||
|
}
|
||||||
|
|
||||||
|
return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
|
||||||
|
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
|
||||||
|
| table_constraint } [, ... ]
|
||||||
|
)
|
||||||
|
[ INHERITS ( parent_table [, ... ] ) ]
|
||||||
|
[ WITH OIDS | WITHOUT OIDS ]
|
||||||
|
where column_constraint is:
|
||||||
|
[ CONSTRAINT constraint_name ]
|
||||||
|
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
|
||||||
|
CHECK (expression) |
|
||||||
|
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
|
||||||
|
[ ON DELETE action ] [ ON UPDATE action ] }
|
||||||
|
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||||
|
and table_constraint is:
|
||||||
|
[ CONSTRAINT constraint_name ]
|
||||||
|
{ UNIQUE ( column_name [, ... ] ) |
|
||||||
|
PRIMARY KEY ( column_name [, ... ] ) |
|
||||||
|
CHECK ( expression ) |
|
||||||
|
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
|
||||||
|
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
|
||||||
|
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||||
|
[ USING acc_method ] ( column [ ops_name ] [, ...] )
|
||||||
|
[ WHERE predicate ]
|
||||||
|
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||||
|
[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
|
||||||
|
[ WHERE predicate ]
|
||||||
|
*/
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||||
|
|
||||||
|
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
|
||||||
|
|
||||||
|
if (isset($idxoptions['HASH']))
|
||||||
|
$s .= 'USING HASH ';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s .= '(' . $flds . ')';
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||||
|
{
|
||||||
|
if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) {
|
||||||
|
$ftype .= "(".$fsize;
|
||||||
|
if (strlen($fprec)) $ftype .= ",".$fprec;
|
||||||
|
$ftype .= ')';
|
||||||
|
}
|
||||||
|
return $ftype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
441
includes/adodb/datadict/datadict-postgres.inc.php.bak
Normal file
441
includes/adodb/datadict/datadict-postgres.inc.php.bak
Normal file
@ -0,0 +1,441 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.02 24 Sept 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_postgres extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'postgres';
|
||||||
|
var $seqField = false;
|
||||||
|
var $seqPrefix = 'SEQ_';
|
||||||
|
var $addCol = ' ADD COLUMN';
|
||||||
|
var $quote = '"';
|
||||||
|
var $renameTable = 'ALTER TABLE %s RENAME TO %s'; // at least since 7.1
|
||||||
|
var $dropTable = 'DROP TABLE %s CASCADE';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique &&
|
||||||
|
$fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval(';
|
||||||
|
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'INTERVAL':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'CHARACTER':
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'NAME':
|
||||||
|
case 'BPCHAR':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
case 'IMAGE': // user defined type
|
||||||
|
case 'BLOB': // user defined type
|
||||||
|
case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
|
||||||
|
case 'VARBIT':
|
||||||
|
case 'BYTEA':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'BOOL':
|
||||||
|
case 'BOOLEAN':
|
||||||
|
return 'L';
|
||||||
|
|
||||||
|
case 'DATE':
|
||||||
|
return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'DATETIME':
|
||||||
|
case 'TIMESTAMP':
|
||||||
|
case 'TIMESTAMPTZ':
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
case 'INTEGER': return !$is_serial ? 'I' : 'R';
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'INT2': return !$is_serial ? 'I2' : 'R';
|
||||||
|
case 'INT4': return !$is_serial ? 'I4' : 'R';
|
||||||
|
case 'BIGINT':
|
||||||
|
case 'INT8': return !$is_serial ? 'I8' : 'R';
|
||||||
|
|
||||||
|
case 'OID':
|
||||||
|
case 'SERIAL':
|
||||||
|
return 'R';
|
||||||
|
|
||||||
|
case 'FLOAT4':
|
||||||
|
case 'FLOAT8':
|
||||||
|
case 'DOUBLE PRECISION':
|
||||||
|
case 'REAL':
|
||||||
|
return 'F';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR';
|
||||||
|
case 'X2': return 'TEXT';
|
||||||
|
|
||||||
|
case 'B': return 'BYTEA';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'BOOLEAN';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'SMALLINT';
|
||||||
|
case 'I2': return 'INT2';
|
||||||
|
case 'I4': return 'INT4';
|
||||||
|
case 'I8': return 'INT8';
|
||||||
|
|
||||||
|
case 'F': return 'FLOAT8';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adding a new Column
|
||||||
|
*
|
||||||
|
* reimplementation of the default function as postgres does NOT allow to set the default in the same statement
|
||||||
|
*
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-names and types for the changed columns
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
|
||||||
|
foreach($lines as $v) {
|
||||||
|
if (($not_null = preg_match('/NOT NULL/i',$v))) {
|
||||||
|
$v = preg_replace('/NOT NULL/i','',$v);
|
||||||
|
}
|
||||||
|
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||||
|
list(,$colname,$default) = $matches;
|
||||||
|
$sql[] = $alter . str_replace('DEFAULT '.$default,'',$v);
|
||||||
|
$sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default;
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||||
|
} else {
|
||||||
|
$sql[] = $alter . $v;
|
||||||
|
}
|
||||||
|
if ($not_null) {
|
||||||
|
list($colname) = explode(' ',$v);
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the definition of one column
|
||||||
|
*
|
||||||
|
* Postgres can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||||
|
* to allow, recreating the table and copying the content over to the new table
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-name and type for the changed column
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||||
|
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
if (!$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
// Check if alter single column datatype available - works with 8.0+
|
||||||
|
$has_alter_column = 8.0 <= (float) @$this->serverInfo['version'];
|
||||||
|
|
||||||
|
if ($has_alter_column) {
|
||||||
|
$tabname = $this->TableName($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
|
||||||
|
foreach($lines as $v) {
|
||||||
|
if ($not_null = preg_match('/NOT NULL/i',$v)) {
|
||||||
|
$v = preg_replace('/NOT NULL/i','',$v);
|
||||||
|
}
|
||||||
|
// this next block doesn't work - there is no way that I can see to
|
||||||
|
// explicitly ask a column to be null using $flds
|
||||||
|
else if ($set_null = preg_match('/NULL/i',$v)) {
|
||||||
|
// if they didn't specify not null, see if they explicitely asked for null
|
||||||
|
$v = preg_replace('/\sNULL/i','',$v);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||||
|
list(,$colname,$default) = $matches;
|
||||||
|
$v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v);
|
||||||
|
$sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v);
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// drop default?
|
||||||
|
preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches);
|
||||||
|
list (,$colname,$rest) = $matches;
|
||||||
|
$sql[] = $alter . $colname . ' TYPE ' . $rest;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($colname) = explode(' ',$v);
|
||||||
|
if ($not_null) {
|
||||||
|
// this does not error out if the column is already not null
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||||
|
}
|
||||||
|
if ($set_null) {
|
||||||
|
// this does not error out if the column is already null
|
||||||
|
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// does not have alter column
|
||||||
|
if (!$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop one column
|
||||||
|
*
|
||||||
|
* Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||||
|
* to allow, recreating the table and copying the content over to the new table
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $flds column-name and type for the changed column
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||||
|
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||||
|
{
|
||||||
|
$has_drop_column = 7.3 <= (float) @$this->serverInfo['version'];
|
||||||
|
if (!$has_drop_column && !$tableflds) {
|
||||||
|
if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3");
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
if ($has_drop_column) {
|
||||||
|
return ADODB_DataDict::DropColumnSQL($tabname, $flds);
|
||||||
|
}
|
||||||
|
return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the content into a temp. table, drop and recreate the original table and copy the content back in
|
||||||
|
*
|
||||||
|
* We also take care to set the values of the sequenz and recreate the indexes.
|
||||||
|
* All this is done in a transaction, to not loose the content of the table, if something went wrong!
|
||||||
|
* @internal
|
||||||
|
* @param string $tabname table-name
|
||||||
|
* @param string $dropflds column-names to drop
|
||||||
|
* @param string $tableflds complete defintion of the new table, eg. for postgres
|
||||||
|
* @param array/string $tableoptions options for the new table see CreateTableSQL, default ''
|
||||||
|
* @return array with SQL strings
|
||||||
|
*/
|
||||||
|
function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='')
|
||||||
|
{
|
||||||
|
if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds);
|
||||||
|
$copyflds = array();
|
||||||
|
foreach($this->MetaColumns($tabname) as $fld) {
|
||||||
|
if (!$dropflds || !in_array($fld->name,$dropflds)) {
|
||||||
|
// we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one
|
||||||
|
if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) &&
|
||||||
|
in_array($fld->type,array('varchar','char','text','bytea'))) {
|
||||||
|
$copyflds[] = "to_number($fld->name,'S9999999999999D99')";
|
||||||
|
} else {
|
||||||
|
$copyflds[] = $fld->name;
|
||||||
|
}
|
||||||
|
// identify the sequence name and the fld its on
|
||||||
|
if ($fld->primary_key && $fld->has_default &&
|
||||||
|
preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) {
|
||||||
|
$seq_name = $matches[1];
|
||||||
|
$seq_fld = $fld->name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$copyflds = implode(', ',$copyflds);
|
||||||
|
|
||||||
|
$tempname = $tabname.'_tmp';
|
||||||
|
$aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table
|
||||||
|
$aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname";
|
||||||
|
$aSql = array_merge($aSql,$this->DropTableSQL($tabname));
|
||||||
|
$aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions));
|
||||||
|
$aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname";
|
||||||
|
if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again
|
||||||
|
$seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence
|
||||||
|
$aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname";
|
||||||
|
}
|
||||||
|
$aSql[] = "DROP TABLE $tempname";
|
||||||
|
// recreate the indexes, if they not contain one of the droped columns
|
||||||
|
foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data)
|
||||||
|
{
|
||||||
|
if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) {
|
||||||
|
$aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'],
|
||||||
|
$idx_data['unique'] ? array('UNIQUE') : False));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$aSql[] = 'COMMIT';
|
||||||
|
return $aSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropTableSQL($tabname)
|
||||||
|
{
|
||||||
|
$sql = ADODB_DataDict::DropTableSQL($tabname);
|
||||||
|
|
||||||
|
$drop_seq = $this->_DropAutoIncrement($tabname);
|
||||||
|
if ($drop_seq) $sql[] = $drop_seq;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
if ($fautoinc) {
|
||||||
|
$ftype = 'SERIAL';
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search for a sequece for the given table (asumes the seqence-name contains the table-name!)
|
||||||
|
// if yes return sql to drop it
|
||||||
|
// this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!!
|
||||||
|
function _DropAutoIncrement($tabname)
|
||||||
|
{
|
||||||
|
$tabname = $this->connection->quote('%'.$tabname.'%');
|
||||||
|
|
||||||
|
$seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'");
|
||||||
|
|
||||||
|
// check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly
|
||||||
|
if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) {
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
return "DROP SEQUENCE ".$seq;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RenameTableSQL($tabname,$newname)
|
||||||
|
{
|
||||||
|
if (!empty($this->schema)) {
|
||||||
|
$rename_from = $this->TableName($tabname);
|
||||||
|
$schema_save = $this->schema;
|
||||||
|
$this->schema = false;
|
||||||
|
$rename_to = $this->TableName($newname);
|
||||||
|
$this->schema = $schema_save;
|
||||||
|
return array (sprintf($this->renameTable, $rename_from, $rename_to));
|
||||||
|
}
|
||||||
|
|
||||||
|
return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
|
||||||
|
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
|
||||||
|
| table_constraint } [, ... ]
|
||||||
|
)
|
||||||
|
[ INHERITS ( parent_table [, ... ] ) ]
|
||||||
|
[ WITH OIDS | WITHOUT OIDS ]
|
||||||
|
where column_constraint is:
|
||||||
|
[ CONSTRAINT constraint_name ]
|
||||||
|
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
|
||||||
|
CHECK (expression) |
|
||||||
|
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
|
||||||
|
[ ON DELETE action ] [ ON UPDATE action ] }
|
||||||
|
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||||
|
and table_constraint is:
|
||||||
|
[ CONSTRAINT constraint_name ]
|
||||||
|
{ UNIQUE ( column_name [, ... ] ) |
|
||||||
|
PRIMARY KEY ( column_name [, ... ] ) |
|
||||||
|
CHECK ( expression ) |
|
||||||
|
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
|
||||||
|
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
|
||||||
|
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||||
|
[ USING acc_method ] ( column [ ops_name ] [, ...] )
|
||||||
|
[ WHERE predicate ]
|
||||||
|
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||||
|
[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
|
||||||
|
[ WHERE predicate ]
|
||||||
|
*/
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||||
|
|
||||||
|
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
|
||||||
|
|
||||||
|
if (isset($idxoptions['HASH']))
|
||||||
|
$s .= 'USING HASH ';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s .= '(' . $flds . ')';
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||||
|
{
|
||||||
|
if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) {
|
||||||
|
$ftype .= "(".$fsize;
|
||||||
|
if (strlen($fprec)) $ftype .= ",".$fprec;
|
||||||
|
$ftype .= ')';
|
||||||
|
}
|
||||||
|
return $ftype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
121
includes/adodb/datadict/datadict-sapdb.inc.php
Normal file
121
includes/adodb/datadict/datadict-sapdb.inc.php
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V4.50 6 July 2004 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Modified from datadict-generic.inc.php for sapdb by RalfBecker-AT-outdoor-training.de
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_sapdb extends ADODB_DataDict {
|
||||||
|
|
||||||
|
var $databaseType = 'sapdb';
|
||||||
|
var $seqField = false;
|
||||||
|
var $renameColumn = 'RENAME COLUMN %s.%s TO %s';
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch($meta) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'LONG';
|
||||||
|
|
||||||
|
case 'C2': return 'VARCHAR UNICODE';
|
||||||
|
case 'X2': return 'LONG UNICODE';
|
||||||
|
|
||||||
|
case 'B': return 'LONG';
|
||||||
|
|
||||||
|
case 'D': return 'DATE';
|
||||||
|
case 'T': return 'TIMESTAMP';
|
||||||
|
|
||||||
|
case 'L': return 'BOOLEAN';
|
||||||
|
case 'I': return 'INTEGER';
|
||||||
|
case 'I1': return 'FIXED(3)';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INTEGER';
|
||||||
|
case 'I8': return 'FIXED(20)';
|
||||||
|
|
||||||
|
case 'F': return 'FLOAT(38)';
|
||||||
|
case 'N': return 'FIXED';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
static $maxdb_type2adodb = array(
|
||||||
|
'VARCHAR' => 'C',
|
||||||
|
'CHARACTER' => 'C',
|
||||||
|
'LONG' => 'X', // no way to differ between 'X' and 'B' :-(
|
||||||
|
'DATE' => 'D',
|
||||||
|
'TIMESTAMP' => 'T',
|
||||||
|
'BOOLEAN' => 'L',
|
||||||
|
'INTEGER' => 'I4',
|
||||||
|
'SMALLINT' => 'I2',
|
||||||
|
'FLOAT' => 'F',
|
||||||
|
'FIXED' => 'N',
|
||||||
|
);
|
||||||
|
$type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C';
|
||||||
|
|
||||||
|
// convert integer-types simulated with fixed back to integer
|
||||||
|
if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) {
|
||||||
|
$type = $len == 20 ? 'I8' : 'I1';
|
||||||
|
}
|
||||||
|
if ($fieldobj->auto_increment) $type = 'R';
|
||||||
|
|
||||||
|
return $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if ($funsigned) $suffix .= ' UNSIGNED';
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
if ($fautoinc) $suffix .= ' DEFAULT SERIAL';
|
||||||
|
elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' );
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' );
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||||
|
foreach($flds as $k => $v) {
|
||||||
|
$flds[$k] = $this->NameQuote($v);
|
||||||
|
}
|
||||||
|
return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
228
includes/adodb/datadict/datadict-sybase.inc.php
Normal file
228
includes/adodb/datadict/datadict-sybase.inc.php
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB2_sybase extends ADODB_DataDict {
|
||||||
|
var $databaseType = 'sybase';
|
||||||
|
|
||||||
|
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$len = -1; // mysql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER': return 'I';
|
||||||
|
case 'BIT':
|
||||||
|
case 'TINYINT': return 'I1';
|
||||||
|
case 'SMALLINT': return 'I2';
|
||||||
|
case 'BIGINT': return 'I8';
|
||||||
|
|
||||||
|
case 'REAL':
|
||||||
|
case 'FLOAT': return 'F';
|
||||||
|
default: return parent::MetaType($t,$len,$fieldobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ActualType($meta)
|
||||||
|
{
|
||||||
|
switch(strtoupper($meta)) {
|
||||||
|
case 'C': return 'VARCHAR';
|
||||||
|
case 'XL':
|
||||||
|
case 'X': return 'TEXT';
|
||||||
|
|
||||||
|
case 'C2': return 'NVARCHAR';
|
||||||
|
case 'X2': return 'NTEXT';
|
||||||
|
|
||||||
|
case 'B': return 'IMAGE';
|
||||||
|
|
||||||
|
case 'D': return 'DATETIME';
|
||||||
|
case 'T': return 'DATETIME';
|
||||||
|
case 'L': return 'BIT';
|
||||||
|
|
||||||
|
case 'I': return 'INT';
|
||||||
|
case 'I1': return 'TINYINT';
|
||||||
|
case 'I2': return 'SMALLINT';
|
||||||
|
case 'I4': return 'INT';
|
||||||
|
case 'I8': return 'BIGINT';
|
||||||
|
|
||||||
|
case 'F': return 'REAL';
|
||||||
|
case 'N': return 'NUMERIC';
|
||||||
|
default:
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function AddColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$f = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
$s = "ALTER TABLE $tabname $this->addCol";
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$f[] = "\n $v";
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AlterColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName ($tabname);
|
||||||
|
$sql = array();
|
||||||
|
list($lines,$pkey) = $this->_GenFields($flds);
|
||||||
|
foreach($lines as $v) {
|
||||||
|
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropColumnSQL($tabname, $flds)
|
||||||
|
{
|
||||||
|
$tabname = $this->TableName($tabname);
|
||||||
|
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||||
|
$f = array();
|
||||||
|
$s = "ALTER TABLE $tabname";
|
||||||
|
foreach($flds as $v) {
|
||||||
|
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||||
|
}
|
||||||
|
$s .= implode(', ',$f);
|
||||||
|
$sql[] = $s;
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return string must begin with space
|
||||||
|
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||||
|
{
|
||||||
|
$suffix = '';
|
||||||
|
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||||
|
if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT';
|
||||||
|
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||||
|
else if ($suffix == '') $suffix .= ' NULL';
|
||||||
|
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||||
|
return $suffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE TABLE
|
||||||
|
[ database_name.[ owner ] . | owner. ] table_name
|
||||||
|
( { < column_definition >
|
||||||
|
| column_name AS computed_column_expression
|
||||||
|
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||||
|
|
||||||
|
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||||
|
)
|
||||||
|
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||||
|
|
||||||
|
< column_definition > ::= { column_name data_type }
|
||||||
|
[ COLLATE < collation_name > ]
|
||||||
|
[ [ DEFAULT constant_expression ]
|
||||||
|
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||||
|
]
|
||||||
|
[ ROWGUIDCOL]
|
||||||
|
[ < column_constraint > ] [ ...n ]
|
||||||
|
|
||||||
|
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ NULL | NOT NULL ]
|
||||||
|
| [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ON {filegroup | DEFAULT} ] ]
|
||||||
|
]
|
||||||
|
| [ [ FOREIGN KEY ]
|
||||||
|
REFERENCES ref_table [ ( ref_column ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( logical_expression )
|
||||||
|
}
|
||||||
|
|
||||||
|
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||||
|
{ [ { PRIMARY KEY | UNIQUE }
|
||||||
|
[ CLUSTERED | NONCLUSTERED ]
|
||||||
|
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||||
|
[ WITH FILLFACTOR = fillfactor ]
|
||||||
|
[ ON { filegroup | DEFAULT } ]
|
||||||
|
]
|
||||||
|
| FOREIGN KEY
|
||||||
|
[ ( column [ ,...n ] ) ]
|
||||||
|
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||||
|
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||||
|
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||||
|
[ NOT FOR REPLICATION ]
|
||||||
|
| CHECK [ NOT FOR REPLICATION ]
|
||||||
|
( search_conditions )
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||||
|
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||||
|
[ WITH < index_option > [ ,...n] ]
|
||||||
|
[ ON filegroup ]
|
||||||
|
< index_option > :: =
|
||||||
|
{ PAD_INDEX |
|
||||||
|
FILLFACTOR = fillfactor |
|
||||||
|
IGNORE_DUP_KEY |
|
||||||
|
DROP_EXISTING |
|
||||||
|
STATISTICS_NORECOMPUTE |
|
||||||
|
SORT_IN_TEMPDB
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||||
|
{
|
||||||
|
$sql = array();
|
||||||
|
|
||||||
|
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||||
|
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||||
|
if ( isset($idxoptions['DROP']) )
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( empty ($flds) ) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||||
|
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||||
|
|
||||||
|
if ( is_array($flds) )
|
||||||
|
$flds = implode(', ',$flds);
|
||||||
|
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||||
|
|
||||||
|
if ( isset($idxoptions[$this->upperName]) )
|
||||||
|
$s .= $idxoptions[$this->upperName];
|
||||||
|
|
||||||
|
$sql[] = $s;
|
||||||
|
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
87
includes/adodb/drivers/adodb-access.inc.php
Normal file
87
includes/adodb/drivers/adodb-access.inc.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft Access data driver. Requires ODBC. Works only on MS Windows.
|
||||||
|
*/
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
if (!defined('_ADODB_ACCESS')) {
|
||||||
|
define('_ADODB_ACCESS',1);
|
||||||
|
|
||||||
|
class ADODB_access extends ADODB_odbc {
|
||||||
|
var $databaseType = 'access';
|
||||||
|
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||||
|
var $fmtDate = "#Y-m-d#";
|
||||||
|
var $fmtTimeStamp = "#Y-m-d h:i:sA#"; // note not comma
|
||||||
|
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
|
||||||
|
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||||
|
var $sysTimeStamp = 'NOW';
|
||||||
|
var $hasTransactions = false;
|
||||||
|
var $upperCase = 'ucase';
|
||||||
|
|
||||||
|
function ADODB_access()
|
||||||
|
{
|
||||||
|
global $ADODB_EXTENSION;
|
||||||
|
|
||||||
|
$ADODB_EXTENSION = false;
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function Time()
|
||||||
|
{
|
||||||
|
return time();
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans() { return false;}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " IIF(IsNull($field), $ifNull, $field) "; // if Access
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = odbc_tables($this->_connectionID);
|
||||||
|
$rs = new ADORecordSet_odbc($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
if (!$rs) return false;
|
||||||
|
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
//print_pre($arr);
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE')
|
||||||
|
$arr2[] = $arr[$i][2];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_access extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = "access";
|
||||||
|
|
||||||
|
function ADORecordSet_access($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
}// class
|
||||||
|
}
|
||||||
|
?>
|
644
includes/adodb/drivers/adodb-ado.inc.php
Normal file
644
includes/adodb/drivers/adodb-ado.inc.php
Normal file
@ -0,0 +1,644 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft ADO data driver. Requires ADO. Works only on MS Windows.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
define("_ADODB_ADO_LAYER", 1 );
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_ado extends ADOConnection {
|
||||||
|
var $databaseType = "ado";
|
||||||
|
var $_bindInputArray = false;
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $dataProvider = "ado";
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
|
||||||
|
var $_affectedRows = false;
|
||||||
|
var $_thisTransactions;
|
||||||
|
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
|
||||||
|
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
|
||||||
|
var $_lock_type = -1;
|
||||||
|
var $_execute_option = -1;
|
||||||
|
var $poorAffectedRows = true;
|
||||||
|
var $charPage;
|
||||||
|
|
||||||
|
function ADODB_ado()
|
||||||
|
{
|
||||||
|
$this->_affectedRows = new VARIANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
|
||||||
|
return array('description' => $desc, 'version' => '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
if (PHP_VERSION >= 5) return $this->_affectedRows;
|
||||||
|
|
||||||
|
return $this->_affectedRows->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// you can also pass a connection string like this:
|
||||||
|
//
|
||||||
|
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
|
||||||
|
{
|
||||||
|
$u = 'UID';
|
||||||
|
$p = 'PWD';
|
||||||
|
|
||||||
|
if (!empty($this->charPage))
|
||||||
|
$dbc = new COM('ADODB.Connection',null,$this->charPage);
|
||||||
|
else
|
||||||
|
$dbc = new COM('ADODB.Connection');
|
||||||
|
|
||||||
|
if (! $dbc) return false;
|
||||||
|
|
||||||
|
/* special support if provider is mssql or access */
|
||||||
|
if ($argProvider=='mssql') {
|
||||||
|
$u = 'User Id'; //User parameter name for OLEDB
|
||||||
|
$p = 'Password';
|
||||||
|
$argProvider = "SQLOLEDB"; // SQL Server Provider
|
||||||
|
|
||||||
|
// not yet
|
||||||
|
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
|
||||||
|
|
||||||
|
//use trusted conection for SQL if username not specified
|
||||||
|
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
|
||||||
|
} else if ($argProvider=='access')
|
||||||
|
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
|
||||||
|
|
||||||
|
if ($argProvider) $dbc->Provider = $argProvider;
|
||||||
|
|
||||||
|
if ($argUsername) $argHostname .= ";$u=$argUsername";
|
||||||
|
if ($argPassword)$argHostname .= ";$p=$argPassword";
|
||||||
|
|
||||||
|
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
|
||||||
|
// @ added below for php 4.0.1 and earlier
|
||||||
|
@$dbc->Open((string) $argHostname);
|
||||||
|
|
||||||
|
$this->_connectionID = $dbc;
|
||||||
|
|
||||||
|
$dbc->CursorLocation = $this->_cursor_location;
|
||||||
|
return $dbc->State > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
|
||||||
|
{
|
||||||
|
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
adSchemaCatalogs = 1,
|
||||||
|
adSchemaCharacterSets = 2,
|
||||||
|
adSchemaCollations = 3,
|
||||||
|
adSchemaColumns = 4,
|
||||||
|
adSchemaCheckConstraints = 5,
|
||||||
|
adSchemaConstraintColumnUsage = 6,
|
||||||
|
adSchemaConstraintTableUsage = 7,
|
||||||
|
adSchemaKeyColumnUsage = 8,
|
||||||
|
adSchemaReferentialContraints = 9,
|
||||||
|
adSchemaTableConstraints = 10,
|
||||||
|
adSchemaColumnsDomainUsage = 11,
|
||||||
|
adSchemaIndexes = 12,
|
||||||
|
adSchemaColumnPrivileges = 13,
|
||||||
|
adSchemaTablePrivileges = 14,
|
||||||
|
adSchemaUsagePrivileges = 15,
|
||||||
|
adSchemaProcedures = 16,
|
||||||
|
adSchemaSchemata = 17,
|
||||||
|
adSchemaSQLLanguages = 18,
|
||||||
|
adSchemaStatistics = 19,
|
||||||
|
adSchemaTables = 20,
|
||||||
|
adSchemaTranslations = 21,
|
||||||
|
adSchemaProviderTypes = 22,
|
||||||
|
adSchemaViews = 23,
|
||||||
|
adSchemaViewColumnUsage = 24,
|
||||||
|
adSchemaViewTableUsage = 25,
|
||||||
|
adSchemaProcedureParameters = 26,
|
||||||
|
adSchemaForeignKeys = 27,
|
||||||
|
adSchemaPrimaryKeys = 28,
|
||||||
|
adSchemaProcedureColumns = 29,
|
||||||
|
adSchemaDBInfoKeywords = 30,
|
||||||
|
adSchemaDBInfoLiterals = 31,
|
||||||
|
adSchemaCubes = 32,
|
||||||
|
adSchemaDimensions = 33,
|
||||||
|
adSchemaHierarchies = 34,
|
||||||
|
adSchemaLevels = 35,
|
||||||
|
adSchemaMeasures = 36,
|
||||||
|
adSchemaProperties = 37,
|
||||||
|
adSchemaMembers = 38
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
$arr= array();
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
$adors=@$dbc->OpenSchema(20);//tables
|
||||||
|
if ($adors){
|
||||||
|
$f = $adors->Fields(2);//table/view name
|
||||||
|
$t = $adors->Fields(3);//table type
|
||||||
|
while (!$adors->EOF){
|
||||||
|
$tt=substr($t->value,0,6);
|
||||||
|
if ($tt!='SYSTEM' && $tt !='ACCESS')
|
||||||
|
$arr[]=$f->value;
|
||||||
|
//print $f->value . ' ' . $t->value.'<br>';
|
||||||
|
$adors->MoveNext();
|
||||||
|
}
|
||||||
|
$adors->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$table = strtoupper($table);
|
||||||
|
$arr = array();
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
$adors=@$dbc->OpenSchema(4);//tables
|
||||||
|
|
||||||
|
if ($adors){
|
||||||
|
$t = $adors->Fields(2);//table/view name
|
||||||
|
while (!$adors->EOF){
|
||||||
|
|
||||||
|
|
||||||
|
if (strtoupper($t->Value) == $table) {
|
||||||
|
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$c = $adors->Fields(3);
|
||||||
|
$fld->name = $c->Value;
|
||||||
|
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||||
|
$fld->max_length = -1;
|
||||||
|
$arr[strtoupper($fld->name)]=$fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
$adors->MoveNext();
|
||||||
|
}
|
||||||
|
$adors->Close();
|
||||||
|
}
|
||||||
|
$false = false;
|
||||||
|
return empty($arr) ? $false : $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* returns queryID or false */
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
$false = false;
|
||||||
|
|
||||||
|
// return rs
|
||||||
|
if ($inputarr) {
|
||||||
|
|
||||||
|
if (!empty($this->charPage))
|
||||||
|
$oCmd = new COM('ADODB.Command',null,$this->charPage);
|
||||||
|
else
|
||||||
|
$oCmd = new COM('ADODB.Command');
|
||||||
|
$oCmd->ActiveConnection = $dbc;
|
||||||
|
$oCmd->CommandText = $sql;
|
||||||
|
$oCmd->CommandType = 1;
|
||||||
|
|
||||||
|
foreach($inputarr as $val) {
|
||||||
|
// name, type, direction 1 = input, len,
|
||||||
|
$this->adoParameterType = 130;
|
||||||
|
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
|
||||||
|
//print $p->Type.' '.$p->value;
|
||||||
|
$oCmd->Parameters->Append($p);
|
||||||
|
}
|
||||||
|
$p = false;
|
||||||
|
$rs = $oCmd->Execute();
|
||||||
|
$e = $dbc->Errors;
|
||||||
|
if ($dbc->Errors->Count > 0) return $false;
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
|
||||||
|
|
||||||
|
if ($dbc->Errors->Count > 0) return $false;
|
||||||
|
if (! $rs) return $false;
|
||||||
|
|
||||||
|
if ($rs->State == 0) {
|
||||||
|
$true = true;
|
||||||
|
return $true; // 0 = adStateClosed means no records returned
|
||||||
|
}
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
|
||||||
|
if (isset($this->_thisTransactions))
|
||||||
|
if (!$this->_thisTransactions) return false;
|
||||||
|
else {
|
||||||
|
$o = $this->_connectionID->Properties("Transaction DDL");
|
||||||
|
$this->_thisTransactions = $o ? true : false;
|
||||||
|
if (!$o) return false;
|
||||||
|
}
|
||||||
|
@$this->_connectionID->BeginTrans();
|
||||||
|
$this->transCnt += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
|
||||||
|
@$this->_connectionID->CommitTrans();
|
||||||
|
if ($this->transCnt) @$this->transCnt -= 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function RollbackTrans() {
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
@$this->_connectionID->RollbackTrans();
|
||||||
|
if ($this->transCnt) @$this->transCnt -= 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation */
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if (!$this->_connectionID) return "No connection established";
|
||||||
|
$errc = $this->_connectionID->Errors;
|
||||||
|
if (!$errc) return "No Errors object found";
|
||||||
|
if ($errc->Count == 0) return '';
|
||||||
|
$err = $errc->Item($errc->Count-1);
|
||||||
|
return $err->Description;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
$errc = $this->_connectionID->Errors;
|
||||||
|
if ($errc->Count == 0) return 0;
|
||||||
|
$err = $errc->Item($errc->Count-1);
|
||||||
|
return $err->NativeError;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
if ($this->_connectionID) $this->_connectionID->Close();
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_ado extends ADORecordSet {
|
||||||
|
|
||||||
|
var $bind = false;
|
||||||
|
var $databaseType = "ado";
|
||||||
|
var $dataProvider = "ado";
|
||||||
|
var $_tarr = false; // caches the types
|
||||||
|
var $_flds; // and field objects
|
||||||
|
var $canSeek = true;
|
||||||
|
var $hideErrors = true;
|
||||||
|
|
||||||
|
function ADORecordSet_ado($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
return $this->ADORecordSet($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns the field object
|
||||||
|
function FetchField($fieldOffset = -1) {
|
||||||
|
$off=$fieldOffset+1; // offsets begin at 1
|
||||||
|
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$f = $rs->Fields($fieldOffset);
|
||||||
|
$o->name = $f->Name;
|
||||||
|
$t = $f->Type;
|
||||||
|
$o->type = $this->MetaType($t);
|
||||||
|
$o->max_length = $f->DefinedSize;
|
||||||
|
$o->ado_type = $t;
|
||||||
|
|
||||||
|
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$this->_numOfRows = $rs->RecordCount;
|
||||||
|
|
||||||
|
$f = $rs->Fields;
|
||||||
|
$this->_numOfFields = $f->Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// should only be used to move forward as we normally use forward-only cursors
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
// absoluteposition doesn't work -- my maths is wrong ?
|
||||||
|
// $rs->AbsolutePosition->$row-2;
|
||||||
|
// return true;
|
||||||
|
if ($this->_currentRow > $row) return false;
|
||||||
|
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
OLEDB types
|
||||||
|
|
||||||
|
enum DBTYPEENUM
|
||||||
|
{ DBTYPE_EMPTY = 0,
|
||||||
|
DBTYPE_NULL = 1,
|
||||||
|
DBTYPE_I2 = 2,
|
||||||
|
DBTYPE_I4 = 3,
|
||||||
|
DBTYPE_R4 = 4,
|
||||||
|
DBTYPE_R8 = 5,
|
||||||
|
DBTYPE_CY = 6,
|
||||||
|
DBTYPE_DATE = 7,
|
||||||
|
DBTYPE_BSTR = 8,
|
||||||
|
DBTYPE_IDISPATCH = 9,
|
||||||
|
DBTYPE_ERROR = 10,
|
||||||
|
DBTYPE_BOOL = 11,
|
||||||
|
DBTYPE_VARIANT = 12,
|
||||||
|
DBTYPE_IUNKNOWN = 13,
|
||||||
|
DBTYPE_DECIMAL = 14,
|
||||||
|
DBTYPE_UI1 = 17,
|
||||||
|
DBTYPE_ARRAY = 0x2000,
|
||||||
|
DBTYPE_BYREF = 0x4000,
|
||||||
|
DBTYPE_I1 = 16,
|
||||||
|
DBTYPE_UI2 = 18,
|
||||||
|
DBTYPE_UI4 = 19,
|
||||||
|
DBTYPE_I8 = 20,
|
||||||
|
DBTYPE_UI8 = 21,
|
||||||
|
DBTYPE_GUID = 72,
|
||||||
|
DBTYPE_VECTOR = 0x1000,
|
||||||
|
DBTYPE_RESERVED = 0x8000,
|
||||||
|
DBTYPE_BYTES = 128,
|
||||||
|
DBTYPE_STR = 129,
|
||||||
|
DBTYPE_WSTR = 130,
|
||||||
|
DBTYPE_NUMERIC = 131,
|
||||||
|
DBTYPE_UDT = 132,
|
||||||
|
DBTYPE_DBDATE = 133,
|
||||||
|
DBTYPE_DBTIME = 134,
|
||||||
|
DBTYPE_DBTIMESTAMP = 135
|
||||||
|
|
||||||
|
ADO Types
|
||||||
|
|
||||||
|
adEmpty = 0,
|
||||||
|
adTinyInt = 16,
|
||||||
|
adSmallInt = 2,
|
||||||
|
adInteger = 3,
|
||||||
|
adBigInt = 20,
|
||||||
|
adUnsignedTinyInt = 17,
|
||||||
|
adUnsignedSmallInt = 18,
|
||||||
|
adUnsignedInt = 19,
|
||||||
|
adUnsignedBigInt = 21,
|
||||||
|
adSingle = 4,
|
||||||
|
adDouble = 5,
|
||||||
|
adCurrency = 6,
|
||||||
|
adDecimal = 14,
|
||||||
|
adNumeric = 131,
|
||||||
|
adBoolean = 11,
|
||||||
|
adError = 10,
|
||||||
|
adUserDefined = 132,
|
||||||
|
adVariant = 12,
|
||||||
|
adIDispatch = 9,
|
||||||
|
adIUnknown = 13,
|
||||||
|
adGUID = 72,
|
||||||
|
adDate = 7,
|
||||||
|
adDBDate = 133,
|
||||||
|
adDBTime = 134,
|
||||||
|
adDBTimeStamp = 135,
|
||||||
|
adBSTR = 8,
|
||||||
|
adChar = 129,
|
||||||
|
adVarChar = 200,
|
||||||
|
adLongVarChar = 201,
|
||||||
|
adWChar = 130,
|
||||||
|
adVarWChar = 202,
|
||||||
|
adLongVarWChar = 203,
|
||||||
|
adBinary = 128,
|
||||||
|
adVarBinary = 204,
|
||||||
|
adLongVarBinary = 205,
|
||||||
|
adChapter = 136,
|
||||||
|
adFileTime = 64,
|
||||||
|
adDBFileTime = 137,
|
||||||
|
adPropVariant = 138,
|
||||||
|
adVarNumeric = 139
|
||||||
|
*/
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_numeric($t)) return $t;
|
||||||
|
|
||||||
|
switch ($t) {
|
||||||
|
case 0:
|
||||||
|
case 12: // variant
|
||||||
|
case 8: // bstr
|
||||||
|
case 129: //char
|
||||||
|
case 130: //wc
|
||||||
|
case 200: // varc
|
||||||
|
case 202:// varWC
|
||||||
|
case 128: // bin
|
||||||
|
case 204: // varBin
|
||||||
|
case 72: // guid
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 201:
|
||||||
|
case 203:
|
||||||
|
return 'X';
|
||||||
|
case 128:
|
||||||
|
case 204:
|
||||||
|
case 205:
|
||||||
|
return 'B';
|
||||||
|
case 7:
|
||||||
|
case 133: return 'D';
|
||||||
|
|
||||||
|
case 134:
|
||||||
|
case 135: return 'T';
|
||||||
|
|
||||||
|
case 11: return 'L';
|
||||||
|
|
||||||
|
case 16:// adTinyInt = 16,
|
||||||
|
case 2://adSmallInt = 2,
|
||||||
|
case 3://adInteger = 3,
|
||||||
|
case 4://adBigInt = 20,
|
||||||
|
case 17://adUnsignedTinyInt = 17,
|
||||||
|
case 18://adUnsignedSmallInt = 18,
|
||||||
|
case 19://adUnsignedInt = 19,
|
||||||
|
case 20://adUnsignedBigInt = 21,
|
||||||
|
return 'I';
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// time stamp not supported yet
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
if (!$rs or $rs->EOF) {
|
||||||
|
$this->fields = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->fields = array();
|
||||||
|
|
||||||
|
if (!$this->_tarr) {
|
||||||
|
$tarr = array();
|
||||||
|
$flds = array();
|
||||||
|
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
$f = $rs->Fields($i);
|
||||||
|
$flds[] = $f;
|
||||||
|
$tarr[] = $f->Type;
|
||||||
|
}
|
||||||
|
// bind types and flds only once
|
||||||
|
$this->_tarr = $tarr;
|
||||||
|
$this->_flds = $flds;
|
||||||
|
}
|
||||||
|
$t = reset($this->_tarr);
|
||||||
|
$f = reset($this->_flds);
|
||||||
|
|
||||||
|
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
|
||||||
|
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
|
||||||
|
switch($t) {
|
||||||
|
case 135: // timestamp
|
||||||
|
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||||
|
else {
|
||||||
|
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
|
||||||
|
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
|
||||||
|
$val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
|
||||||
|
else
|
||||||
|
$val = $f->value;
|
||||||
|
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 133:// A date value (yyyymmdd)
|
||||||
|
if ($val = $f->value) {
|
||||||
|
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
|
||||||
|
} else
|
||||||
|
$this->fields[] = false;
|
||||||
|
break;
|
||||||
|
case 7: // adDate
|
||||||
|
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||||
|
else {
|
||||||
|
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
|
||||||
|
else $val = $f->value;
|
||||||
|
|
||||||
|
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
|
||||||
|
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1: // null
|
||||||
|
$this->fields[] = false;
|
||||||
|
break;
|
||||||
|
case 6: // currency is not supported properly;
|
||||||
|
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
|
||||||
|
$this->fields[] = (float) $f->value;
|
||||||
|
break;
|
||||||
|
case 11: //BIT;
|
||||||
|
$val = "";
|
||||||
|
if(is_bool($f->value)) {
|
||||||
|
if($f->value==true) $val = 1;
|
||||||
|
else $val = 0;
|
||||||
|
}
|
||||||
|
if(is_null($f->value)) $val = null;
|
||||||
|
|
||||||
|
$this->fields[] = $val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->fields[] = $f->value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//print " $f->value $t, ";
|
||||||
|
$f = next($this->_flds);
|
||||||
|
$t = next($this->_tarr);
|
||||||
|
} // for
|
||||||
|
if ($this->hideErrors) error_reporting($olde);
|
||||||
|
@$rs->MoveNext(); // @ needed for some versions of PHP!
|
||||||
|
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function NextRecordSet()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$this->_queryID = $rs->NextRecordSet();
|
||||||
|
//$this->_queryID = $this->_QueryId->NextRecordSet();
|
||||||
|
if ($this->_queryID == null) return false;
|
||||||
|
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
$this->_currentPage = -1;
|
||||||
|
$this->bind = false;
|
||||||
|
$this->fields = false;
|
||||||
|
$this->_flds = false;
|
||||||
|
$this->_tarr = false;
|
||||||
|
|
||||||
|
$this->_inited = false;
|
||||||
|
$this->Init();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close() {
|
||||||
|
$this->_flds = false;
|
||||||
|
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
|
||||||
|
$this->_queryID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
678
includes/adodb/drivers/adodb-ado5.inc.php
Normal file
678
includes/adodb/drivers/adodb-ado5.inc.php
Normal file
@ -0,0 +1,678 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
define("_ADODB_ADO_LAYER", 1 );
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_ado extends ADOConnection {
|
||||||
|
var $databaseType = "ado";
|
||||||
|
var $_bindInputArray = false;
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $dataProvider = "ado";
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
|
||||||
|
var $_affectedRows = false;
|
||||||
|
var $_thisTransactions;
|
||||||
|
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
|
||||||
|
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
|
||||||
|
var $_lock_type = -1;
|
||||||
|
var $_execute_option = -1;
|
||||||
|
var $poorAffectedRows = true;
|
||||||
|
var $charPage;
|
||||||
|
|
||||||
|
function ADODB_ado()
|
||||||
|
{
|
||||||
|
$this->_affectedRows = new VARIANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
|
||||||
|
return array('description' => $desc, 'version' => '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
if (PHP_VERSION >= 5) return $this->_affectedRows;
|
||||||
|
|
||||||
|
return $this->_affectedRows->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// you can also pass a connection string like this:
|
||||||
|
//
|
||||||
|
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '')
|
||||||
|
{
|
||||||
|
// two modes
|
||||||
|
// - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat
|
||||||
|
// - if $argProvider is not empty, then $argDBorProvider holds db
|
||||||
|
|
||||||
|
|
||||||
|
if ($argProvider) {
|
||||||
|
$argDatabasename = $argDBorProvider;
|
||||||
|
} else {
|
||||||
|
$argDatabasename = '';
|
||||||
|
if ($argDBorProvider) $argProvider = $argDBorProvider;
|
||||||
|
else $argProvider = 'MSDASQL';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
$u = 'UID';
|
||||||
|
$p = 'PWD';
|
||||||
|
|
||||||
|
if (!empty($this->charPage))
|
||||||
|
$dbc = new COM('ADODB.Connection',null,$this->charPage);
|
||||||
|
else
|
||||||
|
$dbc = new COM('ADODB.Connection');
|
||||||
|
|
||||||
|
if (! $dbc) return false;
|
||||||
|
|
||||||
|
/* special support if provider is mssql or access */
|
||||||
|
if ($argProvider=='mssql') {
|
||||||
|
$u = 'User Id'; //User parameter name for OLEDB
|
||||||
|
$p = 'Password';
|
||||||
|
$argProvider = "SQLOLEDB"; // SQL Server Provider
|
||||||
|
|
||||||
|
// not yet
|
||||||
|
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
|
||||||
|
|
||||||
|
//use trusted conection for SQL if username not specified
|
||||||
|
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
|
||||||
|
} else if ($argProvider=='access')
|
||||||
|
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
|
||||||
|
|
||||||
|
if ($argProvider) $dbc->Provider = $argProvider;
|
||||||
|
|
||||||
|
if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname";
|
||||||
|
|
||||||
|
|
||||||
|
if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename";
|
||||||
|
if ($argUsername) $argHostname .= ";$u=$argUsername";
|
||||||
|
if ($argPassword)$argHostname .= ";$p=$argPassword";
|
||||||
|
|
||||||
|
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
|
||||||
|
// @ added below for php 4.0.1 and earlier
|
||||||
|
@$dbc->Open((string) $argHostname);
|
||||||
|
|
||||||
|
$this->_connectionID = $dbc;
|
||||||
|
|
||||||
|
$dbc->CursorLocation = $this->_cursor_location;
|
||||||
|
return $dbc->State > 0;
|
||||||
|
} catch (exception $e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
|
||||||
|
{
|
||||||
|
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
adSchemaCatalogs = 1,
|
||||||
|
adSchemaCharacterSets = 2,
|
||||||
|
adSchemaCollations = 3,
|
||||||
|
adSchemaColumns = 4,
|
||||||
|
adSchemaCheckConstraints = 5,
|
||||||
|
adSchemaConstraintColumnUsage = 6,
|
||||||
|
adSchemaConstraintTableUsage = 7,
|
||||||
|
adSchemaKeyColumnUsage = 8,
|
||||||
|
adSchemaReferentialContraints = 9,
|
||||||
|
adSchemaTableConstraints = 10,
|
||||||
|
adSchemaColumnsDomainUsage = 11,
|
||||||
|
adSchemaIndexes = 12,
|
||||||
|
adSchemaColumnPrivileges = 13,
|
||||||
|
adSchemaTablePrivileges = 14,
|
||||||
|
adSchemaUsagePrivileges = 15,
|
||||||
|
adSchemaProcedures = 16,
|
||||||
|
adSchemaSchemata = 17,
|
||||||
|
adSchemaSQLLanguages = 18,
|
||||||
|
adSchemaStatistics = 19,
|
||||||
|
adSchemaTables = 20,
|
||||||
|
adSchemaTranslations = 21,
|
||||||
|
adSchemaProviderTypes = 22,
|
||||||
|
adSchemaViews = 23,
|
||||||
|
adSchemaViewColumnUsage = 24,
|
||||||
|
adSchemaViewTableUsage = 25,
|
||||||
|
adSchemaProcedureParameters = 26,
|
||||||
|
adSchemaForeignKeys = 27,
|
||||||
|
adSchemaPrimaryKeys = 28,
|
||||||
|
adSchemaProcedureColumns = 29,
|
||||||
|
adSchemaDBInfoKeywords = 30,
|
||||||
|
adSchemaDBInfoLiterals = 31,
|
||||||
|
adSchemaCubes = 32,
|
||||||
|
adSchemaDimensions = 33,
|
||||||
|
adSchemaHierarchies = 34,
|
||||||
|
adSchemaLevels = 35,
|
||||||
|
adSchemaMeasures = 36,
|
||||||
|
adSchemaProperties = 37,
|
||||||
|
adSchemaMembers = 38
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
$arr= array();
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
$adors=@$dbc->OpenSchema(20);//tables
|
||||||
|
if ($adors){
|
||||||
|
$f = $adors->Fields(2);//table/view name
|
||||||
|
$t = $adors->Fields(3);//table type
|
||||||
|
while (!$adors->EOF){
|
||||||
|
$tt=substr($t->value,0,6);
|
||||||
|
if ($tt!='SYSTEM' && $tt !='ACCESS')
|
||||||
|
$arr[]=$f->value;
|
||||||
|
//print $f->value . ' ' . $t->value.'<br>';
|
||||||
|
$adors->MoveNext();
|
||||||
|
}
|
||||||
|
$adors->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$table = strtoupper($table);
|
||||||
|
$arr= array();
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
$adors=@$dbc->OpenSchema(4);//tables
|
||||||
|
|
||||||
|
if ($adors){
|
||||||
|
$t = $adors->Fields(2);//table/view name
|
||||||
|
while (!$adors->EOF){
|
||||||
|
|
||||||
|
|
||||||
|
if (strtoupper($t->Value) == $table) {
|
||||||
|
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$c = $adors->Fields(3);
|
||||||
|
$fld->name = $c->Value;
|
||||||
|
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||||
|
$fld->max_length = -1;
|
||||||
|
$arr[strtoupper($fld->name)]=$fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
$adors->MoveNext();
|
||||||
|
}
|
||||||
|
$adors->Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns queryID or false */
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour...
|
||||||
|
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
// return rs
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
|
||||||
|
if ($inputarr) {
|
||||||
|
|
||||||
|
if (!empty($this->charPage))
|
||||||
|
$oCmd = new COM('ADODB.Command',null,$this->charPage);
|
||||||
|
else
|
||||||
|
$oCmd = new COM('ADODB.Command');
|
||||||
|
$oCmd->ActiveConnection = $dbc;
|
||||||
|
$oCmd->CommandText = $sql;
|
||||||
|
$oCmd->CommandType = 1;
|
||||||
|
|
||||||
|
foreach($inputarr as $val) {
|
||||||
|
// name, type, direction 1 = input, len,
|
||||||
|
$this->adoParameterType = 130;
|
||||||
|
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
|
||||||
|
//print $p->Type.' '.$p->value;
|
||||||
|
$oCmd->Parameters->Append($p);
|
||||||
|
}
|
||||||
|
$p = false;
|
||||||
|
$rs = $oCmd->Execute();
|
||||||
|
$e = $dbc->Errors;
|
||||||
|
if ($dbc->Errors->Count > 0) return $false;
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
|
||||||
|
|
||||||
|
if ($dbc->Errors->Count > 0) return $false;
|
||||||
|
if (! $rs) return $false;
|
||||||
|
|
||||||
|
if ($rs->State == 0) {
|
||||||
|
$true = true;
|
||||||
|
return $true; // 0 = adStateClosed means no records returned
|
||||||
|
}
|
||||||
|
return $rs;
|
||||||
|
|
||||||
|
} catch (exception $e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
|
||||||
|
if (isset($this->_thisTransactions))
|
||||||
|
if (!$this->_thisTransactions) return false;
|
||||||
|
else {
|
||||||
|
$o = $this->_connectionID->Properties("Transaction DDL");
|
||||||
|
$this->_thisTransactions = $o ? true : false;
|
||||||
|
if (!$o) return false;
|
||||||
|
}
|
||||||
|
@$this->_connectionID->BeginTrans();
|
||||||
|
$this->transCnt += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
|
||||||
|
@$this->_connectionID->CommitTrans();
|
||||||
|
if ($this->transCnt) @$this->transCnt -= 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function RollbackTrans() {
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
@$this->_connectionID->RollbackTrans();
|
||||||
|
if ($this->transCnt) @$this->transCnt -= 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation */
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if (!$this->_connectionID) return "No connection established";
|
||||||
|
$errmsg = '';
|
||||||
|
|
||||||
|
try {
|
||||||
|
$errc = $this->_connectionID->Errors;
|
||||||
|
if (!$errc) return "No Errors object found";
|
||||||
|
if ($errc->Count == 0) return '';
|
||||||
|
$err = $errc->Item($errc->Count-1);
|
||||||
|
$errmsg = $err->Description;
|
||||||
|
}catch(exception $e) {
|
||||||
|
}
|
||||||
|
return $errmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
$errc = $this->_connectionID->Errors;
|
||||||
|
if ($errc->Count == 0) return 0;
|
||||||
|
$err = $errc->Item($errc->Count-1);
|
||||||
|
return $err->NativeError;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
if ($this->_connectionID) $this->_connectionID->Close();
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_ado extends ADORecordSet {
|
||||||
|
|
||||||
|
var $bind = false;
|
||||||
|
var $databaseType = "ado";
|
||||||
|
var $dataProvider = "ado";
|
||||||
|
var $_tarr = false; // caches the types
|
||||||
|
var $_flds; // and field objects
|
||||||
|
var $canSeek = true;
|
||||||
|
var $hideErrors = true;
|
||||||
|
|
||||||
|
function ADORecordSet_ado($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
return $this->ADORecordSet($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns the field object
|
||||||
|
function FetchField($fieldOffset = -1) {
|
||||||
|
$off=$fieldOffset+1; // offsets begin at 1
|
||||||
|
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$f = $rs->Fields($fieldOffset);
|
||||||
|
$o->name = $f->Name;
|
||||||
|
$t = $f->Type;
|
||||||
|
$o->type = $this->MetaType($t);
|
||||||
|
$o->max_length = $f->DefinedSize;
|
||||||
|
$o->ado_type = $t;
|
||||||
|
|
||||||
|
|
||||||
|
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$this->_numOfRows = $rs->RecordCount;
|
||||||
|
|
||||||
|
$f = $rs->Fields;
|
||||||
|
$this->_numOfFields = $f->Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// should only be used to move forward as we normally use forward-only cursors
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
// absoluteposition doesn't work -- my maths is wrong ?
|
||||||
|
// $rs->AbsolutePosition->$row-2;
|
||||||
|
// return true;
|
||||||
|
if ($this->_currentRow > $row) return false;
|
||||||
|
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
OLEDB types
|
||||||
|
|
||||||
|
enum DBTYPEENUM
|
||||||
|
{ DBTYPE_EMPTY = 0,
|
||||||
|
DBTYPE_NULL = 1,
|
||||||
|
DBTYPE_I2 = 2,
|
||||||
|
DBTYPE_I4 = 3,
|
||||||
|
DBTYPE_R4 = 4,
|
||||||
|
DBTYPE_R8 = 5,
|
||||||
|
DBTYPE_CY = 6,
|
||||||
|
DBTYPE_DATE = 7,
|
||||||
|
DBTYPE_BSTR = 8,
|
||||||
|
DBTYPE_IDISPATCH = 9,
|
||||||
|
DBTYPE_ERROR = 10,
|
||||||
|
DBTYPE_BOOL = 11,
|
||||||
|
DBTYPE_VARIANT = 12,
|
||||||
|
DBTYPE_IUNKNOWN = 13,
|
||||||
|
DBTYPE_DECIMAL = 14,
|
||||||
|
DBTYPE_UI1 = 17,
|
||||||
|
DBTYPE_ARRAY = 0x2000,
|
||||||
|
DBTYPE_BYREF = 0x4000,
|
||||||
|
DBTYPE_I1 = 16,
|
||||||
|
DBTYPE_UI2 = 18,
|
||||||
|
DBTYPE_UI4 = 19,
|
||||||
|
DBTYPE_I8 = 20,
|
||||||
|
DBTYPE_UI8 = 21,
|
||||||
|
DBTYPE_GUID = 72,
|
||||||
|
DBTYPE_VECTOR = 0x1000,
|
||||||
|
DBTYPE_RESERVED = 0x8000,
|
||||||
|
DBTYPE_BYTES = 128,
|
||||||
|
DBTYPE_STR = 129,
|
||||||
|
DBTYPE_WSTR = 130,
|
||||||
|
DBTYPE_NUMERIC = 131,
|
||||||
|
DBTYPE_UDT = 132,
|
||||||
|
DBTYPE_DBDATE = 133,
|
||||||
|
DBTYPE_DBTIME = 134,
|
||||||
|
DBTYPE_DBTIMESTAMP = 135
|
||||||
|
|
||||||
|
ADO Types
|
||||||
|
|
||||||
|
adEmpty = 0,
|
||||||
|
adTinyInt = 16,
|
||||||
|
adSmallInt = 2,
|
||||||
|
adInteger = 3,
|
||||||
|
adBigInt = 20,
|
||||||
|
adUnsignedTinyInt = 17,
|
||||||
|
adUnsignedSmallInt = 18,
|
||||||
|
adUnsignedInt = 19,
|
||||||
|
adUnsignedBigInt = 21,
|
||||||
|
adSingle = 4,
|
||||||
|
adDouble = 5,
|
||||||
|
adCurrency = 6,
|
||||||
|
adDecimal = 14,
|
||||||
|
adNumeric = 131,
|
||||||
|
adBoolean = 11,
|
||||||
|
adError = 10,
|
||||||
|
adUserDefined = 132,
|
||||||
|
adVariant = 12,
|
||||||
|
adIDispatch = 9,
|
||||||
|
adIUnknown = 13,
|
||||||
|
adGUID = 72,
|
||||||
|
adDate = 7,
|
||||||
|
adDBDate = 133,
|
||||||
|
adDBTime = 134,
|
||||||
|
adDBTimeStamp = 135,
|
||||||
|
adBSTR = 8,
|
||||||
|
adChar = 129,
|
||||||
|
adVarChar = 200,
|
||||||
|
adLongVarChar = 201,
|
||||||
|
adWChar = 130,
|
||||||
|
adVarWChar = 202,
|
||||||
|
adLongVarWChar = 203,
|
||||||
|
adBinary = 128,
|
||||||
|
adVarBinary = 204,
|
||||||
|
adLongVarBinary = 205,
|
||||||
|
adChapter = 136,
|
||||||
|
adFileTime = 64,
|
||||||
|
adDBFileTime = 137,
|
||||||
|
adPropVariant = 138,
|
||||||
|
adVarNumeric = 139
|
||||||
|
*/
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_numeric($t)) return $t;
|
||||||
|
|
||||||
|
switch ($t) {
|
||||||
|
case 0:
|
||||||
|
case 12: // variant
|
||||||
|
case 8: // bstr
|
||||||
|
case 129: //char
|
||||||
|
case 130: //wc
|
||||||
|
case 200: // varc
|
||||||
|
case 202:// varWC
|
||||||
|
case 128: // bin
|
||||||
|
case 204: // varBin
|
||||||
|
case 72: // guid
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 201:
|
||||||
|
case 203:
|
||||||
|
return 'X';
|
||||||
|
case 128:
|
||||||
|
case 204:
|
||||||
|
case 205:
|
||||||
|
return 'B';
|
||||||
|
case 7:
|
||||||
|
case 133: return 'D';
|
||||||
|
|
||||||
|
case 134:
|
||||||
|
case 135: return 'T';
|
||||||
|
|
||||||
|
case 11: return 'L';
|
||||||
|
|
||||||
|
case 16:// adTinyInt = 16,
|
||||||
|
case 2://adSmallInt = 2,
|
||||||
|
case 3://adInteger = 3,
|
||||||
|
case 4://adBigInt = 20,
|
||||||
|
case 17://adUnsignedTinyInt = 17,
|
||||||
|
case 18://adUnsignedSmallInt = 18,
|
||||||
|
case 19://adUnsignedInt = 19,
|
||||||
|
case 20://adUnsignedBigInt = 21,
|
||||||
|
return 'I';
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// time stamp not supported yet
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
if (!$rs or $rs->EOF) {
|
||||||
|
$this->fields = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->fields = array();
|
||||||
|
|
||||||
|
if (!$this->_tarr) {
|
||||||
|
$tarr = array();
|
||||||
|
$flds = array();
|
||||||
|
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
$f = $rs->Fields($i);
|
||||||
|
$flds[] = $f;
|
||||||
|
$tarr[] = $f->Type;
|
||||||
|
}
|
||||||
|
// bind types and flds only once
|
||||||
|
$this->_tarr = $tarr;
|
||||||
|
$this->_flds = $flds;
|
||||||
|
}
|
||||||
|
$t = reset($this->_tarr);
|
||||||
|
$f = reset($this->_flds);
|
||||||
|
|
||||||
|
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
|
||||||
|
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
|
||||||
|
switch($t) {
|
||||||
|
case 135: // timestamp
|
||||||
|
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||||
|
else {
|
||||||
|
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
|
||||||
|
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
|
||||||
|
$val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
|
||||||
|
else
|
||||||
|
$val = $f->value;
|
||||||
|
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 133:// A date value (yyyymmdd)
|
||||||
|
if ($val = $f->value) {
|
||||||
|
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
|
||||||
|
} else
|
||||||
|
$this->fields[] = false;
|
||||||
|
break;
|
||||||
|
case 7: // adDate
|
||||||
|
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||||
|
else {
|
||||||
|
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
|
||||||
|
else $val = $f->value;
|
||||||
|
|
||||||
|
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
|
||||||
|
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1: // null
|
||||||
|
$this->fields[] = false;
|
||||||
|
break;
|
||||||
|
case 6: // currency is not supported properly;
|
||||||
|
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
|
||||||
|
$this->fields[] = (float) $f->value;
|
||||||
|
break;
|
||||||
|
case 11: //BIT;
|
||||||
|
$val = "";
|
||||||
|
if(is_bool($f->value)) {
|
||||||
|
if($f->value==true) $val = 1;
|
||||||
|
else $val = 0;
|
||||||
|
}
|
||||||
|
if(is_null($f->value)) $val = null;
|
||||||
|
|
||||||
|
$this->fields[] = $val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->fields[] = $f->value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//print " $f->value $t, ";
|
||||||
|
$f = next($this->_flds);
|
||||||
|
$t = next($this->_tarr);
|
||||||
|
} // for
|
||||||
|
if ($this->hideErrors) error_reporting($olde);
|
||||||
|
@$rs->MoveNext(); // @ needed for some versions of PHP!
|
||||||
|
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function NextRecordSet()
|
||||||
|
{
|
||||||
|
$rs = $this->_queryID;
|
||||||
|
$this->_queryID = $rs->NextRecordSet();
|
||||||
|
//$this->_queryID = $this->_QueryId->NextRecordSet();
|
||||||
|
if ($this->_queryID == null) return false;
|
||||||
|
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
$this->_currentPage = -1;
|
||||||
|
$this->bind = false;
|
||||||
|
$this->fields = false;
|
||||||
|
$this->_flds = false;
|
||||||
|
$this->_tarr = false;
|
||||||
|
|
||||||
|
$this->_inited = false;
|
||||||
|
$this->Init();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close() {
|
||||||
|
$this->_flds = false;
|
||||||
|
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
|
||||||
|
$this->_queryID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
55
includes/adodb/drivers/adodb-ado_access.inc.php
Normal file
55
includes/adodb/drivers/adodb-ado_access.inc.php
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft Access ADO data driver. Requires ADO and ODBC. Works only on MS Windows.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ADO_LAYER')) {
|
||||||
|
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
|
||||||
|
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADODB_ado_access extends ADODB_ado {
|
||||||
|
var $databaseType = 'ado_access';
|
||||||
|
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||||
|
var $fmtDate = "#Y-m-d#";
|
||||||
|
var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma
|
||||||
|
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||||
|
var $sysTimeStamp = 'NOW';
|
||||||
|
var $hasTransactions = false;
|
||||||
|
var $upperCase = 'ucase';
|
||||||
|
|
||||||
|
function ADODB_ado_access()
|
||||||
|
{
|
||||||
|
$this->ADODB_ado();
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans() { return false;}
|
||||||
|
|
||||||
|
function CommitTrans() { return false;}
|
||||||
|
|
||||||
|
function RollbackTrans() { return false;}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_ado_access extends ADORecordSet_ado {
|
||||||
|
|
||||||
|
var $databaseType = "ado_access";
|
||||||
|
|
||||||
|
function ADORecordSet_ado_access($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_ado($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
154
includes/adodb/drivers/adodb-ado_mssql.inc.php
Normal file
154
includes/adodb/drivers/adodb-ado_mssql.inc.php
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client.
|
||||||
|
Works only on MS Windows.
|
||||||
|
|
||||||
|
Warning: Some versions of PHP (esp PHP4) leak memory when ADO/COM is used.
|
||||||
|
Please check http://bugs.php.net/ for more info.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ADO_LAYER')) {
|
||||||
|
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
|
||||||
|
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_ado_mssql extends ADODB_ado {
|
||||||
|
var $databaseType = 'ado_mssql';
|
||||||
|
var $hasTop = 'top';
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||||
|
var $sysTimeStamp = 'GetDate()';
|
||||||
|
var $leftOuter = '*=';
|
||||||
|
var $rightOuter = '=*';
|
||||||
|
var $ansiOuter = true; // for mssql7 or later
|
||||||
|
var $substr = "substring";
|
||||||
|
var $length = 'len';
|
||||||
|
var $_dropSeqSQL = "drop table %s";
|
||||||
|
|
||||||
|
//var $_inTransaction = 1; // always open recordsets, so no transaction problems.
|
||||||
|
|
||||||
|
function ADODB_ado_mssql()
|
||||||
|
{
|
||||||
|
$this->ADODB_ado();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return $this->GetOne('select SCOPE_IDENTITY()');
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return $this->GetOne('select @@rowcount');
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function qstr($s,$magic_quotes=false)
|
||||||
|
{
|
||||||
|
$s = ADOConnection::qstr($s, $magic_quotes);
|
||||||
|
return str_replace("\0", "\\\\000", $s);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$table = strtoupper($table);
|
||||||
|
$arr= array();
|
||||||
|
$dbc = $this->_connectionID;
|
||||||
|
|
||||||
|
$osoptions = array();
|
||||||
|
$osoptions[0] = null;
|
||||||
|
$osoptions[1] = null;
|
||||||
|
$osoptions[2] = $table;
|
||||||
|
$osoptions[3] = null;
|
||||||
|
|
||||||
|
$adors=@$dbc->OpenSchema(4, $osoptions);//tables
|
||||||
|
|
||||||
|
if ($adors){
|
||||||
|
while (!$adors->EOF){
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$c = $adors->Fields(3);
|
||||||
|
$fld->name = $c->Value;
|
||||||
|
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||||
|
$fld->max_length = -1;
|
||||||
|
$arr[strtoupper($fld->name)]=$fld;
|
||||||
|
|
||||||
|
$adors->MoveNext();
|
||||||
|
}
|
||||||
|
$adors->Close();
|
||||||
|
}
|
||||||
|
$false = false;
|
||||||
|
return empty($arr) ? $false : $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateSequence($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->Execute('BEGIN TRANSACTION adodbseq');
|
||||||
|
$start -= 1;
|
||||||
|
$this->Execute("create table $seq (id float(53))");
|
||||||
|
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||||
|
if (!$ok) {
|
||||||
|
$this->Execute('ROLLBACK TRANSACTION adodbseq');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
//$this->debug=1;
|
||||||
|
$this->Execute('BEGIN TRANSACTION adodbseq');
|
||||||
|
$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
|
||||||
|
if (!$ok) {
|
||||||
|
$this->Execute("create table $seq (id float(53))");
|
||||||
|
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||||
|
if (!$ok) {
|
||||||
|
$this->Execute('ROLLBACK TRANSACTION adodbseq');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||||
|
return $start;
|
||||||
|
}
|
||||||
|
$num = $this->GetOne("select id from $seq");
|
||||||
|
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||||
|
return $num;
|
||||||
|
|
||||||
|
// in old implementation, pre 1.90, we returned GUID...
|
||||||
|
//return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'");
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end class
|
||||||
|
|
||||||
|
class ADORecordSet_ado_mssql extends ADORecordSet_ado {
|
||||||
|
|
||||||
|
var $databaseType = 'ado_mssql';
|
||||||
|
|
||||||
|
function ADORecordSet_ado_mssql($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_ado($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
92
includes/adodb/drivers/adodb-borland_ibase.inc.php
Normal file
92
includes/adodb/drivers/adodb-borland_ibase.inc.php
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Support Borland Interbase 6.5 and later
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
|
||||||
|
|
||||||
|
class ADODB_borland_ibase extends ADODB_ibase {
|
||||||
|
var $databaseType = "borland_ibase";
|
||||||
|
|
||||||
|
|
||||||
|
function ADODB_borland_ibase()
|
||||||
|
{
|
||||||
|
$this->ADODB_ibase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->autoCommit = false;
|
||||||
|
$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
|
||||||
|
return $this->_transactionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['dialect'] = $this->dialect;
|
||||||
|
switch($arr['dialect']) {
|
||||||
|
case '':
|
||||||
|
case '1': $s = 'Interbase 6.5, Dialect 1'; break;
|
||||||
|
case '2': $s = 'Interbase 6.5, Dialect 2'; break;
|
||||||
|
default:
|
||||||
|
case '3': $s = 'Interbase 6.5, Dialect 3'; break;
|
||||||
|
}
|
||||||
|
$arr['version'] = '6.5';
|
||||||
|
$arr['description'] = $s;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that Interbase 6.5 uses ROWS instead - don't you love forking wars!
|
||||||
|
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
|
||||||
|
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
|
||||||
|
// Firebird uses
|
||||||
|
// SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
if ($nrows > 0) {
|
||||||
|
if ($offset <= 0) $str = " ROWS $nrows ";
|
||||||
|
else {
|
||||||
|
$a = $offset+1;
|
||||||
|
$b = $offset+$nrows;
|
||||||
|
$str = " ROWS $a TO $b";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// ok, skip
|
||||||
|
$a = $offset + 1;
|
||||||
|
$str = " ROWS $a TO 999999999"; // 999 million
|
||||||
|
}
|
||||||
|
$sql .= $str;
|
||||||
|
|
||||||
|
return ($secs2cache) ?
|
||||||
|
$this->CacheExecute($secs2cache,$sql,$inputarr)
|
||||||
|
:
|
||||||
|
$this->Execute($sql,$inputarr);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_borland_ibase extends ADORecordSet_ibase {
|
||||||
|
|
||||||
|
var $databaseType = "borland_ibase";
|
||||||
|
|
||||||
|
function ADORecordSet_borland_ibase($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_ibase($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
207
includes/adodb/drivers/adodb-csv.inc.php
Normal file
207
includes/adodb/drivers/adodb-csv.inc.php
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
Currently unsupported: MetaDatabases, MetaTables and MetaColumns, and also inputarr in Execute.
|
||||||
|
Native types have been converted to MetaTypes.
|
||||||
|
Transactions not supported yet.
|
||||||
|
|
||||||
|
Limitation of url length. For IIS, see MaxClientRequestBuffer registry value.
|
||||||
|
|
||||||
|
http://support.microsoft.com/default.aspx?scid=kb;en-us;260694
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (! defined("_ADODB_CSV_LAYER")) {
|
||||||
|
define("_ADODB_CSV_LAYER", 1 );
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
|
||||||
|
|
||||||
|
class ADODB_csv extends ADOConnection {
|
||||||
|
var $databaseType = 'csv';
|
||||||
|
var $databaseProvider = 'csv';
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $_affectedrows=0;
|
||||||
|
var $_insertid=0;
|
||||||
|
var $_url;
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $hasTransactions = false;
|
||||||
|
var $_errorNo = false;
|
||||||
|
|
||||||
|
function ADODB_csv()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return $this->_insertid;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return $this->_affectedrows;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaDatabases()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
|
||||||
|
$this->_url = $argHostname;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
|
||||||
|
$this->_url = $argHostname;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// parameters use PostgreSQL convention, not MySQL
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=".
|
||||||
|
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE).
|
||||||
|
"&offset=$offset";
|
||||||
|
$err = false;
|
||||||
|
$rs = csv2rs($url,$err,false);
|
||||||
|
|
||||||
|
if ($this->debug) print "$url<br><i>$err</i><br>";
|
||||||
|
|
||||||
|
$at = strpos($err,'::::');
|
||||||
|
if ($at === false) {
|
||||||
|
$this->_errorMsg = $err;
|
||||||
|
$this->_errorNo = (integer)$err;
|
||||||
|
} else {
|
||||||
|
$this->_errorMsg = substr($err,$at+4,1024);
|
||||||
|
$this->_errorNo = -9999;
|
||||||
|
}
|
||||||
|
if ($this->_errorNo)
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,'');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_object($rs)) {
|
||||||
|
|
||||||
|
$rs->databaseType='csv';
|
||||||
|
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
|
||||||
|
$rs->connection = $this;
|
||||||
|
}
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns queryID or false
|
||||||
|
function _Execute($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
if (!$this->_bindInputArray && $inputarr) {
|
||||||
|
$sqlarr = explode('?',$sql);
|
||||||
|
$sql = '';
|
||||||
|
$i = 0;
|
||||||
|
foreach($inputarr as $v) {
|
||||||
|
|
||||||
|
$sql .= $sqlarr[$i];
|
||||||
|
if (gettype($v) == 'string')
|
||||||
|
$sql .= $this->qstr($v);
|
||||||
|
else if ($v === null)
|
||||||
|
$sql .= 'NULL';
|
||||||
|
else
|
||||||
|
$sql .= $v;
|
||||||
|
$i += 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
$sql .= $sqlarr[$i];
|
||||||
|
if ($i+1 != sizeof($sqlarr))
|
||||||
|
print "Input Array does not match ?: ".htmlspecialchars($sql);
|
||||||
|
$inputarr = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = $this->_url.'?sql='.urlencode($sql)."&fetch=".
|
||||||
|
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE);
|
||||||
|
$err = false;
|
||||||
|
|
||||||
|
|
||||||
|
$rs = csv2rs($url,$err,false);
|
||||||
|
if ($this->debug) print urldecode($url)."<br><i>$err</i><br>";
|
||||||
|
$at = strpos($err,'::::');
|
||||||
|
if ($at === false) {
|
||||||
|
$this->_errorMsg = $err;
|
||||||
|
$this->_errorNo = (integer)$err;
|
||||||
|
} else {
|
||||||
|
$this->_errorMsg = substr($err,$at+4,1024);
|
||||||
|
$this->_errorNo = -9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_errorNo)
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr);
|
||||||
|
}
|
||||||
|
if (is_object($rs)) {
|
||||||
|
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$this->_affectedrows = $rs->affectedrows;
|
||||||
|
$this->_insertid = $rs->insertid;
|
||||||
|
$rs->databaseType='csv';
|
||||||
|
$rs->connection = $this;
|
||||||
|
}
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation */
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error number from previous database operation */
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
return $this->_errorNo;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} // class
|
||||||
|
|
||||||
|
class ADORecordset_csv extends ADORecordset {
|
||||||
|
function ADORecordset_csv($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // define
|
||||||
|
|
||||||
|
?>
|
828
includes/adodb/drivers/adodb-db2.inc.php
Normal file
828
includes/adodb/drivers/adodb-db2.inc.php
Normal file
@ -0,0 +1,828 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2006 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
|
||||||
|
This is a version of the ADODB driver for DB2. It uses the 'ibm_db2' PECL extension
|
||||||
|
for PHP (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2 or
|
||||||
|
higher.
|
||||||
|
|
||||||
|
Originally tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
|
||||||
|
More recently tested with PHP 5.1.2 and Apache 2.0.55 on Windows XP SP2.
|
||||||
|
|
||||||
|
This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard#rogers.com".
|
||||||
|
I ripped out what I believed to be a lot of redundant or obsolete code, but there are
|
||||||
|
probably still some remnants of the ODBC support in this file; I'm relying on reviewers
|
||||||
|
of this code to point out any other things that can be removed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
define("_ADODB_DB2_LAYER", 2 );
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_db2 extends ADOConnection {
|
||||||
|
var $databaseType = "db2";
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $concat_operator = '||';
|
||||||
|
|
||||||
|
var $sysTime = 'CURRENT TIME';
|
||||||
|
var $sysDate = 'CURRENT DATE';
|
||||||
|
var $sysTimeStamp = 'CURRENT TIMESTAMP';
|
||||||
|
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $dataProvider = "db2";
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
|
||||||
|
var $binmode = DB2_BINARY;
|
||||||
|
|
||||||
|
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
|
||||||
|
// breaking backward-compat
|
||||||
|
var $_bindInputArray = false;
|
||||||
|
var $_genIDSQL = "VALUES NEXTVAL FOR %s";
|
||||||
|
var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s NO MAXVALUE NO CYCLE";
|
||||||
|
var $_dropSeqSQL = "DROP SEQUENCE %s";
|
||||||
|
var $_autocommit = true;
|
||||||
|
var $_haserrorfunctions = true;
|
||||||
|
var $_lastAffectedRows = 0;
|
||||||
|
var $uCaseTables = true; // for meta* functions, uppercase table names
|
||||||
|
var $hasInsertID = true;
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return ADOConnection::GetOne('VALUES IDENTITY_VAL_LOCAL()');
|
||||||
|
}
|
||||||
|
|
||||||
|
function ADODB_db2()
|
||||||
|
{
|
||||||
|
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
if (!function_exists('db2_connect')) {
|
||||||
|
ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// This needs to be set before the connect().
|
||||||
|
// Replaces the odbc_binmode() call that was in Execute()
|
||||||
|
ini_set('ibm_db2.binmode', $this->binmode);
|
||||||
|
|
||||||
|
if ($argDatabasename) {
|
||||||
|
$this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
|
||||||
|
} else {
|
||||||
|
$this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword);
|
||||||
|
}
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
|
||||||
|
// For db2_connect(), there is an optional 4th arg. If present, it must be
|
||||||
|
// an array of valid options. So far, we don't use them.
|
||||||
|
|
||||||
|
$this->_errorMsg = @db2_conn_errormsg();
|
||||||
|
|
||||||
|
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||||
|
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
if (!function_exists('db2_connect')) return null;
|
||||||
|
|
||||||
|
// This needs to be set before the connect().
|
||||||
|
// Replaces the odbc_binmode() call that was in Execute()
|
||||||
|
ini_set('ibm_db2.binmode', $this->binmode);
|
||||||
|
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
|
||||||
|
if ($argDatabasename) {
|
||||||
|
$this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
|
||||||
|
} else {
|
||||||
|
$this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword);
|
||||||
|
}
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
|
||||||
|
$this->_errorMsg = @db2_conn_errormsg();
|
||||||
|
if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
|
||||||
|
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||||
|
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// format and return date string in database timestamp format
|
||||||
|
function DBTimeStamp($ts)
|
||||||
|
{
|
||||||
|
if (empty($ts) && $ts !== 0) return 'null';
|
||||||
|
if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
|
||||||
|
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
// use right() and replace() ?
|
||||||
|
if (!$col) $col = $this->sysDate;
|
||||||
|
|
||||||
|
/* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */
|
||||||
|
if ($fmt== 'Y-m-d H:i:s')
|
||||||
|
return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')";
|
||||||
|
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= $this->concat_operator;
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
if ($len==1) return "year($col)";
|
||||||
|
$s .= "char(year($col))";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
if ($len==1) return "monthname($col)";
|
||||||
|
$s .= "substr(monthname($col),1,3)";
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if ($len==1) return "month($col)";
|
||||||
|
$s .= "right(digits(month($col)),2)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
if ($len==1) return "day($col)";
|
||||||
|
$s .= "right(digits(day($col)),2)";
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
if ($len==1) return "hour($col)";
|
||||||
|
if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
case 'I':
|
||||||
|
if ($len==1) return "minute($col)";
|
||||||
|
if ($col != $this->sysDate)
|
||||||
|
$s .= "right(digits(minute($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
case 's':
|
||||||
|
if ($len==1) return "second($col)";
|
||||||
|
if ($col != $this->sysDate)
|
||||||
|
$s .= "right(digits(second($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
|
||||||
|
$dsn = strtoupper($this->host);
|
||||||
|
$first = true;
|
||||||
|
$found = false;
|
||||||
|
|
||||||
|
if (!function_exists('db2_data_source')) return false;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
$rez = @db2_data_source($this->_connectionID,
|
||||||
|
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
|
||||||
|
$first = false;
|
||||||
|
if (!is_array($rez)) break;
|
||||||
|
if (strtoupper($rez['server']) == $dsn) {
|
||||||
|
$found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$found) return ADOConnection::ServerInfo();
|
||||||
|
if (!isset($rez['version'])) $rez['version'] = '';
|
||||||
|
return $rez;
|
||||||
|
} else {
|
||||||
|
return ADOConnection::ServerInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start));
|
||||||
|
if (!$ok) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropSequence($seqname)
|
||||||
|
{
|
||||||
|
if (empty($this->_dropSeqSQL)) return false;
|
||||||
|
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This algorithm is not very efficient, but works even if table locking
|
||||||
|
is not available.
|
||||||
|
|
||||||
|
Will return false if unable to generate an ID after $MAXLOOPS attempts.
|
||||||
|
*/
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
// if you have to modify the parameter below, your database is overloaded,
|
||||||
|
// or you need to implement generation of id's yourself!
|
||||||
|
$num = $this->GetOne("VALUES NEXTVAL FOR $seq");
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||||
|
if (empty($this->_connectionID)) return @db2_conn_errormsg();
|
||||||
|
return @db2_conn_errormsg($this->_connectionID);
|
||||||
|
} else return ADOConnection::ErrorMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
if ($this->_errorCode !== false) {
|
||||||
|
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||||
|
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->_connectionID)) $e = @db2_conn_error();
|
||||||
|
else $e = @db2_conn_error($this->_connectionID);
|
||||||
|
|
||||||
|
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||||
|
// so we check and patch
|
||||||
|
if (strlen($e)<=2) return 0;
|
||||||
|
return $e;
|
||||||
|
} else return ADOConnection::ErrorNo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->_autocommit = false;
|
||||||
|
return db2_autocommit($this->_connectionID,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
$ret = db2_commit($this->_connectionID);
|
||||||
|
db2_autocommit($this->_connectionID,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
$ret = db2_rollback($this->_connectionID);
|
||||||
|
db2_autocommit($this->_connectionID,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
if ($this->uCaseTables) $table = strtoupper($table);
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = @db2_primarykeys($this->_connectionID,'',$schema,$table);
|
||||||
|
|
||||||
|
if (!$qid) {
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$rs = new ADORecordSet_db2($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs) return false;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
$rs->Close();
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
if ($this->uCaseTables) $table = strtoupper($table);
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table);
|
||||||
|
if (!$qid) {
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$rs = new ADORecordSet_db2($qid);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
/*
|
||||||
|
$rs->fields indices
|
||||||
|
0 PKTABLE_CAT
|
||||||
|
1 PKTABLE_SCHEM
|
||||||
|
2 PKTABLE_NAME
|
||||||
|
3 PKCOLUMN_NAME
|
||||||
|
4 FKTABLE_CAT
|
||||||
|
5 FKTABLE_SCHEM
|
||||||
|
6 FKTABLE_NAME
|
||||||
|
7 FKCOLUMN_NAME
|
||||||
|
*/
|
||||||
|
if (!$rs) return false;
|
||||||
|
|
||||||
|
$foreign_keys = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||||
|
if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]]))
|
||||||
|
$foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array();
|
||||||
|
$foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3];
|
||||||
|
}
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
return $foreign_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$schema=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = db2_tables($this->_connectionID);
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_db2($qid);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
if (!$rs) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
$arr2 = array();
|
||||||
|
|
||||||
|
if ($ttype) {
|
||||||
|
$isview = strncmp($ttype,'V',1) === 0;
|
||||||
|
}
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if (!$arr[$i][2]) continue;
|
||||||
|
$type = $arr[$i][3];
|
||||||
|
$schemaval = ($schema) ? $arr[$i][1].'.' : '';
|
||||||
|
if ($ttype) {
|
||||||
|
if ($isview) {
|
||||||
|
if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||||
|
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||||
|
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp
|
||||||
|
/ SQL data type codes /
|
||||||
|
#define SQL_UNKNOWN_TYPE 0
|
||||||
|
#define SQL_CHAR 1
|
||||||
|
#define SQL_NUMERIC 2
|
||||||
|
#define SQL_DECIMAL 3
|
||||||
|
#define SQL_INTEGER 4
|
||||||
|
#define SQL_SMALLINT 5
|
||||||
|
#define SQL_FLOAT 6
|
||||||
|
#define SQL_REAL 7
|
||||||
|
#define SQL_DOUBLE 8
|
||||||
|
#if (DB2VER >= 0x0300)
|
||||||
|
#define SQL_DATETIME 9
|
||||||
|
#endif
|
||||||
|
#define SQL_VARCHAR 12
|
||||||
|
|
||||||
|
|
||||||
|
/ One-parameter shortcuts for date/time data types /
|
||||||
|
#if (DB2VER >= 0x0300)
|
||||||
|
#define SQL_TYPE_DATE 91
|
||||||
|
#define SQL_TYPE_TIME 92
|
||||||
|
#define SQL_TYPE_TIMESTAMP 93
|
||||||
|
|
||||||
|
#define SQL_UNICODE (-95)
|
||||||
|
#define SQL_UNICODE_VARCHAR (-96)
|
||||||
|
#define SQL_UNICODE_LONGVARCHAR (-97)
|
||||||
|
*/
|
||||||
|
function DB2Types($t)
|
||||||
|
{
|
||||||
|
switch ((integer)$t) {
|
||||||
|
case 1:
|
||||||
|
case 12:
|
||||||
|
case 0:
|
||||||
|
case -95:
|
||||||
|
case -96:
|
||||||
|
return 'C';
|
||||||
|
case -97:
|
||||||
|
case -1: //text
|
||||||
|
return 'X';
|
||||||
|
case -4: //image
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
case 91:
|
||||||
|
return 'D';
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
case 11:
|
||||||
|
case 92:
|
||||||
|
case 93:
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case -6:
|
||||||
|
return 'I';
|
||||||
|
|
||||||
|
case -11: // uniqidentifier
|
||||||
|
return 'R';
|
||||||
|
case -7: //bit
|
||||||
|
return 'L';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
if ($this->uCaseTables) $table = strtoupper($table);
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
|
||||||
|
$colname = "%";
|
||||||
|
$qid = db2_columns($this->_connectionID, "", $schema, $table, $colname);
|
||||||
|
if (empty($qid)) return $false;
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_db2($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs) return $false;
|
||||||
|
$rs->_fetch();
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
$rs->fields indices
|
||||||
|
0 TABLE_QUALIFIER
|
||||||
|
1 TABLE_SCHEM
|
||||||
|
2 TABLE_NAME
|
||||||
|
3 COLUMN_NAME
|
||||||
|
4 DATA_TYPE
|
||||||
|
5 TYPE_NAME
|
||||||
|
6 PRECISION
|
||||||
|
7 LENGTH
|
||||||
|
8 SCALE
|
||||||
|
9 RADIX
|
||||||
|
10 NULLABLE
|
||||||
|
11 REMARKS
|
||||||
|
*/
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[3];
|
||||||
|
$fld->type = $this->DB2Types($rs->fields[4]);
|
||||||
|
|
||||||
|
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
|
||||||
|
// access uses precision to store length for char/varchar
|
||||||
|
if ($fld->type == 'C' or $fld->type == 'X') {
|
||||||
|
if ($rs->fields[4] <= -95) // UNICODE
|
||||||
|
$fld->max_length = $rs->fields[7]/2;
|
||||||
|
else
|
||||||
|
$fld->max_length = $rs->fields[7];
|
||||||
|
} else
|
||||||
|
$fld->max_length = $rs->fields[7];
|
||||||
|
$fld->not_null = !empty($rs->fields[10]);
|
||||||
|
$fld->scale = $rs->fields[8];
|
||||||
|
$fld->primary_key = false;
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
} else if (sizeof($retarr)>0)
|
||||||
|
break;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
if (empty($retarr)) $retarr = false;
|
||||||
|
|
||||||
|
$qid = db2_primary_keys($this->_connectionID, "", $schema, $table);
|
||||||
|
if (empty($qid)) return $false;
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_db2($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs) return $retarr;
|
||||||
|
$rs->_fetch();
|
||||||
|
|
||||||
|
/*
|
||||||
|
$rs->fields indices
|
||||||
|
0 TABLE_CAT
|
||||||
|
1 TABLE_SCHEM
|
||||||
|
2 TABLE_NAME
|
||||||
|
3 COLUMN_NAME
|
||||||
|
4 KEY_SEQ
|
||||||
|
5 PK_NAME
|
||||||
|
*/
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||||
|
$retarr[strtoupper($rs->fields[3])]->primary_key = true;
|
||||||
|
} else if (sizeof($retarr)>0)
|
||||||
|
break;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
|
||||||
|
if (empty($retarr)) $retarr = false;
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
if (! $this->_bindInputArray) return $sql; // no binding
|
||||||
|
$stmt = db2_prepare($this->_connectionID,$sql);
|
||||||
|
if (!$stmt) {
|
||||||
|
// we don't know whether db2 driver is parsing prepared stmts, so just return sql
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
return array($sql,$stmt,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns queryID or false */
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
GLOBAL $php_errormsg;
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
$this->_error = '';
|
||||||
|
|
||||||
|
if ($inputarr) {
|
||||||
|
if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
} else {
|
||||||
|
$stmtid = db2_prepare($this->_connectionID,$sql);
|
||||||
|
|
||||||
|
if ($stmtid == false) {
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! db2_execute($stmtid,$inputarr)) {
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = db2_stmt_errormsg();
|
||||||
|
$this->_errorCode = db2_stmt_error();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
if (!db2_execute($stmtid)) {
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = db2_stmt_errormsg();
|
||||||
|
$this->_errorCode = db2_stmt_error();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
$stmtid = @db2_exec($this->_connectionID,$sql);
|
||||||
|
|
||||||
|
$this->_lastAffectedRows = 0;
|
||||||
|
if ($stmtid) {
|
||||||
|
if (@db2_num_fields($stmtid) == 0) {
|
||||||
|
$this->_lastAffectedRows = db2_num_rows($stmtid);
|
||||||
|
$stmtid = true;
|
||||||
|
} else {
|
||||||
|
$this->_lastAffectedRows = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = '';
|
||||||
|
$this->_errorCode = 0;
|
||||||
|
} else
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
} else {
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = db2_stmt_errormsg();
|
||||||
|
$this->_errorCode = db2_stmt_error();
|
||||||
|
} else
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
|
||||||
|
}
|
||||||
|
return $stmtid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Insert a null into the blob field of the table first.
|
||||||
|
Then use UpdateBlob to store the blob.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||||
|
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||||
|
*/
|
||||||
|
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$ret = @db2_close($this->_connectionID);
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return $this->_lastAffectedRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_db2 extends ADORecordSet {
|
||||||
|
|
||||||
|
var $bind = false;
|
||||||
|
var $databaseType = "db2";
|
||||||
|
var $dataProvider = "db2";
|
||||||
|
var $useFetchArray;
|
||||||
|
|
||||||
|
function ADORecordSet_db2($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
|
||||||
|
$this->_queryID = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns the field object
|
||||||
|
function FetchField($offset = -1)
|
||||||
|
{
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$o->name = @db2_field_name($this->_queryID,$offset);
|
||||||
|
$o->type = @db2_field_type($this->_queryID,$offset);
|
||||||
|
$o->max_length = db2_field_width($this->_queryID,$offset);
|
||||||
|
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||||
|
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1;
|
||||||
|
$this->_numOfFields = @db2_num_fields($this->_queryID);
|
||||||
|
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
|
||||||
|
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
|
||||||
|
function GetArrayLimit($nrows,$offset=-1)
|
||||||
|
{
|
||||||
|
if ($offset <= 0) {
|
||||||
|
$rs = $this->GetArray($nrows);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
$savem = $this->fetchMode;
|
||||||
|
$this->fetchMode = ADODB_FETCH_NUM;
|
||||||
|
$this->Move($offset);
|
||||||
|
$this->fetchMode = $savem;
|
||||||
|
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = array();
|
||||||
|
$cnt = 0;
|
||||||
|
while (!$this->EOF && $nrows != $cnt) {
|
||||||
|
$results[$cnt++] = $this->fields;
|
||||||
|
$this->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if ($this->_numOfRows != 0 && !$this->EOF) {
|
||||||
|
$this->_currentRow++;
|
||||||
|
|
||||||
|
$this->fields = @db2_fetch_array($this->_queryID);
|
||||||
|
if ($this->fields) {
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fields = false;
|
||||||
|
$this->EOF = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->fields = db2_fetch_array($this->_queryID);
|
||||||
|
if ($this->fields) {
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$this->fields = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @db2_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
266
includes/adodb/drivers/adodb-fbsql.inc.php
Normal file
266
includes/adodb/drivers/adodb-fbsql.inc.php
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
@version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Contribution by Frank M. Kromann <frank@frontbase.com>.
|
||||||
|
Set tabs to 8.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (! defined("_ADODB_FBSQL_LAYER")) {
|
||||||
|
define("_ADODB_FBSQL_LAYER", 1 );
|
||||||
|
|
||||||
|
class ADODB_fbsql extends ADOConnection {
|
||||||
|
var $databaseType = 'fbsql';
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $metaTablesSQL = "SHOW TABLES";
|
||||||
|
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $hasLimit = false;
|
||||||
|
|
||||||
|
function ADODB_fbsql()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return fbsql_insert_id($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return fbsql_affected_rows($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaDatabases()
|
||||||
|
{
|
||||||
|
$qid = fbsql_list_dbs($this->_connectionID);
|
||||||
|
$arr = array();
|
||||||
|
$i = 0;
|
||||||
|
$max = fbsql_num_rows($qid);
|
||||||
|
while ($i < $max) {
|
||||||
|
$arr[] = fbsql_tablename($qid,$i);
|
||||||
|
$i += 1;
|
||||||
|
}
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns concatenated string
|
||||||
|
function Concat()
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
$arr = func_get_args();
|
||||||
|
$first = true;
|
||||||
|
|
||||||
|
$s = implode(',',$arr);
|
||||||
|
if (sizeof($arr) > 0) return "CONCAT($s)";
|
||||||
|
else return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
$this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
$this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
if ($this->metaColumnsSQL) {
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||||
|
|
||||||
|
if ($rs === false) return false;
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF){
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
|
||||||
|
// split type into type(length):
|
||||||
|
if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$fld->max_length = $query_array[2];
|
||||||
|
} else {
|
||||||
|
$fld->max_length = -1;
|
||||||
|
}
|
||||||
|
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||||
|
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||||
|
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||||
|
$fld->binary = (strpos($fld->type,'blob') !== false);
|
||||||
|
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
$this->database = $dbName;
|
||||||
|
if ($this->_connectionID) {
|
||||||
|
return @fbsql_select_db($dbName,$this->_connectionID);
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns queryID or false
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
return fbsql_query("$sql;",$this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation */
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
$this->_errorMsg = @fbsql_error($this->_connectionID);
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error number from previous database operation */
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
return @fbsql_errno($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @fbsql_close($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_fbsql extends ADORecordSet{
|
||||||
|
|
||||||
|
var $databaseType = "fbsql";
|
||||||
|
var $canSeek = true;
|
||||||
|
|
||||||
|
function ADORecordSet_fbsql($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if (!$mode) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode) {
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break;
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = FBSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
return $this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
GLOBAL $ADODB_COUNTRECS;
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1;
|
||||||
|
$this->_numOfFields = @fbsql_num_fields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = -1) {
|
||||||
|
if ($fieldOffset != -1) {
|
||||||
|
$o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
|
||||||
|
//$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
|
||||||
|
$f = @fbsql_field_flags($this->_queryID,$fieldOffset);
|
||||||
|
$o->binary = (strpos($f,'binary')!== false);
|
||||||
|
}
|
||||||
|
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||||
|
$o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable
|
||||||
|
//$o->max_length = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return @fbsql_data_seek($this->_queryID,$row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
$this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode);
|
||||||
|
return ($this->fields == true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close() {
|
||||||
|
return @fbsql_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
$len = -1; // fbsql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'CHARACTER':
|
||||||
|
case 'CHARACTER VARYING':
|
||||||
|
case 'BLOB':
|
||||||
|
case 'CLOB':
|
||||||
|
case 'BIT':
|
||||||
|
case 'BIT VARYING':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
// so we have to check whether binary...
|
||||||
|
case 'IMAGE':
|
||||||
|
case 'LONGBLOB':
|
||||||
|
case 'BLOB':
|
||||||
|
case 'MEDIUMBLOB':
|
||||||
|
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||||
|
|
||||||
|
case 'DATE': return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'TIME WITH TIME ZONE':
|
||||||
|
case 'TIMESTAMP':
|
||||||
|
case 'TIMESTAMP WITH TIME ZONE': return 'T';
|
||||||
|
|
||||||
|
case 'PRIMARY_KEY':
|
||||||
|
return 'R';
|
||||||
|
case 'INTEGER':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'BOOLEAN':
|
||||||
|
|
||||||
|
if (!empty($fieldobj->primary_key)) return 'R';
|
||||||
|
else return 'I';
|
||||||
|
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //class
|
||||||
|
} // defined
|
||||||
|
?>
|
77
includes/adodb/drivers/adodb-firebird.inc.php
Normal file
77
includes/adodb/drivers/adodb-firebird.inc.php
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
|
||||||
|
|
||||||
|
class ADODB_firebird extends ADODB_ibase {
|
||||||
|
var $databaseType = "firebird";
|
||||||
|
var $dialect = 3;
|
||||||
|
|
||||||
|
var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
|
||||||
|
|
||||||
|
function ADODB_firebird()
|
||||||
|
{
|
||||||
|
$this->ADODB_ibase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['dialect'] = $this->dialect;
|
||||||
|
switch($arr['dialect']) {
|
||||||
|
case '':
|
||||||
|
case '1': $s = 'Firebird Dialect 1'; break;
|
||||||
|
case '2': $s = 'Firebird Dialect 2'; break;
|
||||||
|
default:
|
||||||
|
case '3': $s = 'Firebird Dialect 3'; break;
|
||||||
|
}
|
||||||
|
$arr['version'] = ADOConnection::_findvers($s);
|
||||||
|
$arr['description'] = $s;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars!
|
||||||
|
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
|
||||||
|
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0)
|
||||||
|
{
|
||||||
|
$nrows = (integer) $nrows;
|
||||||
|
$offset = (integer) $offset;
|
||||||
|
$str = 'SELECT ';
|
||||||
|
if ($nrows >= 0) $str .= "FIRST $nrows ";
|
||||||
|
$str .=($offset>=0) ? "SKIP $offset " : '';
|
||||||
|
|
||||||
|
$sql = preg_replace('/^[ \t]*select/i',$str,$sql);
|
||||||
|
if ($secs)
|
||||||
|
$rs = $this->CacheExecute($secs,$sql,$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql,$inputarr);
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_firebird extends ADORecordSet_ibase {
|
||||||
|
|
||||||
|
var $databaseType = "firebird";
|
||||||
|
|
||||||
|
function ADORecordSet_firebird($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_ibase($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
887
includes/adodb/drivers/adodb-ibase.inc.php
Normal file
887
includes/adodb/drivers/adodb-ibase.inc.php
Normal file
@ -0,0 +1,887 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Interbase data driver. Requires interbase client. Works on Windows and Unix.
|
||||||
|
|
||||||
|
3 Jan 2002 -- suggestions by Hans-Peter Oeri <kampfcaspar75@oeri.ch>
|
||||||
|
changed transaction handling and added experimental blob stuff
|
||||||
|
|
||||||
|
Docs to interbase at the website
|
||||||
|
http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html
|
||||||
|
|
||||||
|
To use gen_id(), see
|
||||||
|
http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen
|
||||||
|
|
||||||
|
$rs = $conn->Execute('select gen_id(adodb,1) from rdb$database');
|
||||||
|
$id = $rs->fields[0];
|
||||||
|
$conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)");
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB_ibase extends ADOConnection {
|
||||||
|
var $databaseType = "ibase";
|
||||||
|
var $dataProvider = "ibase";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S';
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S";
|
||||||
|
var $ibase_timefmt = "%H:%M:%S";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, H:i:s'";
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $_transactionID;
|
||||||
|
var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
|
||||||
|
//OPN STUFF start
|
||||||
|
var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc";
|
||||||
|
//OPN STUFF end
|
||||||
|
var $ibasetrans;
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
var $buffers = 0;
|
||||||
|
var $dialect = 1;
|
||||||
|
var $sysDate = "cast('TODAY' as timestamp)";
|
||||||
|
var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
|
||||||
|
var $ansiOuter = true;
|
||||||
|
var $hasAffectedRows = false;
|
||||||
|
var $poorAffectedRows = true;
|
||||||
|
var $blobEncodeType = 'C';
|
||||||
|
var $role = false;
|
||||||
|
|
||||||
|
function ADODB_ibase()
|
||||||
|
{
|
||||||
|
if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
|
||||||
|
{
|
||||||
|
if (!function_exists('ibase_pconnect')) return null;
|
||||||
|
if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
|
||||||
|
$fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
|
||||||
|
if ($this->role)
|
||||||
|
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
|
||||||
|
$this->charSet,$this->buffers,$this->dialect,$this->role);
|
||||||
|
else
|
||||||
|
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
|
||||||
|
$this->charSet,$this->buffers,$this->dialect);
|
||||||
|
|
||||||
|
if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
|
||||||
|
$this->replaceQuote = "''";
|
||||||
|
}
|
||||||
|
if ($this->_connectionID === false) {
|
||||||
|
$this->_handleerror();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PHP5 change.
|
||||||
|
if (function_exists('ibase_timefmt')) {
|
||||||
|
ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
|
||||||
|
if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
|
||||||
|
else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
|
||||||
|
ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
|
||||||
|
ini_set("ibase.dateformat", $this->ibase_datefmt);
|
||||||
|
ini_set("ibase.timeformat", $this->ibase_timefmt);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
|
||||||
|
{
|
||||||
|
if ($internalKey) return array('RDB$DB_KEY');
|
||||||
|
|
||||||
|
$table = strtoupper($table);
|
||||||
|
|
||||||
|
$sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME
|
||||||
|
FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME
|
||||||
|
WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
|
||||||
|
ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
|
||||||
|
|
||||||
|
$a = $this->GetCol($sql,false,true);
|
||||||
|
if ($a && sizeof($a)>0) return $a;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['dialect'] = $this->dialect;
|
||||||
|
switch($arr['dialect']) {
|
||||||
|
case '':
|
||||||
|
case '1': $s = 'Interbase 5.5 or earlier'; break;
|
||||||
|
case '2': $s = 'Interbase 5.6'; break;
|
||||||
|
default:
|
||||||
|
case '3': $s = 'Interbase 6.0'; break;
|
||||||
|
}
|
||||||
|
$arr['version'] = ADOConnection::_findvers($s);
|
||||||
|
$arr['description'] = $s;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->autoCommit = false;
|
||||||
|
$this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID);
|
||||||
|
return $this->_transactionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$ret = false;
|
||||||
|
$this->autoCommit = true;
|
||||||
|
if ($this->_transactionID) {
|
||||||
|
//print ' commit ';
|
||||||
|
$ret = ibase_commit($this->_transactionID);
|
||||||
|
}
|
||||||
|
$this->_transactionID = false;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently.
|
||||||
|
// it appears that ibase extension cannot support multiple concurrent queryid's
|
||||||
|
function _Execute($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
|
||||||
|
if ($this->_logsql) {
|
||||||
|
$savecrecs = $ADODB_COUNTRECS;
|
||||||
|
$ADODB_COUNTRECS = true; // force countrecs
|
||||||
|
$ret = ADOConnection::_Execute($sql,$inputarr);
|
||||||
|
$ADODB_COUNTRECS = $savecrecs;
|
||||||
|
} else {
|
||||||
|
$ret = ADOConnection::_Execute($sql,$inputarr);
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$ret = false;
|
||||||
|
$this->autoCommit = true;
|
||||||
|
if ($this->_transactionID)
|
||||||
|
$ret = ibase_rollback($this->_transactionID);
|
||||||
|
$this->_transactionID = false;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes ($table, $primary = FALSE, $owner=false)
|
||||||
|
{
|
||||||
|
// save old fetch mode
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$false = false;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
$table = strtoupper($table);
|
||||||
|
$sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
|
||||||
|
if (!$primary) {
|
||||||
|
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
|
||||||
|
} else {
|
||||||
|
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
|
||||||
|
}
|
||||||
|
// get index details
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
// restore fetchmode
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
$index = $row[0];
|
||||||
|
if (!isset($indexes[$index])) {
|
||||||
|
if (is_null($row[3])) {$row[3] = 0;}
|
||||||
|
$indexes[$index] = array(
|
||||||
|
'unique' => ($row[3] == 1),
|
||||||
|
'columns' => array()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC";
|
||||||
|
$rs1 = $this->Execute($sql);
|
||||||
|
while ($row1 = $rs1->FetchRow()) {
|
||||||
|
$indexes[$index]['columns'][$row1[2]] = $row1[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// restore fetchmode
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// See http://community.borland.com/article/0,1410,25844,00.html
|
||||||
|
function RowLock($tables,$where,$col)
|
||||||
|
{
|
||||||
|
if ($this->autoCommit) $this->BeginTrans();
|
||||||
|
$this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim?
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function CreateSequence($seqname,$startID=1)
|
||||||
|
{
|
||||||
|
$ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
|
||||||
|
if (!$ok) return false;
|
||||||
|
return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropSequence($seqname)
|
||||||
|
{
|
||||||
|
$seqname = strtoupper($seqname);
|
||||||
|
$this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenID($seqname='adodbseq',$startID=1)
|
||||||
|
{
|
||||||
|
$getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
|
||||||
|
$rs = @$this->Execute($getnext);
|
||||||
|
if (!$rs) {
|
||||||
|
$this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
|
||||||
|
$this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
|
||||||
|
$rs = $this->Execute($getnext);
|
||||||
|
}
|
||||||
|
if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields);
|
||||||
|
else $this->genID = 0; // false
|
||||||
|
|
||||||
|
if ($rs) $rs->Close();
|
||||||
|
|
||||||
|
return $this->genID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _handleerror()
|
||||||
|
{
|
||||||
|
$this->_errorMsg = ibase_errmsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1];
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
$stmt = ibase_prepare($this->_connectionID,$sql);
|
||||||
|
if (!$stmt) return false;
|
||||||
|
return array($sql,$stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
// there have been reports of problems with nested queries - the code is probably not re-entrant?
|
||||||
|
function _query($sql,$iarr=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!$this->autoCommit && $this->_transactionID) {
|
||||||
|
$conn = $this->_transactionID;
|
||||||
|
$docommit = false;
|
||||||
|
} else {
|
||||||
|
$conn = $this->_connectionID;
|
||||||
|
$docommit = true;
|
||||||
|
}
|
||||||
|
if (is_array($sql)) {
|
||||||
|
$fn = 'ibase_execute';
|
||||||
|
$sql = $sql[1];
|
||||||
|
if (is_array($iarr)) {
|
||||||
|
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
|
||||||
|
if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack
|
||||||
|
$fnarr = array_merge( array($sql) , $iarr);
|
||||||
|
$ret = call_user_func_array($fn,$fnarr);
|
||||||
|
} else {
|
||||||
|
switch(sizeof($iarr)) {
|
||||||
|
case 1: $ret = $fn($sql,$iarr[0]); break;
|
||||||
|
case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break;
|
||||||
|
case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break;
|
||||||
|
case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
|
||||||
|
case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
|
||||||
|
case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
|
||||||
|
case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
|
||||||
|
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
|
||||||
|
case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else $ret = $fn($sql);
|
||||||
|
} else {
|
||||||
|
$fn = 'ibase_query';
|
||||||
|
|
||||||
|
if (is_array($iarr)) {
|
||||||
|
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
|
||||||
|
if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack
|
||||||
|
$fnarr = array_merge( array($conn,$sql) , $iarr);
|
||||||
|
$ret = call_user_func_array($fn,$fnarr);
|
||||||
|
} else {
|
||||||
|
switch(sizeof($iarr)) {
|
||||||
|
case 1: $ret = $fn($conn,$sql,$iarr[0]); break;
|
||||||
|
case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break;
|
||||||
|
case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break;
|
||||||
|
case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
|
||||||
|
case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
|
||||||
|
case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
|
||||||
|
case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
|
||||||
|
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
|
||||||
|
case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else $ret = $fn($conn,$sql);
|
||||||
|
}
|
||||||
|
if ($docommit && $ret === true) ibase_commit($this->_connectionID);
|
||||||
|
|
||||||
|
$this->_handleerror();
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
if (!$this->autoCommit) @ibase_rollback($this->_connectionID);
|
||||||
|
return @ibase_close($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
//OPN STUFF start
|
||||||
|
function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3)
|
||||||
|
{
|
||||||
|
$fscale = abs($fscale);
|
||||||
|
$fld->max_length = $flen;
|
||||||
|
$fld->scale = null;
|
||||||
|
switch($ftype){
|
||||||
|
case 7:
|
||||||
|
case 8:
|
||||||
|
if ($dialect3) {
|
||||||
|
switch($fsubtype){
|
||||||
|
case 0:
|
||||||
|
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$fld->type = 'numeric';
|
||||||
|
$fld->max_length = $fprecision;
|
||||||
|
$fld->scale = $fscale;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$fld->type = 'decimal';
|
||||||
|
$fld->max_length = $fprecision;
|
||||||
|
$fld->scale = $fscale;
|
||||||
|
break;
|
||||||
|
} // switch
|
||||||
|
} else {
|
||||||
|
if ($fscale !=0) {
|
||||||
|
$fld->type = 'decimal';
|
||||||
|
$fld->scale = $fscale;
|
||||||
|
$fld->max_length = ($ftype == 7 ? 4 : 9);
|
||||||
|
} else {
|
||||||
|
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
if ($dialect3) {
|
||||||
|
switch($fsubtype){
|
||||||
|
case 0:
|
||||||
|
$fld->type = 'decimal';
|
||||||
|
$fld->max_length = 18;
|
||||||
|
$fld->scale = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$fld->type = 'numeric';
|
||||||
|
$fld->max_length = $fprecision;
|
||||||
|
$fld->scale = $fscale;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$fld->type = 'decimal';
|
||||||
|
$fld->max_length = $fprecision;
|
||||||
|
$fld->scale = $fscale;
|
||||||
|
break;
|
||||||
|
} // switch
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
$fld->type = 'float';
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
$fld->type = 'char';
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
if ($fscale !=0) {
|
||||||
|
$fld->type = 'decimal';
|
||||||
|
$fld->max_length = 15;
|
||||||
|
$fld->scale = 5;
|
||||||
|
} else {
|
||||||
|
$fld->type = 'double';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 35:
|
||||||
|
if ($dialect3) {
|
||||||
|
$fld->type = 'timestamp';
|
||||||
|
} else {
|
||||||
|
$fld->type = 'date';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
$fld->type = 'date';
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
$fld->type = 'time';
|
||||||
|
break;
|
||||||
|
case 37:
|
||||||
|
$fld->type = 'varchar';
|
||||||
|
break;
|
||||||
|
case 40:
|
||||||
|
$fld->type = 'cstring';
|
||||||
|
break;
|
||||||
|
case 261:
|
||||||
|
$fld->type = 'blob';
|
||||||
|
$fld->max_length = -1;
|
||||||
|
break;
|
||||||
|
} // switch
|
||||||
|
}
|
||||||
|
//OPN STUFF end
|
||||||
|
// returns array of ADOFieldObjects for current table
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
$false = false;
|
||||||
|
if ($rs === false) {
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
//OPN STUFF start
|
||||||
|
$dialect3 = ($this->dialect==3 ? true : false);
|
||||||
|
//OPN STUFF end
|
||||||
|
while (!$rs->EOF) { //print_r($rs->fields);
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = trim($rs->fields[0]);
|
||||||
|
//OPN STUFF start
|
||||||
|
$this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3);
|
||||||
|
if (isset($rs->fields[1]) && $rs->fields[1]) {
|
||||||
|
$fld->not_null = true;
|
||||||
|
}
|
||||||
|
if (isset($rs->fields[2])) {
|
||||||
|
|
||||||
|
$fld->has_default = true;
|
||||||
|
$d = substr($rs->fields[2],strlen('default '));
|
||||||
|
switch ($fld->type)
|
||||||
|
{
|
||||||
|
case 'smallint':
|
||||||
|
case 'integer': $fld->default_value = (int) $d; break;
|
||||||
|
case 'char':
|
||||||
|
case 'blob':
|
||||||
|
case 'text':
|
||||||
|
case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break;
|
||||||
|
case 'double':
|
||||||
|
case 'float': $fld->default_value = (float) $d; break;
|
||||||
|
default: $fld->default_value = $d; break;
|
||||||
|
}
|
||||||
|
// case 35:$tt = 'TIMESTAMP'; break;
|
||||||
|
}
|
||||||
|
if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
|
||||||
|
$fld->sub_type = $rs->fields[5];
|
||||||
|
} else {
|
||||||
|
$fld->sub_type = null;
|
||||||
|
}
|
||||||
|
//OPN STUFF end
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||||
|
else $retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
if ( empty($retarr)) return $false;
|
||||||
|
else return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BlobEncode( $blob )
|
||||||
|
{
|
||||||
|
$blobid = ibase_blob_create( $this->_connectionID);
|
||||||
|
ibase_blob_add( $blobid, $blob );
|
||||||
|
return ibase_blob_close( $blobid );
|
||||||
|
}
|
||||||
|
|
||||||
|
// since we auto-decode all blob's since 2.42,
|
||||||
|
// BlobDecode should not do any transforms
|
||||||
|
function BlobDecode($blob)
|
||||||
|
{
|
||||||
|
return $blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// old blobdecode function
|
||||||
|
// still used to auto-decode all blob's
|
||||||
|
function _BlobDecode_old( $blob )
|
||||||
|
{
|
||||||
|
$blobid = ibase_blob_open($this->_connectionID, $blob );
|
||||||
|
$realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr>
|
||||||
|
while($string = ibase_blob_get($blobid, 8192)){
|
||||||
|
$realblob .= $string;
|
||||||
|
}
|
||||||
|
ibase_blob_close( $blobid );
|
||||||
|
|
||||||
|
return( $realblob );
|
||||||
|
}
|
||||||
|
|
||||||
|
function _BlobDecode( $blob )
|
||||||
|
{
|
||||||
|
if (ADODB_PHPVER >= 0x5000) {
|
||||||
|
$blob_data = ibase_blob_info($this->_connectionID, $blob );
|
||||||
|
$blobid = ibase_blob_open($this->_connectionID, $blob );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$blob_data = ibase_blob_info( $blob );
|
||||||
|
$blobid = ibase_blob_open( $blob );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $blob_data[0] > $this->maxblobsize ) {
|
||||||
|
|
||||||
|
$realblob = ibase_blob_get($blobid, $this->maxblobsize);
|
||||||
|
|
||||||
|
while($string = ibase_blob_get($blobid, 8192)){
|
||||||
|
$realblob .= $string;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$realblob = ibase_blob_get($blobid, $blob_data[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ibase_blob_close( $blobid );
|
||||||
|
return( $realblob );
|
||||||
|
}
|
||||||
|
|
||||||
|
function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
$fd = fopen($path,'rb');
|
||||||
|
if ($fd === false) return false;
|
||||||
|
$blob_id = ibase_blob_create($this->_connectionID);
|
||||||
|
|
||||||
|
/* fill with data */
|
||||||
|
|
||||||
|
while ($val = fread($fd,32768)){
|
||||||
|
ibase_blob_add($blob_id, $val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close and get $blob_id_str for inserting into table */
|
||||||
|
$blob_id_str = ibase_blob_close($blob_id);
|
||||||
|
|
||||||
|
fclose($fd);
|
||||||
|
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Insert a null into the blob field of the table first.
|
||||||
|
Then use UpdateBlob to store the blob.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||||
|
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||||
|
*/
|
||||||
|
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
$blob_id = ibase_blob_create($this->_connectionID);
|
||||||
|
|
||||||
|
// ibase_blob_add($blob_id, $val);
|
||||||
|
|
||||||
|
// replacement that solves the problem by which only the first modulus 64K /
|
||||||
|
// of $val are stored at the blob field ////////////////////////////////////
|
||||||
|
// Thx Abel Berenstein aberenstein#afip.gov.ar
|
||||||
|
$len = strlen($val);
|
||||||
|
$chunk_size = 32768;
|
||||||
|
$tail_size = $len % $chunk_size;
|
||||||
|
$n_chunks = ($len - $tail_size) / $chunk_size;
|
||||||
|
|
||||||
|
for ($n = 0; $n < $n_chunks; $n++) {
|
||||||
|
$start = $n * $chunk_size;
|
||||||
|
$data = substr($val, $start, $chunk_size);
|
||||||
|
ibase_blob_add($blob_id, $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tail_size) {
|
||||||
|
$start = $n_chunks * $chunk_size;
|
||||||
|
$data = substr($val, $start, $tail_size);
|
||||||
|
ibase_blob_add($blob_id, $data);
|
||||||
|
}
|
||||||
|
// end replacement /////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
$blob_id_str = ibase_blob_close($blob_id);
|
||||||
|
|
||||||
|
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
$blob_id = ibase_blob_create($this->_connectionID);
|
||||||
|
ibase_blob_add($blob_id, $val);
|
||||||
|
$blob_id_str = ibase_blob_close($blob_id);
|
||||||
|
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
// Only since Interbase 6.0 - uses EXTRACT
|
||||||
|
// problem - does not zero-fill the day and month yet
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
if (!$col) $col = $this->sysDate;
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= '||';
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= "extract(year from $col)";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
case 'm':
|
||||||
|
$s .= "extract(month from $col)";
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
case 'q':
|
||||||
|
$s .= "cast(((extract(month from $col)+2) / 3) as integer)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= "(extract(day from $col))";
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
$s .= "(extract(hour from $col))";
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
case 'i':
|
||||||
|
$s .= "(extract(minute from $col))";
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
case 's':
|
||||||
|
$s .= "CAST((extract(second from $col)) AS INTEGER)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_ibase extends ADORecordSet
|
||||||
|
{
|
||||||
|
|
||||||
|
var $databaseType = "ibase";
|
||||||
|
var $bind=false;
|
||||||
|
var $_cacheType;
|
||||||
|
|
||||||
|
function ADORecordset_ibase($id,$mode=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode;
|
||||||
|
$this->ADORecordSet($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: an object containing field information.
|
||||||
|
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||||
|
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||||
|
fetchField() is retrieved. */
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$ibf = ibase_field_info($this->_queryID,$fieldOffset);
|
||||||
|
switch (ADODB_ASSOC_CASE) {
|
||||||
|
case 2: // the default
|
||||||
|
$fld->name = ($ibf['alias']);
|
||||||
|
if (empty($fld->name)) $fld->name = ($ibf['name']);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
$fld->name = strtoupper($ibf['alias']);
|
||||||
|
if (empty($fld->name)) $fld->name = strtoupper($ibf['name']);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$fld->name = strtolower($ibf['alias']);
|
||||||
|
if (empty($fld->name)) $fld->name = strtolower($ibf['name']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$fld->type = $ibf['type'];
|
||||||
|
$fld->max_length = $ibf['length'];
|
||||||
|
|
||||||
|
/* This needs to be populated from the metadata */
|
||||||
|
$fld->not_null = false;
|
||||||
|
$fld->has_default = false;
|
||||||
|
$fld->default_value = 'null';
|
||||||
|
return $fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$this->_numOfRows = -1;
|
||||||
|
$this->_numOfFields = @ibase_num_fields($this->_queryID);
|
||||||
|
|
||||||
|
// cache types for blob decode check
|
||||||
|
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
$f1 = $this->FetchField($i);
|
||||||
|
$this->_cacheType[] = $f1->type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
$f = @ibase_fetch_row($this->_queryID);
|
||||||
|
if ($f === false) {
|
||||||
|
$this->fields = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// OPN stuff start - optimized
|
||||||
|
// fix missing nulls and decode blobs automatically
|
||||||
|
|
||||||
|
global $ADODB_ANSI_PADDING_OFF;
|
||||||
|
//$ADODB_ANSI_PADDING_OFF=1;
|
||||||
|
$rtrim = !empty($ADODB_ANSI_PADDING_OFF);
|
||||||
|
|
||||||
|
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
|
||||||
|
if ($this->_cacheType[$i]=="BLOB") {
|
||||||
|
if (isset($f[$i])) {
|
||||||
|
$f[$i] = $this->connection->_BlobDecode($f[$i]);
|
||||||
|
} else {
|
||||||
|
$f[$i] = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!isset($f[$i])) {
|
||||||
|
$f[$i] = null;
|
||||||
|
} else if ($rtrim && is_string($f[$i])) {
|
||||||
|
$f[$i] = rtrim($f[$i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// OPN stuff end
|
||||||
|
|
||||||
|
$this->fields = $f;
|
||||||
|
if ($this->fetchMode == ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
} else if ($this->fetchMode == ADODB_FETCH_BOTH) {
|
||||||
|
$this->fields = array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @ibase_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'CHAR':
|
||||||
|
return 'C';
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'VARYING':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
return 'X';
|
||||||
|
case 'BLOB':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'TIMESTAMP':
|
||||||
|
case 'DATE': return 'D';
|
||||||
|
case 'TIME': return 'T';
|
||||||
|
//case 'T': return 'T';
|
||||||
|
|
||||||
|
//case 'L': return 'L';
|
||||||
|
case 'INT':
|
||||||
|
case 'SHORT':
|
||||||
|
case 'INTEGER': return 'I';
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
40
includes/adodb/drivers/adodb-informix.inc.php
Normal file
40
includes/adodb/drivers/adodb-informix.inc.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
* Informix 9 driver that supports SELECT FIRST
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-informix72.inc.php');
|
||||||
|
|
||||||
|
class ADODB_informix extends ADODB_informix72 {
|
||||||
|
var $databaseType = "informix";
|
||||||
|
var $hasTop = 'FIRST';
|
||||||
|
var $ansiOuter = true;
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " NVL($field, $ifNull) "; // if Informix 9.X or 10.X
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordset_informix extends ADORecordset_informix72 {
|
||||||
|
var $databaseType = "informix";
|
||||||
|
|
||||||
|
function ADORecordset_informix($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_informix72($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
475
includes/adodb/drivers/adodb-informix72.inc.php
Normal file
475
includes/adodb/drivers/adodb-informix72.inc.php
Normal file
@ -0,0 +1,475 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim. All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Informix port by Mitchell T. Young (mitch@youngfamily.org)
|
||||||
|
|
||||||
|
Further mods by "Samuel CARRIERE" <samuel_carriere@hotmail.com>
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1);
|
||||||
|
|
||||||
|
class ADODB_informix72 extends ADOConnection {
|
||||||
|
var $databaseType = "informix72";
|
||||||
|
var $dataProvider = "informix";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $substr = 'substr';
|
||||||
|
var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables
|
||||||
|
|
||||||
|
|
||||||
|
var $metaColumnsSQL =
|
||||||
|
"select c.colname, c.coltype, c.collength, d.default,c.colno
|
||||||
|
from syscolumns c, systables t,outer sysdefaults d
|
||||||
|
where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno
|
||||||
|
and tabname='%s' order by c.colno";
|
||||||
|
|
||||||
|
var $metaPrimaryKeySQL =
|
||||||
|
"select part1,part2,part3,part4,part5,part6,part7,part8 from
|
||||||
|
systables t,sysconstraints s,sysindexes i where t.tabname='%s'
|
||||||
|
and s.tabid=t.tabid and s.constrtype='P'
|
||||||
|
and i.idxname=s.idxname";
|
||||||
|
|
||||||
|
var $concat_operator = '||';
|
||||||
|
|
||||||
|
var $lastQuery = false;
|
||||||
|
var $has_insertid = true;
|
||||||
|
|
||||||
|
var $_autocommit = true;
|
||||||
|
var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters.
|
||||||
|
var $sysDate = 'TODAY';
|
||||||
|
var $sysTimeStamp = 'CURRENT';
|
||||||
|
var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0
|
||||||
|
|
||||||
|
function ADODB_informix72()
|
||||||
|
{
|
||||||
|
// alternatively, use older method:
|
||||||
|
//putenv("DBDATE=Y4MD-");
|
||||||
|
|
||||||
|
// force ISO date format
|
||||||
|
putenv('GL_DATE=%Y-%m-%d');
|
||||||
|
|
||||||
|
if (function_exists('ifx_byteasvarchar')) {
|
||||||
|
ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
|
||||||
|
ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
|
||||||
|
ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
if (isset($this->version)) return $this->version;
|
||||||
|
|
||||||
|
$arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1");
|
||||||
|
$arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1");
|
||||||
|
$this->version = $arr;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
$sqlca =ifx_getsqlca($this->lastQuery);
|
||||||
|
return @$sqlca["sqlerrd1"];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
if ($this->lastQuery) {
|
||||||
|
return @ifx_affected_rows ($this->lastQuery);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->Execute('BEGIN');
|
||||||
|
$this->_autocommit = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('COMMIT');
|
||||||
|
$this->_autocommit = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('ROLLBACK');
|
||||||
|
$this->_autocommit = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RowLock($tables,$where,$flds='1 as ignore')
|
||||||
|
{
|
||||||
|
if ($this->_autocommit) $this->BeginTrans();
|
||||||
|
return $this->GetOne("select $flds from $tables where $where for update");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation
|
||||||
|
Note: This function is NOT available for Microsoft SQL Server. */
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if (!empty($this->_logsql)) return $this->_errorMsg;
|
||||||
|
$this->_errorMsg = ifx_errormsg();
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse);
|
||||||
|
if (is_array($parse) && isset($parse[1])) return (int)$parse[1];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
if (!empty($this->metaColumnsSQL)) {
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
if ($rs === false) return $false;
|
||||||
|
$rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) { //print_r($rs->fields);
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
/* //!eos.
|
||||||
|
$rs->fields[1] is not the correct adodb type
|
||||||
|
$rs->fields[2] is not correct max_length, because can include not-null bit
|
||||||
|
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag
|
||||||
|
$fld->max_length = $rs->fields[2];*/
|
||||||
|
$pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos
|
||||||
|
$fld->type = $pr[0] ;//!eos
|
||||||
|
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields);
|
||||||
|
$fld->max_length = $pr[1]; //!eos
|
||||||
|
$fld->precision = $pr[2] ;//!eos
|
||||||
|
$fld->not_null = $pr[3]=="N"; //!eos
|
||||||
|
|
||||||
|
if (trim($rs->fields[3]) != "AAAAAA 0") {
|
||||||
|
$fld->has_default = 1;
|
||||||
|
$fld->default_value = $rs->fields[3];
|
||||||
|
} else {
|
||||||
|
$fld->has_default = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$retarr[strtolower($fld->name)] = $fld;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
$rspkey->Close(); //!eos
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function xMetaColumns($table)
|
||||||
|
{
|
||||||
|
return ADOConnection::MetaColumns($table,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos
|
||||||
|
{
|
||||||
|
$sql = "
|
||||||
|
select tr.tabname,updrule,delrule,
|
||||||
|
i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4,
|
||||||
|
i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8
|
||||||
|
from systables t,sysconstraints s,sysindexes i,
|
||||||
|
sysreferences r,systables tr,sysconstraints s2,sysindexes i2
|
||||||
|
where t.tabname='$table'
|
||||||
|
and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid
|
||||||
|
and i.idxname=s.idxname and tr.tabid=r.ptabid
|
||||||
|
and s2.constrid=r.primary and i2.idxname=s2.idxname";
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (!$rs || $rs->EOF) return false;
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
$a = array();
|
||||||
|
foreach($arr as $v) {
|
||||||
|
$coldest=$this->metaColumnNames($v["tabname"]);
|
||||||
|
$colorig=$this->metaColumnNames($table);
|
||||||
|
$colnames=array();
|
||||||
|
for($i=1;$i<=8 && $v["o$i"] ;$i++) {
|
||||||
|
$colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1];
|
||||||
|
}
|
||||||
|
if($upper)
|
||||||
|
$a[strtoupper($v["tabname"])] = $colnames;
|
||||||
|
else
|
||||||
|
$a[$v["tabname"]] = $colnames;
|
||||||
|
}
|
||||||
|
return $a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB')
|
||||||
|
{
|
||||||
|
$type = ($blobtype == 'TEXT') ? 1 : 0;
|
||||||
|
$blobid = ifx_create_blob($type,0,$val);
|
||||||
|
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid));
|
||||||
|
}
|
||||||
|
|
||||||
|
function BlobDecode($blobid)
|
||||||
|
{
|
||||||
|
return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('ifx_connect')) return null;
|
||||||
|
|
||||||
|
$dbs = $argDatabasename . "@" . $argHostname;
|
||||||
|
if ($argHostname) putenv("INFORMIXSERVER=$argHostname");
|
||||||
|
putenv("INFORMIXSERVER=".trim($argHostname));
|
||||||
|
$this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('ifx_connect')) return null;
|
||||||
|
|
||||||
|
$dbs = $argDatabasename . "@" . $argHostname;
|
||||||
|
putenv("INFORMIXSERVER=".trim($argHostname));
|
||||||
|
$this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
// ifx_do does not accept bind parameters - weird ???
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
$stmt = ifx_prepare($sql);
|
||||||
|
if (!$stmt) return $sql;
|
||||||
|
else return array($sql,$stmt);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
|
||||||
|
// String parameters have to be converted using ifx_create_char
|
||||||
|
if ($inputarr) {
|
||||||
|
foreach($inputarr as $v) {
|
||||||
|
if (gettype($v) == 'string') {
|
||||||
|
$tab[] = ifx_create_char($v);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$tab[] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// In case of select statement, we use a scroll cursor in order
|
||||||
|
// to be able to call "move", or "movefirst" statements
|
||||||
|
if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) {
|
||||||
|
if ($inputarr) {
|
||||||
|
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ($inputarr) {
|
||||||
|
$this->lastQuery = ifx_query($sql,$this->_connectionID, $tab);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->lastQuery = ifx_query($sql,$this->_connectionID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Following line have been commented because autocommit mode is
|
||||||
|
// not supported by informix SE 7.2
|
||||||
|
|
||||||
|
//if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID);
|
||||||
|
|
||||||
|
return $this->lastQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$this->lastQuery = false;
|
||||||
|
return ifx_close($this->_connectionID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_informix72 extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = "informix72";
|
||||||
|
var $canSeek = true;
|
||||||
|
var $_fieldprops = false;
|
||||||
|
|
||||||
|
function ADORecordset_informix72($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
return $this->ADORecordSet($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns: an object containing field information.
|
||||||
|
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||||
|
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||||
|
fetchField() is retrieved. */
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
if (empty($this->_fieldprops)) {
|
||||||
|
$fp = ifx_fieldproperties($this->_queryID);
|
||||||
|
foreach($fp as $k => $v) {
|
||||||
|
$o = new ADOFieldObject;
|
||||||
|
$o->name = $k;
|
||||||
|
$arr = split(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE"
|
||||||
|
$o->type = $arr[0];
|
||||||
|
$o->max_length = $arr[1];
|
||||||
|
$this->_fieldprops[] = $o;
|
||||||
|
$o->not_null = $arr[4]=="N";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ret = $this->_fieldprops[$fieldOffset];
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1;
|
||||||
|
$this->_numOfFields = ifx_num_fields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return @ifx_fetch_row($this->_queryID, (int) $row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveLast()
|
||||||
|
{
|
||||||
|
$this->fields = @ifx_fetch_row($this->_queryID, "LAST");
|
||||||
|
if ($this->fields) $this->EOF = false;
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
|
||||||
|
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||||
|
foreach($this->fields as $v) {
|
||||||
|
$arr[] = $v;
|
||||||
|
}
|
||||||
|
$this->fields = $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveFirst()
|
||||||
|
{
|
||||||
|
$this->fields = @ifx_fetch_row($this->_queryID, "FIRST");
|
||||||
|
if ($this->fields) $this->EOF = false;
|
||||||
|
$this->_currentRow = 0;
|
||||||
|
|
||||||
|
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||||
|
foreach($this->fields as $v) {
|
||||||
|
$arr[] = $v;
|
||||||
|
}
|
||||||
|
$this->fields = $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->fields = @ifx_fetch_row($this->_queryID);
|
||||||
|
|
||||||
|
if (!is_array($this->fields)) return false;
|
||||||
|
|
||||||
|
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||||
|
foreach($this->fields as $v) {
|
||||||
|
$arr[] = $v;
|
||||||
|
}
|
||||||
|
$this->fields = $arr;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||||
|
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return ifx_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/** !Eos
|
||||||
|
* Auxiliar function to Parse coltype,collength. Used by Metacolumns
|
||||||
|
* return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties)
|
||||||
|
*/
|
||||||
|
function ifx_props($coltype,$collength){
|
||||||
|
$itype=fmod($coltype+1,256);
|
||||||
|
$nullable=floor(($coltype+1) /256) ?"N":"Y";
|
||||||
|
$mtype=substr(" CIIFFNNDN TBXCC ",$itype,1);
|
||||||
|
switch ($itype){
|
||||||
|
case 2:
|
||||||
|
$length=4;
|
||||||
|
case 6:
|
||||||
|
case 9:
|
||||||
|
case 14:
|
||||||
|
$length=floor($collength/256);
|
||||||
|
$precision=fmod($collength,256);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$precision=0;
|
||||||
|
$length=$collength;
|
||||||
|
}
|
||||||
|
return array($mtype,$length,$precision,$nullable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
419
includes/adodb/drivers/adodb-ldap.inc.php
Normal file
419
includes/adodb/drivers/adodb-ldap.inc.php
Normal file
@ -0,0 +1,419 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
Revision 1: (02/25/2005) Updated codebase to include the _inject_bind_options function. This allows
|
||||||
|
users to access the options in the ldap_set_option function appropriately. Most importantly
|
||||||
|
LDAP Version 3 is now supported. See the examples for more information. Also fixed some minor
|
||||||
|
bugs that surfaced when PHP error levels were set high.
|
||||||
|
|
||||||
|
Joshua Eldridge (joshuae74#hotmail.com)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('LDAP_ASSOC')) {
|
||||||
|
define('LDAP_ASSOC',ADODB_FETCH_ASSOC);
|
||||||
|
define('LDAP_NUM',ADODB_FETCH_NUM);
|
||||||
|
define('LDAP_BOTH',ADODB_FETCH_BOTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADODB_ldap extends ADOConnection {
|
||||||
|
var $databaseType = 'ldap';
|
||||||
|
var $dataProvider = 'ldap';
|
||||||
|
|
||||||
|
# Connection information
|
||||||
|
var $username = false;
|
||||||
|
var $password = false;
|
||||||
|
|
||||||
|
# Used during searches
|
||||||
|
var $filter;
|
||||||
|
var $dn;
|
||||||
|
var $version;
|
||||||
|
var $port = 389;
|
||||||
|
|
||||||
|
# Options configuration information
|
||||||
|
var $LDAP_CONNECT_OPTIONS;
|
||||||
|
|
||||||
|
# error on binding, eg. "Binding: invalid credentials"
|
||||||
|
var $_bind_errmsg = "Binding: %s";
|
||||||
|
|
||||||
|
function ADODB_ldap()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
|
||||||
|
function _connect( $host, $username, $password, $ldapbase)
|
||||||
|
{
|
||||||
|
global $LDAP_CONNECT_OPTIONS;
|
||||||
|
|
||||||
|
if ( !function_exists( 'ldap_connect' ) ) return null;
|
||||||
|
|
||||||
|
$conn_info = array( $host,$this->port);
|
||||||
|
|
||||||
|
if ( strstr( $host, ':' ) ) {
|
||||||
|
$conn_info = split( ':', $host );
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_connectionID = @ldap_connect( $conn_info[0], $conn_info[1] );
|
||||||
|
if (!$this->_connectionID) {
|
||||||
|
$e = 'Could not connect to ' . $conn_info[0];
|
||||||
|
$this->_errorMsg = $e;
|
||||||
|
if ($this->debug) ADOConnection::outp($e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) {
|
||||||
|
$this->_inject_bind_options( $LDAP_CONNECT_OPTIONS );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($username) {
|
||||||
|
$bind = @ldap_bind( $this->_connectionID, $username, $password );
|
||||||
|
} else {
|
||||||
|
$username = 'anonymous';
|
||||||
|
$bind = @ldap_bind( $this->_connectionID );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$bind) {
|
||||||
|
$e = sprintf($this->_bind_errmsg,ldap_error($this->_connectionID));
|
||||||
|
$this->_errorMsg = $e;
|
||||||
|
if ($this->debug) ADOConnection::outp($e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->_errorMsg = '';
|
||||||
|
$this->database = $ldapbase;
|
||||||
|
return $this->_connectionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Valid Domain Values for LDAP Options:
|
||||||
|
|
||||||
|
LDAP_OPT_DEREF (integer)
|
||||||
|
LDAP_OPT_SIZELIMIT (integer)
|
||||||
|
LDAP_OPT_TIMELIMIT (integer)
|
||||||
|
LDAP_OPT_PROTOCOL_VERSION (integer)
|
||||||
|
LDAP_OPT_ERROR_NUMBER (integer)
|
||||||
|
LDAP_OPT_REFERRALS (boolean)
|
||||||
|
LDAP_OPT_RESTART (boolean)
|
||||||
|
LDAP_OPT_HOST_NAME (string)
|
||||||
|
LDAP_OPT_ERROR_STRING (string)
|
||||||
|
LDAP_OPT_MATCHED_DN (string)
|
||||||
|
LDAP_OPT_SERVER_CONTROLS (array)
|
||||||
|
LDAP_OPT_CLIENT_CONTROLS (array)
|
||||||
|
|
||||||
|
Make sure to set this BEFORE calling Connect()
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
$LDAP_CONNECT_OPTIONS = Array(
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_DEREF,
|
||||||
|
"OPTION_VALUE"=>2
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_SIZELIMIT,
|
||||||
|
"OPTION_VALUE"=>100
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_TIMELIMIT,
|
||||||
|
"OPTION_VALUE"=>30
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,
|
||||||
|
"OPTION_VALUE"=>3
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,
|
||||||
|
"OPTION_VALUE"=>13
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_REFERRALS,
|
||||||
|
"OPTION_VALUE"=>FALSE
|
||||||
|
),
|
||||||
|
Array (
|
||||||
|
"OPTION_NAME"=>LDAP_OPT_RESTART,
|
||||||
|
"OPTION_VALUE"=>FALSE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
|
function _inject_bind_options( $options ) {
|
||||||
|
foreach( $options as $option ) {
|
||||||
|
ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] )
|
||||||
|
or die( "Unable to set server option: " . $option["OPTION_NAME"] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns _queryID or false */
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
$rs = @ldap_search( $this->_connectionID, $this->database, $sql );
|
||||||
|
$this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql.': '.ldap_error($this->_connectionID);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
return @ldap_errno($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* closes the LDAP connection */
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
@ldap_close( $this->_connectionID );
|
||||||
|
$this->_connectionID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectDB($db) {
|
||||||
|
$this->database = $db;
|
||||||
|
return true;
|
||||||
|
} // SelectDB
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
if( !empty( $this->version ) ) return $this->version;
|
||||||
|
$version = array();
|
||||||
|
/*
|
||||||
|
Determines how aliases are handled during search.
|
||||||
|
LDAP_DEREF_NEVER (0x00)
|
||||||
|
LDAP_DEREF_SEARCHING (0x01)
|
||||||
|
LDAP_DEREF_FINDING (0x02)
|
||||||
|
LDAP_DEREF_ALWAYS (0x03)
|
||||||
|
The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but
|
||||||
|
not when locating the base object of the search. The LDAP_DEREF_FINDING value means
|
||||||
|
aliases are dereferenced when locating the base object but not during the search.
|
||||||
|
Default: LDAP_DEREF_NEVER
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ;
|
||||||
|
switch ( $version['LDAP_OPT_DEREF'] ) {
|
||||||
|
case 0:
|
||||||
|
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER';
|
||||||
|
case 1:
|
||||||
|
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING';
|
||||||
|
case 2:
|
||||||
|
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING';
|
||||||
|
case 3:
|
||||||
|
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
A limit on the number of entries to return from a search.
|
||||||
|
LDAP_NO_LIMIT (0) means no limit.
|
||||||
|
Default: LDAP_NO_LIMIT
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] );
|
||||||
|
if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) {
|
||||||
|
$version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
A limit on the number of seconds to spend on a search.
|
||||||
|
LDAP_NO_LIMIT (0) means no limit.
|
||||||
|
Default: LDAP_NO_LIMIT
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] );
|
||||||
|
if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) {
|
||||||
|
$version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not.
|
||||||
|
LDAP_OPT_ON
|
||||||
|
LDAP_OPT_OFF
|
||||||
|
Default: ON
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] );
|
||||||
|
if ( $version['LDAP_OPT_REFERRALS'] == 0 ) {
|
||||||
|
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF';
|
||||||
|
} else {
|
||||||
|
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON';
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Determines whether LDAP I/O operations are automatically restarted if they abort prematurely.
|
||||||
|
LDAP_OPT_ON
|
||||||
|
LDAP_OPT_OFF
|
||||||
|
Default: OFF
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] );
|
||||||
|
if ( $version['LDAP_OPT_RESTART'] == 0 ) {
|
||||||
|
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF';
|
||||||
|
} else {
|
||||||
|
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON';
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server.
|
||||||
|
LDAP_VERSION2 (2)
|
||||||
|
LDAP_VERSION3 (3)
|
||||||
|
Default: LDAP_VERSION2 (2)
|
||||||
|
*/
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] );
|
||||||
|
if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) {
|
||||||
|
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2';
|
||||||
|
} else {
|
||||||
|
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3';
|
||||||
|
|
||||||
|
}
|
||||||
|
/* The host name (or list of hosts) for the primary LDAP server. */
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] );
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] );
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] );
|
||||||
|
ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] );
|
||||||
|
|
||||||
|
return $this->version = $version;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_ldap extends ADORecordSet{
|
||||||
|
|
||||||
|
var $databaseType = "ldap";
|
||||||
|
var $canSeek = false;
|
||||||
|
var $_entryID; /* keeps track of the entry resource identifier */
|
||||||
|
|
||||||
|
function ADORecordSet_ldap($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM:
|
||||||
|
$this->fetchMode = LDAP_NUM;
|
||||||
|
break;
|
||||||
|
case ADODB_FETCH_ASSOC:
|
||||||
|
$this->fetchMode = LDAP_ASSOC;
|
||||||
|
break;
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = LDAP_BOTH;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
This could be teaked to respect the $COUNTRECS directive from ADODB
|
||||||
|
It's currently being used in the _fetch() function and the
|
||||||
|
GetAssoc() function
|
||||||
|
*/
|
||||||
|
$this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return whole recordset as a multi-dimensional associative array
|
||||||
|
*/
|
||||||
|
function GetAssoc($force_array = false, $first2cols = false)
|
||||||
|
{
|
||||||
|
$records = $this->_numOfRows;
|
||||||
|
$results = array();
|
||||||
|
for ( $i=0; $i < $records; $i++ ) {
|
||||||
|
foreach ( $this->fields as $k=>$v ) {
|
||||||
|
if ( is_array( $v ) ) {
|
||||||
|
if ( $v['count'] == 1 ) {
|
||||||
|
$results[$i][$k] = $v[0];
|
||||||
|
} else {
|
||||||
|
array_shift( $v );
|
||||||
|
$results[$i][$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetRowAssoc()
|
||||||
|
{
|
||||||
|
$results = array();
|
||||||
|
foreach ( $this->fields as $k=>$v ) {
|
||||||
|
if ( is_array( $v ) ) {
|
||||||
|
if ( $v['count'] == 1 ) {
|
||||||
|
$results[$k] = $v[0];
|
||||||
|
} else {
|
||||||
|
array_shift( $v );
|
||||||
|
$results[$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetRowNums()
|
||||||
|
{
|
||||||
|
$results = array();
|
||||||
|
foreach ( $this->fields as $k=>$v ) {
|
||||||
|
static $i = 0;
|
||||||
|
if (is_array( $v )) {
|
||||||
|
if ( $v['count'] == 1 ) {
|
||||||
|
$results[$i] = $v[0];
|
||||||
|
} else {
|
||||||
|
array_shift( $v );
|
||||||
|
$results[$i] = $v;
|
||||||
|
}
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ( $this->_currentRow == 0 ) {
|
||||||
|
$this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID );
|
||||||
|
} else {
|
||||||
|
$this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID );
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID );
|
||||||
|
$this->_numOfFields = $this->fields['count'];
|
||||||
|
switch ( $this->fetchMode ) {
|
||||||
|
|
||||||
|
case LDAP_ASSOC:
|
||||||
|
$this->fields = $this->GetRowAssoc();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LDAP_NUM:
|
||||||
|
$this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LDAP_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fields = $this->GetRowNums();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return ( is_array( $this->fields ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close() {
|
||||||
|
@ldap_free_result( $this->_queryID );
|
||||||
|
$this->_queryID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
1054
includes/adodb/drivers/adodb-mssql.inc.php
Normal file
1054
includes/adodb/drivers/adodb-mssql.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
171
includes/adodb/drivers/adodb-mssql_n.inc.php
Normal file
171
includes/adodb/drivers/adodb-mssql_n.inc.php
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/// $Id $
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// //
|
||||||
|
// NOTICE OF COPYRIGHT //
|
||||||
|
// //
|
||||||
|
// ADOdb - Database Abstraction Library for PHP //
|
||||||
|
// http://adodb.sourceforge.net/ //
|
||||||
|
// //
|
||||||
|
// Copyright (C) 2000-2008 John Lim (jlim\@natsoft.com.my) //
|
||||||
|
// All rights reserved. //
|
||||||
|
// Released under both BSD license and LGPL library license. //
|
||||||
|
// Whenever there is any discrepancy between the two licenses, //
|
||||||
|
// the BSD license will take precedence //
|
||||||
|
// //
|
||||||
|
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
|
||||||
|
// http://moodle.com //
|
||||||
|
// //
|
||||||
|
// Copyright (C) 2001-3001 Martin Dougiamas http://dougiamas.com //
|
||||||
|
// (C) 2001-3001 Eloy Lafuente (stronk7) http://contiento.com //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or //
|
||||||
|
// (at your option) any later version. //
|
||||||
|
// //
|
||||||
|
// This program 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 General Public License for more details: //
|
||||||
|
// //
|
||||||
|
// http://www.gnu.org/copyleft/gpl.html //
|
||||||
|
// //
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MSSQL Driver with auto-prepended "N" for correct unicode storage
|
||||||
|
* of SQL literal strings. Intended to be used with MSSQL drivers that
|
||||||
|
* are sending UCS-2 data to MSSQL (FreeTDS and ODBTP) in order to get
|
||||||
|
* true cross-db compatibility from the application point of view.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
// one useful constant
|
||||||
|
if (!defined('SINGLEQUOTE')) define('SINGLEQUOTE', "'");
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php');
|
||||||
|
|
||||||
|
class ADODB_mssql_n extends ADODB_mssql {
|
||||||
|
var $databaseType = "mssql_n";
|
||||||
|
|
||||||
|
function ADODB_mssqlpo()
|
||||||
|
{
|
||||||
|
ADODB_mssql::ADODB_mssql();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
$sql = $this->_appendN($sql);
|
||||||
|
return ADODB_mssql::_query($sql,$inputarr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function will intercept all the literals used in the SQL, prepending the "N" char to them
|
||||||
|
* in order to allow mssql to store properly data sent in the correct UCS-2 encoding (by freeTDS
|
||||||
|
* and ODBTP) keeping SQL compatibility at ADOdb level (instead of hacking every project to add
|
||||||
|
* the "N" notation when working against MSSQL.
|
||||||
|
*
|
||||||
|
* Note that this hack only must be used if ALL the char-based columns in your DB are of type nchar,
|
||||||
|
* nvarchar and ntext
|
||||||
|
*/
|
||||||
|
function _appendN($sql) {
|
||||||
|
|
||||||
|
$result = $sql;
|
||||||
|
|
||||||
|
/// Check we have some single quote in the query. Exit ok.
|
||||||
|
if (strpos($sql, SINGLEQUOTE) === false) {
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check we haven't an odd number of single quotes (this can cause problems below
|
||||||
|
/// and should be considered one wrong SQL). Exit with debug info.
|
||||||
|
if ((substr_count($sql, SINGLEQUOTE) & 1)) {
|
||||||
|
if ($this->debug) {
|
||||||
|
ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Wrong number of quotes (odd)");
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check we haven't any backslash + single quote combination. It should mean wrong
|
||||||
|
/// backslashes use (bad magic_quotes_sybase?). Exit with debug info.
|
||||||
|
$regexp = '/(\\\\' . SINGLEQUOTE . '[^' . SINGLEQUOTE . '])/';
|
||||||
|
if (preg_match($regexp, $sql)) {
|
||||||
|
if ($this->debug) {
|
||||||
|
ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Found bad use of backslash + single quote");
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Remove pairs of single-quotes
|
||||||
|
$pairs = array();
|
||||||
|
$regexp = '/(' . SINGLEQUOTE . SINGLEQUOTE . ')/';
|
||||||
|
preg_match_all($regexp, $result, $list_of_pairs);
|
||||||
|
if ($list_of_pairs) {
|
||||||
|
foreach (array_unique($list_of_pairs[0]) as $key=>$value) {
|
||||||
|
$pairs['<@#@#@PAIR-'.$key.'@#@#@>'] = $value;
|
||||||
|
}
|
||||||
|
if (!empty($pairs)) {
|
||||||
|
$result = str_replace($pairs, array_keys($pairs), $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Remove the rest of literals present in the query
|
||||||
|
$literals = array();
|
||||||
|
$regexp = '/(N?' . SINGLEQUOTE . '.*?' . SINGLEQUOTE . ')/is';
|
||||||
|
preg_match_all($regexp, $result, $list_of_literals);
|
||||||
|
if ($list_of_literals) {
|
||||||
|
foreach (array_unique($list_of_literals[0]) as $key=>$value) {
|
||||||
|
$literals['<#@#@#LITERAL-'.$key.'#@#@#>'] = $value;
|
||||||
|
}
|
||||||
|
if (!empty($literals)) {
|
||||||
|
$result = str_replace($literals, array_keys($literals), $result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Analyse literals to prepend the N char to them if their contents aren't numeric
|
||||||
|
if (!empty($literals)) {
|
||||||
|
foreach ($literals as $key=>$value) {
|
||||||
|
if (!is_numeric(trim($value, SINGLEQUOTE))) {
|
||||||
|
/// Non numeric string, prepend our dear N
|
||||||
|
$literals[$key] = 'N' . trim($value, 'N'); //Trimming potentially existing previous "N"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Re-apply literals to the text
|
||||||
|
if (!empty($literals)) {
|
||||||
|
$result = str_replace(array_keys($literals), $literals, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Any pairs followed by N' must be switched to N' followed by those pairs
|
||||||
|
/// (or strings beginning with single quotes will fail)
|
||||||
|
$result = preg_replace("/((<@#@#@PAIR-(\d+)@#@#@>)+)N'/", "N'$1", $result);
|
||||||
|
|
||||||
|
/// Re-apply pairs of single-quotes to the text
|
||||||
|
if (!empty($pairs)) {
|
||||||
|
$result = str_replace(array_keys($pairs), $pairs, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Print transformation if debug = on
|
||||||
|
if ($result != $sql && $this->debug) {
|
||||||
|
ADOConnection::outp("{$this->databaseType} internal transformation:<br>{$sql}<br>to<br>{$result}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordset_mssql_n extends ADORecordset_mssql {
|
||||||
|
var $databaseType = "mssql_n";
|
||||||
|
function ADORecordset_mssql_n($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_mssql($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
902
includes/adodb/drivers/adodb-mssqlnative.inc.php
Normal file
902
includes/adodb/drivers/adodb-mssqlnative.inc.php
Normal file
@ -0,0 +1,902 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Native mssql driver. Requires mssql client. Works on Windows.
|
||||||
|
http://www.microsoft.com/sql/technologies/php/default.mspx
|
||||||
|
To configure for Unix, see
|
||||||
|
http://phpbuilder.com/columns/alberto20000919.php3
|
||||||
|
|
||||||
|
$stream = sqlsrv_get_field($stmt, $index, SQLSRV_SQLTYPE_STREAM(SQLSRV_ENC_BINARY));
|
||||||
|
stream_filter_append($stream, "convert.iconv.ucs-2/utf-8"); // Voila, UTF-8 can be read directly from $stream
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002
|
||||||
|
// and this causes tons of problems because localized versions of
|
||||||
|
// MSSQL will return the dates in dmy or mdy order; and also the
|
||||||
|
// month strings depends on what language has been configured. The
|
||||||
|
// following two variables allow you to control the localization
|
||||||
|
// settings - Ugh.
|
||||||
|
//
|
||||||
|
// MORE LOCALIZATION INFO
|
||||||
|
// ----------------------
|
||||||
|
// To configure datetime, look for and modify sqlcommn.loc,
|
||||||
|
// typically found in c:\mssql\install
|
||||||
|
// Also read :
|
||||||
|
// http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918
|
||||||
|
// Alternatively use:
|
||||||
|
// CONVERT(char(12),datecol,120)
|
||||||
|
//
|
||||||
|
// Also if your month is showing as month-1,
|
||||||
|
// e.g. Jan 13, 2002 is showing as 13/0/2002, then see
|
||||||
|
// http://phplens.com/lens/lensforum/msgs.php?id=7048&x=1
|
||||||
|
// it's a localisation problem.
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_assoc
|
||||||
|
if (ADODB_PHPVER >= 0x4300) {
|
||||||
|
// docs say 4.2.0, but testing shows only since 4.3.0 does it work!
|
||||||
|
ini_set('mssql.datetimeconvert',0);
|
||||||
|
} else {
|
||||||
|
global $ADODB_mssql_mths; // array, months must be upper-case
|
||||||
|
$ADODB_mssql_date_order = 'mdy';
|
||||||
|
$ADODB_mssql_mths = array(
|
||||||
|
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
|
||||||
|
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// Call this to autoset $ADODB_mssql_date_order at the beginning of your code,
|
||||||
|
// just after you connect to the database. Supports mdy and dmy only.
|
||||||
|
// Not required for PHP 4.2.0 and above.
|
||||||
|
function AutoDetect_MSSQL_Date_Order($conn)
|
||||||
|
{
|
||||||
|
global $ADODB_mssql_date_order;
|
||||||
|
$adate = $conn->GetOne('select getdate()');
|
||||||
|
if ($adate) {
|
||||||
|
$anum = (int) $adate;
|
||||||
|
if ($anum > 0) {
|
||||||
|
if ($anum > 31) {
|
||||||
|
//ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently");
|
||||||
|
} else
|
||||||
|
$ADODB_mssql_date_order = 'dmy';
|
||||||
|
} else
|
||||||
|
$ADODB_mssql_date_order = 'mdy';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADODB_mssqlnative extends ADOConnection {
|
||||||
|
var $databaseType = "mssqlnative";
|
||||||
|
var $dataProvider = "mssqlnative";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $substr = "substring";
|
||||||
|
var $length = 'len';
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $poorAffectedRows = false;
|
||||||
|
var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'";
|
||||||
|
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))";
|
||||||
|
var $metaColumnsSQL = # xtype==61 is datetime
|
||||||
|
"select c.name,t.name,c.length,
|
||||||
|
(case when c.xusertype=61 then 0 else c.xprec end),
|
||||||
|
(case when c.xusertype=61 then 0 else c.xscale end)
|
||||||
|
from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
|
||||||
|
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||||
|
var $sysTimeStamp = 'GetDate()';
|
||||||
|
var $maxParameterLen = 4000;
|
||||||
|
var $arrayClass = 'ADORecordSet_array_mssqlnative';
|
||||||
|
var $uniqueSort = true;
|
||||||
|
var $leftOuter = '*=';
|
||||||
|
var $rightOuter = '=*';
|
||||||
|
var $ansiOuter = true; // for mssql7 or later
|
||||||
|
var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000
|
||||||
|
var $uniqueOrderBy = true;
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
var $_dropSeqSQL = "drop table %s";
|
||||||
|
|
||||||
|
function ADODB_mssqlnative()
|
||||||
|
{
|
||||||
|
if ($this->debug) {
|
||||||
|
error_log("<pre>");
|
||||||
|
sqlsrv_set_error_handling( SQLSRV_ERRORS_LOG_ALL );
|
||||||
|
sqlsrv_log_set_severity( SQLSRV_LOG_SEVERITY_ALL );
|
||||||
|
sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
|
||||||
|
sqlsrv_configure('warnings_return_as_errors', 0);
|
||||||
|
} else {
|
||||||
|
sqlsrv_set_error_handling(0);
|
||||||
|
sqlsrv_log_set_severity(0);
|
||||||
|
sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
|
||||||
|
sqlsrv_configure('warnings_return_as_errors', 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
if ($this->fetchMode === false) {
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
} else
|
||||||
|
$savem = $this->SetFetchMode(ADODB_FETCH_NUM);
|
||||||
|
$arrServerInfo = sqlsrv_server_info($this->_connectionID);
|
||||||
|
$arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
|
||||||
|
$arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " ISNULL($field, $ifNull) "; // if MS SQL Server
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
// SCOPE_IDENTITY()
|
||||||
|
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||||
|
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||||
|
// function, or batch. Thus, two statements are in the same scope if
|
||||||
|
// they are in the same stored procedure, function, or batch.
|
||||||
|
return $this->GetOne($this->identitySQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return sqlsrv_rows_affected($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateSequence($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
if($this->debug) error_log("<hr>CreateSequence($seq,$start)");
|
||||||
|
sqlsrv_begin_transaction($this->_connectionID);
|
||||||
|
$start -= 1;
|
||||||
|
$this->Execute("create table $seq (id int)");//was float(53)
|
||||||
|
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||||
|
if (!$ok) {
|
||||||
|
if($this->debug) error_log("<hr>Error: ROLLBACK");
|
||||||
|
sqlsrv_rollback($this->_connectionID);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sqlsrv_commit($this->_connectionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
if($this->debug) error_log("<hr>GenID($seq,$start)");
|
||||||
|
sqlsrv_begin_transaction($this->_connectionID);
|
||||||
|
$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
|
||||||
|
if (!$ok) {
|
||||||
|
$this->Execute("create table $seq (id int)");
|
||||||
|
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||||
|
if (!$ok) {
|
||||||
|
if($this->debug) error_log("<hr>Error: ROLLBACK");
|
||||||
|
sqlsrv_rollback($this->_connectionID);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sqlsrv_commit($this->_connectionID);
|
||||||
|
return $start;
|
||||||
|
}
|
||||||
|
$num = $this->GetOne("select id from $seq");
|
||||||
|
sqlsrv_commit($this->_connectionID);
|
||||||
|
if($this->debug) error_log(" Returning: $num");
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
if (!$col) $col = $this->sysTimeStamp;
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= '+';
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= "datename(yyyy,$col)";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
$s .= "convert(char(3),$col,0)";
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
$s .= "replace(str(month($col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
case 'q':
|
||||||
|
$s .= "datename(quarter,$col)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= "replace(str(day($col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
if ($this->debug) error_log('<hr>begin transaction');
|
||||||
|
sqlsrv_begin_transaction($this->_connectionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->debug) error_log('<hr>commit transaction');
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
sqlsrv_commit($this->_connectionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->debug) error_log('<hr>rollback transaction');
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
sqlsrv_rollback($this->_connectionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$this->BeginTrans();
|
||||||
|
$this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables
|
||||||
|
|
||||||
|
# some operation on both tables table1 and table2
|
||||||
|
|
||||||
|
$this->CommitTrans();
|
||||||
|
|
||||||
|
See http://www.swynk.com/friends/achigrik/SQL70Locks.asp
|
||||||
|
*/
|
||||||
|
function RowLock($tables,$where,$flds='top 1 null as ignore')
|
||||||
|
{
|
||||||
|
if (!$this->transCnt) $this->BeginTrans();
|
||||||
|
return $this->GetOne("select $flds from $tables with (ROWLOCK,HOLDLOCK) where $where");
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
$this->database = $dbName;
|
||||||
|
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||||
|
if ($this->_connectionID) {
|
||||||
|
$rs = $this->Execute('USE '.$dbName);
|
||||||
|
if($rs) {
|
||||||
|
return true;
|
||||||
|
} else return false;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
$retErrors = sqlsrv_errors(SQLSRV_ERR_ALL);
|
||||||
|
if($retErrors != null) {
|
||||||
|
foreach($retErrors as $arrError) {
|
||||||
|
$this->_errorMsg .= "SQLState: ".$arrError[ 'SQLSTATE']."\n";
|
||||||
|
$this->_errorMsg .= "Error Code: ".$arrError[ 'code']."\n";
|
||||||
|
$this->_errorMsg .= "Message: ".$arrError[ 'message']."\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->_errorMsg = "No errors found";
|
||||||
|
}
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode;
|
||||||
|
$err = sqlsrv_errors(SQLSRV_ERR_ALL);
|
||||||
|
if($err[0]) return $err[0]['code'];
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('sqlsrv_connect')) return null;
|
||||||
|
$connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword);
|
||||||
|
if ($this->debug) error_log("<hr>connecting... hostname: $argHostname params: ".var_export($connectionInfo,true));
|
||||||
|
//if ($this->debug) error_log("<hr>_connectionID before: ".serialize($this->_connectionID));
|
||||||
|
if(!($this->_connectionID = sqlsrv_connect($argHostname,$connectionInfo))) {
|
||||||
|
if ($this->debug) error_log( "<hr><b>errors</b>: ".print_r( sqlsrv_errors(), true));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//if ($this->debug) error_log(" _connectionID after: ".serialize($this->_connectionID));
|
||||||
|
//if ($this->debug) error_log("<hr>defined functions: <pre>".var_export(get_defined_functions(),true)."</pre>");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
//return null;//not implemented. NOTE: Persistent connections have no effect if PHP is used as a CGI program. (FastCGI!)
|
||||||
|
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
$stmt = sqlsrv_prepare( $this->_connectionID, $sql);
|
||||||
|
if (!$stmt) return $sql;
|
||||||
|
return array($sql,$stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns concatenated string
|
||||||
|
// MSSQL requires integers to be cast as strings
|
||||||
|
// automatically cast every datatype to VARCHAR(255)
|
||||||
|
// @author David Rogers (introspectshun)
|
||||||
|
function Concat()
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
$arr = func_get_args();
|
||||||
|
|
||||||
|
// Split single record on commas, if possible
|
||||||
|
if (sizeof($arr) == 1) {
|
||||||
|
foreach ($arr as $arg) {
|
||||||
|
$args = explode(',', $arg);
|
||||||
|
}
|
||||||
|
$arr = $args;
|
||||||
|
}
|
||||||
|
|
||||||
|
array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";'));
|
||||||
|
$s = implode('+',$arr);
|
||||||
|
if (sizeof($arr) > 0) return "$s";
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Unfortunately, it appears that mssql cannot handle varbinary > 255 chars
|
||||||
|
So all your blobs must be of type "image".
|
||||||
|
|
||||||
|
Remember to set in php.ini the following...
|
||||||
|
|
||||||
|
; Valid range 0 - 2147483647. Default = 4096.
|
||||||
|
mssql.textlimit = 0 ; zero to pass through
|
||||||
|
|
||||||
|
; Valid range 0 - 2147483647. Default = 4096.
|
||||||
|
mssql.textsize = 0 ; zero to pass through
|
||||||
|
*/
|
||||||
|
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
|
||||||
|
if (strtoupper($blobtype) == 'CLOB') {
|
||||||
|
$sql = "UPDATE $table SET $column='" . $val . "' WHERE $where";
|
||||||
|
return $this->Execute($sql) != false;
|
||||||
|
}
|
||||||
|
$sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where";
|
||||||
|
return $this->Execute($sql) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
$this->_errorMsg = false;
|
||||||
|
if (is_array($inputarr)) {
|
||||||
|
$rez = sqlsrv_query($this->_connectionID,$sql,$inputarr);
|
||||||
|
} else if (is_array($sql)) {
|
||||||
|
$rez = sqlsrv_query($this->_connectionID,$sql[1],$inputarr);
|
||||||
|
} else {
|
||||||
|
$rez = sqlsrv_query($this->_connectionID,$sql);
|
||||||
|
}
|
||||||
|
if ($this->debug) error_log("<hr>running query: ".var_export($sql,true)."<hr>input array: ".var_export($inputarr,true)."<hr>result: ".var_export($rez,true));//"<hr>connection: ".serialize($this->_connectionID)
|
||||||
|
//fix for returning true on anything besides select statements
|
||||||
|
if (is_array($sql)) $sql = $sql[1];
|
||||||
|
$sql = ltrim($sql);
|
||||||
|
if(stripos($sql, 'SELECT') !== 0 && $rez !== false) {
|
||||||
|
if ($this->debug) error_log(" isn't a select query, returning boolean true");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//end fix
|
||||||
|
if(!$rez) $rez = false;
|
||||||
|
return $rez;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
if ($this->transCnt) $this->RollbackTrans();
|
||||||
|
$rez = @sqlsrv_close($this->_connectionID);
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return $rez;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||||
|
function UnixDate($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_mssql::UnixDate($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_mssql::UnixTimeStamp($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
function &MetaIndexes($table,$primary=false)
|
||||||
|
{
|
||||||
|
$table = $this->qstr($table);
|
||||||
|
|
||||||
|
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||||
|
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||||
|
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||||
|
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||||
|
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||||
|
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||||
|
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
|
||||||
|
ORDER BY O.name, I.Name, K.keyno";
|
||||||
|
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
if (!$primary && $row[5]) continue;
|
||||||
|
|
||||||
|
$indexes[$row[0]]['unique'] = $row[6];
|
||||||
|
$indexes[$row[0]]['columns'][] = $row[1];
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$table = $this->qstr(strtoupper($table));
|
||||||
|
|
||||||
|
$sql =
|
||||||
|
"select object_name(constid) as constraint_name,
|
||||||
|
col_name(fkeyid, fkey) as column_name,
|
||||||
|
object_name(rkeyid) as referenced_table_name,
|
||||||
|
col_name(rkeyid, rkey) as referenced_column_name
|
||||||
|
from sysforeignkeys
|
||||||
|
where upper(object_name(fkeyid)) = $table
|
||||||
|
order by constraint_name, referenced_table_name, keyno";
|
||||||
|
|
||||||
|
$constraints =& $this->GetArray($sql);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
$arr = false;
|
||||||
|
foreach($constraints as $constr) {
|
||||||
|
//print_r($constr);
|
||||||
|
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
|
||||||
|
}
|
||||||
|
if (!$arr) return false;
|
||||||
|
|
||||||
|
$arr2 = false;
|
||||||
|
|
||||||
|
foreach($arr as $k => $v) {
|
||||||
|
foreach($v as $a => $b) {
|
||||||
|
if ($upper) $a = strtoupper($a);
|
||||||
|
$arr2[$a] = $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//From: Fernando Moreira <FMoreira@imediata.pt>
|
||||||
|
function MetaDatabases()
|
||||||
|
{
|
||||||
|
$this->SelectDB("master");
|
||||||
|
$rs =& $this->Execute($this->metaDatabasesSQL);
|
||||||
|
$rows = $rs->GetRows();
|
||||||
|
$ret = array();
|
||||||
|
for($i=0;$i<count($rows);$i++) {
|
||||||
|
$ret[] = $rows[$i][0];
|
||||||
|
}
|
||||||
|
$this->SelectDB($this->database);
|
||||||
|
if($ret)
|
||||||
|
return $ret;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Stein-Aksel Basma" <basma@accelero.no>
|
||||||
|
// tested with MSSQL 2000
|
||||||
|
function &MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
if (!$schema) $schema = $this->database;
|
||||||
|
if ($schema) $schema = "and k.table_catalog like '$schema%'";
|
||||||
|
|
||||||
|
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
|
||||||
|
information_schema.table_constraints tc
|
||||||
|
where tc.constraint_name = k.constraint_name and tc.constraint_type =
|
||||||
|
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$a = $this->GetCol($sql);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if ($a && sizeof($a)>0) return $a;
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
if ($mask) {
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
$mask = $this->qstr(($mask));
|
||||||
|
$this->metaTablesSQL .= " AND name like $mask";
|
||||||
|
}
|
||||||
|
$ret =& ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_mssqlnative extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = "mssqlnative";
|
||||||
|
var $canSeek = false;
|
||||||
|
var $fieldOffset = 0;
|
||||||
|
// _mths works only in non-localised system
|
||||||
|
|
||||||
|
function ADORecordset_mssqlnative($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
return $this->ADORecordSet($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
if ($this->connection->debug) error_log("(before) ADODB_COUNTRECS: {$ADODB_COUNTRECS} _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}");
|
||||||
|
/*$retRowsAff = sqlsrv_rows_affected($this->_queryID);//"If you need to determine the number of rows a query will return before retrieving the actual results, appending a SELECT COUNT ... query would let you get that information, and then a call to next_result would move you to the "real" results."
|
||||||
|
error_log("rowsaff: ".serialize($retRowsAff));
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS)? $retRowsAff:-1;*/
|
||||||
|
$this->_numOfRows = -1;//not supported
|
||||||
|
$fieldmeta = sqlsrv_field_metadata($this->_queryID);
|
||||||
|
$this->_numOfFields = ($fieldmeta)? count($fieldmeta):-1;
|
||||||
|
if ($this->connection->debug) error_log("(after) _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se>
|
||||||
|
// get next resultset - requires PHP 4.0.5 or later
|
||||||
|
function NextRecordSet()
|
||||||
|
{
|
||||||
|
if (!sqlsrv_next_result($this->_queryID)) return false;
|
||||||
|
$this->_inited = false;
|
||||||
|
$this->bind = false;
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
$this->Init();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode != ADODB_FETCH_NUM) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: an object containing field information.
|
||||||
|
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||||
|
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||||
|
fetchField() is retrieved. */
|
||||||
|
|
||||||
|
function &FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
if ($this->connection->debug) error_log("<hr>fetchfield: $fieldOffset, fetch array: <pre>".print_r($this->fields,true)."</pre> backtrace: ".adodb_backtrace(false));
|
||||||
|
if ($fieldOffset != -1) $this->fieldOffset = $fieldOffset;
|
||||||
|
$arrKeys = array_keys($this->fields);
|
||||||
|
if(array_key_exists($this->fieldOffset,$arrKeys) && !array_key_exists($arrKeys[$this->fieldOffset],$this->fields)) {
|
||||||
|
$f = false;
|
||||||
|
} else {
|
||||||
|
$f = $this->fields[ $arrKeys[$this->fieldOffset] ];
|
||||||
|
if($fieldOffset == -1) $this->fieldOffset++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($f)) {
|
||||||
|
$f = false;//PHP Notice: Only variable references should be returned by reference
|
||||||
|
}
|
||||||
|
return $f;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;//There is no support for cursors in the driver at this time. All data is returned via forward-only streams.
|
||||||
|
}
|
||||||
|
|
||||||
|
// speedup
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if ($this->connection->debug) error_log("movenext()");
|
||||||
|
//if ($this->connection->debug) error_log("eof (beginning): ".$this->EOF);
|
||||||
|
if ($this->EOF) return false;
|
||||||
|
|
||||||
|
$this->_currentRow++;
|
||||||
|
if ($this->connection->debug) error_log("_currentRow: ".$this->_currentRow);
|
||||||
|
|
||||||
|
if ($this->_fetch()) return true;
|
||||||
|
$this->EOF = true;
|
||||||
|
//if ($this->connection->debug) error_log("eof (end): ".$this->EOF);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4
|
||||||
|
// also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot!
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
if ($this->connection->debug) error_log("_fetch()");
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_NUM) {
|
||||||
|
if ($this->connection->debug) error_log("fetch mode: both");
|
||||||
|
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_BOTH);
|
||||||
|
} else {
|
||||||
|
if ($this->connection->debug) error_log("fetch mode: assoc");
|
||||||
|
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_ASSOC);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ADODB_ASSOC_CASE == 0) {
|
||||||
|
foreach($this->fields as $k=>$v) {
|
||||||
|
$this->fields[strtolower($k)] = $v;
|
||||||
|
}
|
||||||
|
} else if (ADODB_ASSOC_CASE == 1) {
|
||||||
|
foreach($this->fields as $k=>$v) {
|
||||||
|
$this->fields[strtoupper($k)] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($this->connection->debug) error_log("fetch mode: num");
|
||||||
|
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_NUMERIC);
|
||||||
|
}
|
||||||
|
if(is_array($this->fields) && array_key_exists(1,$this->fields) && !array_key_exists(0,$this->fields)) {//fix fetch numeric keys since they're not 0 based
|
||||||
|
$arrFixed = array();
|
||||||
|
foreach($this->fields as $key=>$value) {
|
||||||
|
if(is_numeric($key)) {
|
||||||
|
$arrFixed[$key-1] = $value;
|
||||||
|
} else {
|
||||||
|
$arrFixed[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//if($this->connection->debug) error_log("<hr>fixing non 0 based return array, old: ".print_r($this->fields,true)." new: ".print_r($arrFixed,true));
|
||||||
|
$this->fields = $arrFixed;
|
||||||
|
}
|
||||||
|
if(is_array($this->fields)) {
|
||||||
|
foreach($this->fields as $key=>$value) {
|
||||||
|
if (is_object($value) && method_exists($value, 'format')) {//is DateTime object
|
||||||
|
$this->fields[$key] = $value->format("Y-m-d\TH:i:s\Z");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($this->fields === null) $this->fields = false;
|
||||||
|
if ($this->connection->debug) error_log("<hr>after _fetch, fields: <pre>".print_r($this->fields,true)." backtrace: ".adodb_backtrace(false));
|
||||||
|
return $this->fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||||
|
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$rez = sqlsrv_free_stmt($this->_queryID);
|
||||||
|
$this->_queryID = false;
|
||||||
|
return $rez;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||||
|
function UnixDate($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_mssqlnative::UnixDate($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_mssqlnative::UnixTimeStamp($v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_array_mssqlnative extends ADORecordSet_array {
|
||||||
|
function ADORecordSet_array_mssqlnative($id=-1,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_array($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||||
|
function UnixDate($v)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v);
|
||||||
|
|
||||||
|
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
|
||||||
|
|
||||||
|
//Dec 30 2000 12:00AM
|
||||||
|
if ($ADODB_mssql_date_order == 'dmy') {
|
||||||
|
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
|
||||||
|
return parent::UnixDate($v);
|
||||||
|
}
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$theday = $rr[1];
|
||||||
|
$themth = substr(strtoupper($rr[2]),0,3);
|
||||||
|
} else {
|
||||||
|
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
|
||||||
|
return parent::UnixDate($v);
|
||||||
|
}
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$theday = $rr[2];
|
||||||
|
$themth = substr(strtoupper($rr[1]),0,3);
|
||||||
|
}
|
||||||
|
$themth = $ADODB_mssql_mths[$themth];
|
||||||
|
if ($themth <= 0) return false;
|
||||||
|
// h-m-s-MM-DD-YY
|
||||||
|
return mktime(0,0,0,$themth,$theday,$rr[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v);
|
||||||
|
|
||||||
|
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
|
||||||
|
|
||||||
|
//Dec 30 2000 12:00AM
|
||||||
|
if ($ADODB_mssql_date_order == 'dmy') {
|
||||||
|
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
|
||||||
|
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$theday = $rr[1];
|
||||||
|
$themth = substr(strtoupper($rr[2]),0,3);
|
||||||
|
} else {
|
||||||
|
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
|
||||||
|
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$theday = $rr[2];
|
||||||
|
$themth = substr(strtoupper($rr[1]),0,3);
|
||||||
|
}
|
||||||
|
|
||||||
|
$themth = $ADODB_mssql_mths[$themth];
|
||||||
|
if ($themth <= 0) return false;
|
||||||
|
|
||||||
|
switch (strtoupper($rr[6])) {
|
||||||
|
case 'P':
|
||||||
|
if ($rr[4]<12) $rr[4] += 12;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if ($rr[4]==12) $rr[4] = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// h-m-s-MM-DD-YY
|
||||||
|
return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Code Example 1:
|
||||||
|
|
||||||
|
select object_name(constid) as constraint_name,
|
||||||
|
object_name(fkeyid) as table_name,
|
||||||
|
col_name(fkeyid, fkey) as column_name,
|
||||||
|
object_name(rkeyid) as referenced_table_name,
|
||||||
|
col_name(rkeyid, rkey) as referenced_column_name
|
||||||
|
from sysforeignkeys
|
||||||
|
where object_name(fkeyid) = x
|
||||||
|
order by constraint_name, table_name, referenced_table_name, keyno
|
||||||
|
|
||||||
|
Code Example 2:
|
||||||
|
select constraint_name,
|
||||||
|
column_name,
|
||||||
|
ordinal_position
|
||||||
|
from information_schema.key_column_usage
|
||||||
|
where constraint_catalog = db_name()
|
||||||
|
and table_name = x
|
||||||
|
order by constraint_name, ordinal_position
|
||||||
|
|
||||||
|
http://www.databasejournal.com/scripts/article.php/1440551
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
62
includes/adodb/drivers/adodb-mssqlpo.inc.php
Normal file
62
includes/adodb/drivers/adodb-mssqlpo.inc.php
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
* Portable MSSQL Driver that supports || instead of +
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
The big difference between mssqlpo and it's parent mssql is that mssqlpo supports
|
||||||
|
the more standard || string concatenation operator.
|
||||||
|
*/
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php');
|
||||||
|
|
||||||
|
class ADODB_mssqlpo extends ADODB_mssql {
|
||||||
|
var $databaseType = "mssqlpo";
|
||||||
|
var $concat_operator = '||';
|
||||||
|
|
||||||
|
function ADODB_mssqlpo()
|
||||||
|
{
|
||||||
|
ADODB_mssql::ADODB_mssql();
|
||||||
|
}
|
||||||
|
|
||||||
|
function PrepareSP($sql)
|
||||||
|
{
|
||||||
|
if (!$this->_has_mssql_init) {
|
||||||
|
ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||||
|
$stmt = mssql_init($sql,$this->_connectionID);
|
||||||
|
if (!$stmt) return $sql;
|
||||||
|
return array($sql,$stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||||
|
return ADODB_mssql::_query($sql,$inputarr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordset_mssqlpo extends ADORecordset_mssql {
|
||||||
|
var $databaseType = "mssqlpo";
|
||||||
|
function ADORecordset_mssqlpo($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_mssql($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
791
includes/adodb/drivers/adodb-mysql.inc.php
Normal file
791
includes/adodb/drivers/adodb-mysql.inc.php
Normal file
@ -0,0 +1,791 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
MySQL code that does not support transactions. Use mysqlt if you need transactions.
|
||||||
|
Requires mysql client. Works on Windows and Unix.
|
||||||
|
|
||||||
|
28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (! defined("_ADODB_MYSQL_LAYER")) {
|
||||||
|
define("_ADODB_MYSQL_LAYER", 1 );
|
||||||
|
|
||||||
|
class ADODB_mysql extends ADOConnection {
|
||||||
|
var $databaseType = 'mysql';
|
||||||
|
var $dataProvider = 'mysql';
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $metaTablesSQL = "SHOW TABLES";
|
||||||
|
var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $hasLimit = true;
|
||||||
|
var $hasMoveFirst = true;
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $isoDates = true; // accepts dates in ISO format
|
||||||
|
var $sysDate = 'CURDATE()';
|
||||||
|
var $sysTimeStamp = 'NOW()';
|
||||||
|
var $hasTransactions = false;
|
||||||
|
var $forceNewConnect = false;
|
||||||
|
var $poorAffectedRows = true;
|
||||||
|
var $clientFlags = 0;
|
||||||
|
var $substr = "substring";
|
||||||
|
var $nameQuote = '`'; /// string to use to quote identifiers and names
|
||||||
|
var $compat323 = false; // true if compat with mysql 3.23
|
||||||
|
|
||||||
|
function ADODB_mysql()
|
||||||
|
{
|
||||||
|
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||||
|
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " IFNULL($field, $ifNull) "; // if MySQL
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
if ($showSchema && is_string($showSchema)) {
|
||||||
|
$this->metaTablesSQL .= " from $showSchema";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$mask = $this->qstr($mask);
|
||||||
|
$this->metaTablesSQL .= " like $mask";
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaIndexes ($table, $primary = FALSE, $owner=false)
|
||||||
|
{
|
||||||
|
// save old fetch mode
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get index details
|
||||||
|
$rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
|
||||||
|
|
||||||
|
// restore fetchmode
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array ();
|
||||||
|
|
||||||
|
// parse index data into array
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
if ($primary == FALSE AND $row[2] == 'PRIMARY') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($indexes[$row[2]])) {
|
||||||
|
$indexes[$row[2]] = array(
|
||||||
|
'unique' => ($row[1] == 0),
|
||||||
|
'columns' => array()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort columns by order in the index
|
||||||
|
foreach ( array_keys ($indexes) as $index )
|
||||||
|
{
|
||||||
|
ksort ($indexes[$index]['columns']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// if magic quotes disabled, use mysql_real_escape_string()
|
||||||
|
function qstr($s,$magic_quotes=false)
|
||||||
|
{
|
||||||
|
if (is_null($s)) return 'NULL';
|
||||||
|
if (!$magic_quotes) {
|
||||||
|
|
||||||
|
if (ADODB_PHPVER >= 0x4300) {
|
||||||
|
if (is_resource($this->_connectionID))
|
||||||
|
return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
|
||||||
|
}
|
||||||
|
if ($this->replaceQuote[0] == '\\'){
|
||||||
|
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
|
||||||
|
}
|
||||||
|
return "'".str_replace("'",$this->replaceQuote,$s)."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// undo magic quotes for "
|
||||||
|
$s = str_replace('\\"','"',$s);
|
||||||
|
return "'$s'";
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
|
||||||
|
//return mysql_insert_id($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetOne($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
|
||||||
|
$rs = $this->SelectLimit($sql,1,-1,$inputarr);
|
||||||
|
if ($rs) {
|
||||||
|
$rs->Close();
|
||||||
|
if ($rs->EOF) return false;
|
||||||
|
return reset($rs->fields);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ADOConnection::GetOne($sql,$inputarr);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return mysql_affected_rows($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
|
||||||
|
// Reference on Last_Insert_ID on the recommended way to simulate sequences
|
||||||
|
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
|
||||||
|
var $_genSeqSQL = "create table %s (id int not null)";
|
||||||
|
var $_genSeqCountSQL = "select count(*) from %s";
|
||||||
|
var $_genSeq2SQL = "insert into %s values (%s)";
|
||||||
|
var $_dropSeqSQL = "drop table %s";
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$startID=1)
|
||||||
|
{
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$u = strtoupper($seqname);
|
||||||
|
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||||
|
if (!$ok) return false;
|
||||||
|
return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function GenID($seqname='adodbseq',$startID=1)
|
||||||
|
{
|
||||||
|
// post-nuke sets hasGenID to false
|
||||||
|
if (!$this->hasGenID) return false;
|
||||||
|
|
||||||
|
$savelog = $this->_logsql;
|
||||||
|
$this->_logsql = false;
|
||||||
|
$getnext = sprintf($this->_genIDSQL,$seqname);
|
||||||
|
$holdtransOK = $this->_transOK; // save the current status
|
||||||
|
$rs = @$this->Execute($getnext);
|
||||||
|
if (!$rs) {
|
||||||
|
if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
|
||||||
|
$u = strtoupper($seqname);
|
||||||
|
$this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||||
|
$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
|
||||||
|
if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
|
||||||
|
$rs = $this->Execute($getnext);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rs) {
|
||||||
|
$this->genID = mysql_insert_id($this->_connectionID);
|
||||||
|
$rs->Close();
|
||||||
|
} else
|
||||||
|
$this->genID = 0;
|
||||||
|
|
||||||
|
$this->_logsql = $savelog;
|
||||||
|
return $this->genID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaDatabases()
|
||||||
|
{
|
||||||
|
$qid = mysql_list_dbs($this->_connectionID);
|
||||||
|
$arr = array();
|
||||||
|
$i = 0;
|
||||||
|
$max = mysql_num_rows($qid);
|
||||||
|
while ($i < $max) {
|
||||||
|
$db = mysql_tablename($qid,$i);
|
||||||
|
if ($db != 'mysql') $arr[] = $db;
|
||||||
|
$i += 1;
|
||||||
|
}
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
if (!$col) $col = $this->sysTimeStamp;
|
||||||
|
$s = 'DATE_FORMAT('.$col.",'";
|
||||||
|
$concat = false;
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
/** FALL THROUGH */
|
||||||
|
case '-':
|
||||||
|
case '/':
|
||||||
|
$s .= $ch;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= '%Y';
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
$s .= '%b';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
$s .= '%m';
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= '%d';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Q':
|
||||||
|
case 'q':
|
||||||
|
$s .= "'),Quarter($col)";
|
||||||
|
|
||||||
|
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
|
||||||
|
else $s .= ",('";
|
||||||
|
$concat = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
$s .= '%H';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'h':
|
||||||
|
$s .= '%I';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
$s .= '%i';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
$s .= '%s';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
$s .= '%p';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'w':
|
||||||
|
$s .= '%w';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'W':
|
||||||
|
$s .= '%U';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
$s .= '%W';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$s.="')";
|
||||||
|
if ($concat) $s = "CONCAT($s)";
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns concatenated string
|
||||||
|
// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
|
||||||
|
function Concat()
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
$arr = func_get_args();
|
||||||
|
|
||||||
|
// suggestion by andrew005@mnogo.ru
|
||||||
|
$s = implode(',',$arr);
|
||||||
|
if (strlen($s) > 0) return "CONCAT($s)";
|
||||||
|
else return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function OffsetDate($dayFraction,$date=false)
|
||||||
|
{
|
||||||
|
if (!$date) $date = $this->sysDate;
|
||||||
|
|
||||||
|
$fraction = $dayFraction * 24 * 3600;
|
||||||
|
return $date . ' + INTERVAL ' . $fraction.' SECOND';
|
||||||
|
|
||||||
|
// return "from_unixtime(unix_timestamp($date)+$fraction)";
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!empty($this->port)) $argHostname .= ":".$this->port;
|
||||||
|
|
||||||
|
if (ADODB_PHPVER >= 0x4300)
|
||||||
|
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
|
||||||
|
$this->forceNewConnect,$this->clientFlags);
|
||||||
|
else if (ADODB_PHPVER >= 0x4200)
|
||||||
|
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
|
||||||
|
$this->forceNewConnect);
|
||||||
|
else
|
||||||
|
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
|
||||||
|
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!empty($this->port)) $argHostname .= ":".$this->port;
|
||||||
|
|
||||||
|
if (ADODB_PHPVER >= 0x4300)
|
||||||
|
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
|
||||||
|
else
|
||||||
|
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($this->autoRollback) $this->RollbackTrans();
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
$this->forceNewConnect = true;
|
||||||
|
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
if ($schema) {
|
||||||
|
$dbName = $this->database;
|
||||||
|
$this->SelectDB($schema);
|
||||||
|
}
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||||
|
|
||||||
|
if ($schema) {
|
||||||
|
$this->SelectDB($dbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF){
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$type = $rs->fields[1];
|
||||||
|
|
||||||
|
// split type into type(length):
|
||||||
|
$fld->scale = null;
|
||||||
|
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||||
|
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
|
||||||
|
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||||
|
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$arr = explode(",",$query_array[2]);
|
||||||
|
$fld->enums = $arr;
|
||||||
|
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
|
||||||
|
$fld->max_length = ($zlen > 0) ? $zlen : 1;
|
||||||
|
} else {
|
||||||
|
$fld->type = $type;
|
||||||
|
$fld->max_length = -1;
|
||||||
|
}
|
||||||
|
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||||
|
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||||
|
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||||
|
$fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
|
||||||
|
$fld->unsigned = (strpos($type,'unsigned') !== false);
|
||||||
|
$fld->zerofill = (strpos($type,'zerofill') !== false);
|
||||||
|
|
||||||
|
if (!$fld->binary) {
|
||||||
|
$d = $rs->fields[4];
|
||||||
|
if ($d != '' && $d != 'NULL') {
|
||||||
|
$fld->has_default = true;
|
||||||
|
$fld->default_value = $d;
|
||||||
|
} else {
|
||||||
|
$fld->has_default = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($save == ADODB_FETCH_NUM) {
|
||||||
|
$retarr[] = $fld;
|
||||||
|
} else {
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
}
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
$this->database = $dbName;
|
||||||
|
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||||
|
if ($this->_connectionID) {
|
||||||
|
return @mysql_select_db($dbName,$this->_connectionID);
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parameters use PostgreSQL convention, not MySQL
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
|
||||||
|
{
|
||||||
|
$offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
|
||||||
|
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
|
||||||
|
if ($nrows < 0) $nrows = '18446744073709551615';
|
||||||
|
|
||||||
|
if ($secs)
|
||||||
|
$rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns queryID or false
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
//global $ADODB_COUNTRECS;
|
||||||
|
//if($ADODB_COUNTRECS)
|
||||||
|
return mysql_query($sql,$this->_connectionID);
|
||||||
|
//else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation */
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($this->_logsql) return $this->_errorMsg;
|
||||||
|
if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
|
||||||
|
else $this->_errorMsg = @mysql_error($this->_connectionID);
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error number from previous database operation */
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if ($this->_logsql) return $this->_errorCode;
|
||||||
|
if (empty($this->_connectionID)) return @mysql_errno();
|
||||||
|
else return @mysql_errno($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
@mysql_close($this->_connectionID);
|
||||||
|
$this->_connectionID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum size of C field
|
||||||
|
*/
|
||||||
|
function CharMax()
|
||||||
|
{
|
||||||
|
return 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum size of X field
|
||||||
|
*/
|
||||||
|
function TextMax()
|
||||||
|
{
|
||||||
|
return 4294967295;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
|
||||||
|
function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
|
||||||
|
|
||||||
|
if ( !empty($owner) ) {
|
||||||
|
$table = "$owner.$table";
|
||||||
|
}
|
||||||
|
$a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
|
||||||
|
if ($associative) {
|
||||||
|
$create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
|
||||||
|
} else $create_sql = $a_create_table[1];
|
||||||
|
|
||||||
|
$matches = array();
|
||||||
|
|
||||||
|
if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
|
||||||
|
$foreign_keys = array();
|
||||||
|
$num_keys = count($matches[0]);
|
||||||
|
for ( $i = 0; $i < $num_keys; $i ++ ) {
|
||||||
|
$my_field = explode('`, `', $matches[1][$i]);
|
||||||
|
$ref_table = $matches[2][$i];
|
||||||
|
$ref_field = explode('`, `', $matches[3][$i]);
|
||||||
|
|
||||||
|
if ( $upper ) {
|
||||||
|
$ref_table = strtoupper($ref_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
$foreign_keys[$ref_table] = array();
|
||||||
|
$num_fields = count($my_field);
|
||||||
|
for ( $j = 0; $j < $num_fields; $j ++ ) {
|
||||||
|
if ( $associative ) {
|
||||||
|
$foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
|
||||||
|
} else {
|
||||||
|
$foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $foreign_keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_mysql extends ADORecordSet{
|
||||||
|
|
||||||
|
var $databaseType = "mysql";
|
||||||
|
var $canSeek = true;
|
||||||
|
|
||||||
|
function ADORecordSet_mysql($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
//GLOBAL $ADODB_COUNTRECS;
|
||||||
|
// $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
|
||||||
|
$this->_numOfRows = @mysql_num_rows($this->_queryID);
|
||||||
|
$this->_numOfFields = @mysql_num_fields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
if ($fieldOffset != -1) {
|
||||||
|
$o = @mysql_fetch_field($this->_queryID, $fieldOffset);
|
||||||
|
$f = @mysql_field_flags($this->_queryID,$fieldOffset);
|
||||||
|
if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
|
||||||
|
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
|
||||||
|
if ($o) $o->binary = (strpos($f,'binary')!== false);
|
||||||
|
}
|
||||||
|
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||||
|
$o = @mysql_fetch_field($this->_queryID);
|
||||||
|
if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
|
||||||
|
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
|
||||||
|
}
|
||||||
|
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetRowAssoc($upper=true)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields;
|
||||||
|
else $row = ADORecordSet::GetRowAssoc($upper);
|
||||||
|
return $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
// added @ by "Michael William Miller" <mille562@pilot.msu.edu>
|
||||||
|
if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
|
||||||
|
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
if ($this->_numOfRows == 0) return false;
|
||||||
|
return @mysql_data_seek($this->_queryID,$row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
//return adodb_movenext($this);
|
||||||
|
//if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
|
||||||
|
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
$this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode);
|
||||||
|
return is_array($this->fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close() {
|
||||||
|
@mysql_free_result($this->_queryID);
|
||||||
|
$this->_queryID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
$len = -1; // mysql max_length is not accurate
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'STRING':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'TINYBLOB':
|
||||||
|
case 'TINYTEXT':
|
||||||
|
case 'ENUM':
|
||||||
|
case 'SET':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
case 'LONGTEXT':
|
||||||
|
case 'MEDIUMTEXT':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
// php_mysql extension always returns 'blob' even if 'text'
|
||||||
|
// so we have to check whether binary...
|
||||||
|
case 'IMAGE':
|
||||||
|
case 'LONGBLOB':
|
||||||
|
case 'BLOB':
|
||||||
|
case 'MEDIUMBLOB':
|
||||||
|
case 'BINARY':
|
||||||
|
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||||
|
|
||||||
|
case 'YEAR':
|
||||||
|
case 'DATE': return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'DATETIME':
|
||||||
|
case 'TIMESTAMP': return 'T';
|
||||||
|
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER':
|
||||||
|
case 'BIGINT':
|
||||||
|
case 'TINYINT':
|
||||||
|
case 'MEDIUMINT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
|
||||||
|
if (!empty($fieldobj->primary_key)) return 'R';
|
||||||
|
else return 'I';
|
||||||
|
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
|
||||||
|
function ADORecordSet_ext_mysql($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
return @adodb_movenext($this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
1184
includes/adodb/drivers/adodb-mysqli.inc.php
Normal file
1184
includes/adodb/drivers/adodb-mysqli.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
138
includes/adodb/drivers/adodb-mysqlpo.inc.php
Normal file
138
includes/adodb/drivers/adodb-mysqlpo.inc.php
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
MySQL code that supports transactions. For MySQL 3.23 or later.
|
||||||
|
Code from James Poon <jpoon88@yahoo.com>
|
||||||
|
|
||||||
|
Requires mysql client. Works on Windows and Unix.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php");
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_mysqlt extends ADODB_mysql {
|
||||||
|
var $databaseType = 'mysqlt';
|
||||||
|
var $ansiOuter = true; // for Version 3.23.17 or later
|
||||||
|
var $hasTransactions = true;
|
||||||
|
var $autoRollback = true; // apparently mysql does not autorollback properly
|
||||||
|
|
||||||
|
function ADODB_mysqlt()
|
||||||
|
{
|
||||||
|
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->Execute('SET AUTOCOMMIT=0');
|
||||||
|
$this->Execute('BEGIN');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('COMMIT');
|
||||||
|
$this->Execute('SET AUTOCOMMIT=1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('ROLLBACK');
|
||||||
|
$this->Execute('SET AUTOCOMMIT=1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RowLock($tables,$where='',$flds='1 as adodb_ignore')
|
||||||
|
{
|
||||||
|
if ($this->transCnt==0) $this->BeginTrans();
|
||||||
|
if ($where) $where = ' where '.$where;
|
||||||
|
$rs = $this->Execute("select $flds from $tables $where for update");
|
||||||
|
return !empty($rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_mysqlt extends ADORecordSet_mysql{
|
||||||
|
var $databaseType = "mysqlt";
|
||||||
|
|
||||||
|
function ADORecordSet_mysqlt($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default: $this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
|
||||||
|
|
||||||
|
function ADORecordSet_ext_mysqlt($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
return adodb_movenext($this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
155
includes/adodb/drivers/adodb-mysqlt.inc.php
Normal file
155
includes/adodb/drivers/adodb-mysqlt.inc.php
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
MySQL code that supports transactions. For MySQL 3.23 or later.
|
||||||
|
Code from James Poon <jpoon88@yahoo.com>
|
||||||
|
|
||||||
|
Requires mysql client. Works on Windows and Unix.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php");
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_mysqlt extends ADODB_mysql {
|
||||||
|
var $databaseType = 'mysqlt';
|
||||||
|
var $ansiOuter = true; // for Version 3.23.17 or later
|
||||||
|
var $hasTransactions = true;
|
||||||
|
var $autoRollback = true; // apparently mysql does not autorollback properly
|
||||||
|
|
||||||
|
function ADODB_mysqlt()
|
||||||
|
{
|
||||||
|
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set transaction mode
|
||||||
|
|
||||||
|
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
|
||||||
|
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
|
||||||
|
|
||||||
|
*/
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->Execute('SET AUTOCOMMIT=0');
|
||||||
|
$this->Execute('BEGIN');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('COMMIT');
|
||||||
|
$this->Execute('SET AUTOCOMMIT=1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->Execute('ROLLBACK');
|
||||||
|
$this->Execute('SET AUTOCOMMIT=1');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RowLock($tables,$where='',$flds='1 as adodb_ignore')
|
||||||
|
{
|
||||||
|
if ($this->transCnt==0) $this->BeginTrans();
|
||||||
|
if ($where) $where = ' where '.$where;
|
||||||
|
$rs = $this->Execute("select $flds from $tables $where for update");
|
||||||
|
return !empty($rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_mysqlt extends ADORecordSet_mysql{
|
||||||
|
var $databaseType = "mysqlt";
|
||||||
|
|
||||||
|
function ADORecordSet_mysqlt($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default: $this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
|
||||||
|
|
||||||
|
function ADORecordSet_ext_mysqlt($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default:
|
||||||
|
$this->fetchMode = MYSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
return adodb_movenext($this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
170
includes/adodb/drivers/adodb-netezza.inc.php
Normal file
170
includes/adodb/drivers/adodb-netezza.inc.php
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
|
||||||
|
First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com
|
||||||
|
Based on the previous postgres drivers.
|
||||||
|
http://www.netezza.com/
|
||||||
|
Major Additions/Changes:
|
||||||
|
MetaDatabasesSQL, MetaTablesSQL, MetaColumnsSQL
|
||||||
|
Note: You have to have admin privileges to access the system tables
|
||||||
|
Removed non-working keys code (Netezza has no concept of keys)
|
||||||
|
Fixed the way data types and lengths are returned in MetaColumns()
|
||||||
|
as well as added the default lengths for certain types
|
||||||
|
Updated public variables for Netezza
|
||||||
|
Still need to remove blob functions, as Netezza doesn't suppport blob
|
||||||
|
*/
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-postgres64.inc.php');
|
||||||
|
|
||||||
|
class ADODB_netezza extends ADODB_postgres64 {
|
||||||
|
var $databaseType = 'netezza';
|
||||||
|
var $dataProvider = 'netezza';
|
||||||
|
var $hasInsertID = false;
|
||||||
|
var $_resultid = false;
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $random = 'random';
|
||||||
|
var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1";
|
||||||
|
var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1";
|
||||||
|
var $isoDates = true; // accepts dates in ISO format
|
||||||
|
var $sysDate = "CURRENT_DATE";
|
||||||
|
var $sysTimeStamp = "CURRENT_TIMESTAMP";
|
||||||
|
var $blobEncodeType = 'C';
|
||||||
|
var $metaColumnsSQL = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
|
||||||
|
var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
|
||||||
|
// netezza doesn't have keys. it does have distributions, so maybe this is
|
||||||
|
// something that can be pulled from the system tables
|
||||||
|
var $metaKeySQL = "";
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $hasLimit = true;
|
||||||
|
var $true = 't'; // string that represents TRUE for a database
|
||||||
|
var $false = 'f'; // string that represents FALSE for a database
|
||||||
|
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
|
||||||
|
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
|
||||||
|
var $ansiOuter = true;
|
||||||
|
var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4
|
||||||
|
// http://bugs.php.net/bug.php?id=25404
|
||||||
|
|
||||||
|
|
||||||
|
function ADODB_netezza()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table,$upper=true)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Changed this function to support Netezza which has no concept of keys
|
||||||
|
// could posisbly work on other things from the system table later.
|
||||||
|
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$table = strtolower($table);
|
||||||
|
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if ($rs === false) return false;
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
|
||||||
|
// since we're returning type and length as one string,
|
||||||
|
// split them out here.
|
||||||
|
|
||||||
|
if ($first = strstr($rs->fields[1], "(")) {
|
||||||
|
$fld->max_length = trim($first, "()");
|
||||||
|
} else {
|
||||||
|
$fld->max_length = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($first = strpos($rs->fields[1], "(")) {
|
||||||
|
$fld->type = substr($rs->fields[1], 0, $first);
|
||||||
|
} else {
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($fld->type) {
|
||||||
|
case "byteint":
|
||||||
|
case "boolean":
|
||||||
|
$fld->max_length = 1;
|
||||||
|
break;
|
||||||
|
case "smallint":
|
||||||
|
$fld->max_length = 2;
|
||||||
|
break;
|
||||||
|
case "integer":
|
||||||
|
case "numeric":
|
||||||
|
case "date":
|
||||||
|
$fld->max_length = 4;
|
||||||
|
break;
|
||||||
|
case "bigint":
|
||||||
|
case "time":
|
||||||
|
case "timestamp":
|
||||||
|
$fld->max_length = 8;
|
||||||
|
break;
|
||||||
|
case "timetz":
|
||||||
|
case "time with time zone":
|
||||||
|
$fld->max_length = 12;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||||
|
else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld;
|
||||||
|
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_netezza extends ADORecordSet_postgres64
|
||||||
|
{
|
||||||
|
var $databaseType = "netezza";
|
||||||
|
var $canSeek = true;
|
||||||
|
|
||||||
|
function ADORecordSet_netezza($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch ($mode)
|
||||||
|
{
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_DEFAULT:
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default: $this->fetchMode = PGSQL_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// _initrs modified to disable blob handling
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1;
|
||||||
|
$this->_numOfFields = @pg_numfields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
1574
includes/adodb/drivers/adodb-oci8.inc.php
Normal file
1574
includes/adodb/drivers/adodb-oci8.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
1532
includes/adodb/drivers/adodb-oci8.old.inc.php
Normal file
1532
includes/adodb/drivers/adodb-oci8.old.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
59
includes/adodb/drivers/adodb-oci805.inc.php
Normal file
59
includes/adodb/drivers/adodb-oci805.inc.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
* Released under both BSD license and Lesser GPL library license.
|
||||||
|
* Whenever there is any discrepancy between the two licenses,
|
||||||
|
* the BSD license will take precedence.
|
||||||
|
*
|
||||||
|
* Set tabs to 4 for best viewing.
|
||||||
|
*
|
||||||
|
* Latest version is available at http://php.weblogs.com
|
||||||
|
*
|
||||||
|
* Oracle 8.0.5 driver
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
|
||||||
|
|
||||||
|
class ADODB_oci805 extends ADODB_oci8 {
|
||||||
|
var $databaseType = "oci805";
|
||||||
|
var $connectSID = true;
|
||||||
|
|
||||||
|
function ADODB_oci805()
|
||||||
|
{
|
||||||
|
$this->ADODB_oci8();
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
// seems that oracle only supports 1 hint comment in 8i
|
||||||
|
if (strpos($sql,'/*+') !== false)
|
||||||
|
$sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
|
||||||
|
else
|
||||||
|
$sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
|
||||||
|
|
||||||
|
/*
|
||||||
|
The following is only available from 8.1.5 because order by in inline views not
|
||||||
|
available before then...
|
||||||
|
http://www.jlcomp.demon.co.uk/faq/top_sql.html
|
||||||
|
if ($nrows > 0) {
|
||||||
|
if ($offset > 0) $nrows += $offset;
|
||||||
|
$sql = "select * from ($sql) where rownum <= $nrows";
|
||||||
|
$nrows = -1;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordset_oci805 extends ADORecordset_oci8 {
|
||||||
|
var $databaseType = "oci805";
|
||||||
|
function ADORecordset_oci805($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_oci8($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
218
includes/adodb/drivers/adodb-oci8po.inc.php
Normal file
218
includes/adodb/drivers/adodb-oci8po.inc.php
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim. All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Portable version of oci8 driver, to make it more similar to other database drivers.
|
||||||
|
The main differences are
|
||||||
|
|
||||||
|
1. that the OCI_ASSOC names are in lowercase instead of uppercase.
|
||||||
|
2. bind variables are mapped using ? instead of :<bindvar>
|
||||||
|
|
||||||
|
Should some emulation of RecordCount() be implemented?
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
|
||||||
|
|
||||||
|
class ADODB_oci8po extends ADODB_oci8 {
|
||||||
|
var $databaseType = 'oci8po';
|
||||||
|
var $dataProvider = 'oci8';
|
||||||
|
var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
|
||||||
|
var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
|
||||||
|
|
||||||
|
function ADODB_oci8po()
|
||||||
|
{
|
||||||
|
$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
|
||||||
|
# oci8po does not support adodb extension: adodb_movenext()
|
||||||
|
}
|
||||||
|
|
||||||
|
function Param($name)
|
||||||
|
{
|
||||||
|
return '?';
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql,$cursor=false)
|
||||||
|
{
|
||||||
|
$sqlarr = explode('?',$sql);
|
||||||
|
$sql = $sqlarr[0];
|
||||||
|
for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
|
||||||
|
$sql .= ':'.($i-1) . $sqlarr[$i];
|
||||||
|
}
|
||||||
|
return ADODB_oci8::Prepare($sql,$cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
// emulate handling of parameters ? ?, replacing with :bind0 :bind1
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
if (is_array($inputarr)) {
|
||||||
|
$i = 0;
|
||||||
|
if (is_array($sql)) {
|
||||||
|
foreach($inputarr as $v) {
|
||||||
|
$arr['bind'.$i++] = $v;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$sqlarr = explode('?',$sql);
|
||||||
|
$sql = $sqlarr[0];
|
||||||
|
foreach($inputarr as $k => $v) {
|
||||||
|
$sql .= ":$k" . $sqlarr[++$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ADODB_oci8::_query($sql,$inputarr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_oci8po extends ADORecordset_oci8 {
|
||||||
|
|
||||||
|
var $databaseType = 'oci8po';
|
||||||
|
|
||||||
|
function ADORecordset_oci8po($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_oci8($queryID,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];
|
||||||
|
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// lowercase field names...
|
||||||
|
function _FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$fieldOffset += 1;
|
||||||
|
$fld->name = OCIcolumnname($this->_queryID, $fieldOffset);
|
||||||
|
if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name);
|
||||||
|
$fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
|
||||||
|
$fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
|
||||||
|
if ($fld->type == 'NUMBER') {
|
||||||
|
//$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
|
||||||
|
$sc = OCIColumnScale($this->_queryID, $fieldOffset);
|
||||||
|
if ($sc == 0) $fld->type = 'INT';
|
||||||
|
}
|
||||||
|
return $fld;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow += 1;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// 10% speedup to move MoveNext to child class
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||||
|
global $ADODB_ANSI_PADDING_OFF;
|
||||||
|
$this->_currentRow++;
|
||||||
|
|
||||||
|
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||||
|
if (!empty($ADODB_ANSI_PADDING_OFF)) {
|
||||||
|
foreach($this->fields as $k => $v) {
|
||||||
|
if (is_string($v)) $this->fields[$k] = rtrim($v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->EOF = true;
|
||||||
|
$this->_currentRow++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
|
||||||
|
function GetArrayLimit($nrows,$offset=-1)
|
||||||
|
{
|
||||||
|
if ($offset <= 0) {
|
||||||
|
$arr = $this->GetArray($nrows);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
for ($i=1; $i < $offset; $i++)
|
||||||
|
if (!@OCIFetch($this->_queryID)) {
|
||||||
|
$arr = array();
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||||
|
$arr = array();
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||||
|
$results = array();
|
||||||
|
$cnt = 0;
|
||||||
|
while (!$this->EOF && $nrows != $cnt) {
|
||||||
|
$results[$cnt++] = $this->fields;
|
||||||
|
$this->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create associative array
|
||||||
|
function _updatefields()
|
||||||
|
{
|
||||||
|
if (ADODB_ASSOC_CASE == 2) return; // native
|
||||||
|
|
||||||
|
$arr = array();
|
||||||
|
$lowercase = (ADODB_ASSOC_CASE == 0);
|
||||||
|
|
||||||
|
foreach($this->fields as $k => $v) {
|
||||||
|
if (is_integer($k)) $arr[$k] = $v;
|
||||||
|
else {
|
||||||
|
if ($lowercase)
|
||||||
|
$arr[strtolower($k)] = $v;
|
||||||
|
else
|
||||||
|
$arr[strtoupper($k)] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fields = $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
$ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
|
||||||
|
if ($ret) {
|
||||||
|
global $ADODB_ANSI_PADDING_OFF;
|
||||||
|
|
||||||
|
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||||
|
if (!empty($ADODB_ANSI_PADDING_OFF)) {
|
||||||
|
foreach($this->fields as $k => $v) {
|
||||||
|
if (is_string($v)) $this->fields[$k] = rtrim($v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
738
includes/adodb/drivers/adodb-odbc.inc.php
Normal file
738
includes/adodb/drivers/adodb-odbc.inc.php
Normal file
@ -0,0 +1,738 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Requires ODBC. Works on Windows and Unix.
|
||||||
|
*/
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
define("_ADODB_ODBC_LAYER", 2 );
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_odbc extends ADOConnection {
|
||||||
|
var $databaseType = "odbc";
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $dataProvider = "odbc";
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $binmode = ODBC_BINMODE_RETURN;
|
||||||
|
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
|
||||||
|
// breaking backward-compat
|
||||||
|
//var $longreadlen = 8000; // default number of chars to return for a Blob/Long field
|
||||||
|
var $_bindInputArray = false;
|
||||||
|
var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
|
||||||
|
var $_genSeqSQL = "create table %s (id integer)";
|
||||||
|
var $_autocommit = true;
|
||||||
|
var $_haserrorfunctions = true;
|
||||||
|
var $_has_stupid_odbc_fetch_api_change = true;
|
||||||
|
var $_lastAffectedRows = 0;
|
||||||
|
var $uCaseTables = true; // for meta* functions, uppercase table names
|
||||||
|
|
||||||
|
function ADODB_odbc()
|
||||||
|
{
|
||||||
|
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
|
||||||
|
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
if (!function_exists('odbc_connect')) return null;
|
||||||
|
|
||||||
|
if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') {
|
||||||
|
ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||||
|
}
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
|
||||||
|
else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||||
|
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
if (!function_exists('odbc_connect')) return null;
|
||||||
|
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
if ($this->debug && $argDatabasename) {
|
||||||
|
ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||||
|
}
|
||||||
|
// print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush();
|
||||||
|
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
|
||||||
|
else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||||
|
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID);
|
||||||
|
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||||
|
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
|
||||||
|
$dsn = strtoupper($this->host);
|
||||||
|
$first = true;
|
||||||
|
$found = false;
|
||||||
|
|
||||||
|
if (!function_exists('odbc_data_source')) return false;
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
$rez = @odbc_data_source($this->_connectionID,
|
||||||
|
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
|
||||||
|
$first = false;
|
||||||
|
if (!is_array($rez)) break;
|
||||||
|
if (strtoupper($rez['server']) == $dsn) {
|
||||||
|
$found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$found) return ADOConnection::ServerInfo();
|
||||||
|
if (!isset($rez['version'])) $rez['version'] = '';
|
||||||
|
return $rez;
|
||||||
|
} else {
|
||||||
|
return ADOConnection::ServerInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||||
|
if (!$ok) return false;
|
||||||
|
$start -= 1;
|
||||||
|
return $this->Execute("insert into $seqname values($start)");
|
||||||
|
}
|
||||||
|
|
||||||
|
var $_dropSeqSQL = 'drop table %s';
|
||||||
|
function DropSequence($seqname)
|
||||||
|
{
|
||||||
|
if (empty($this->_dropSeqSQL)) return false;
|
||||||
|
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This algorithm is not very efficient, but works even if table locking
|
||||||
|
is not available.
|
||||||
|
|
||||||
|
Will return false if unable to generate an ID after $MAXLOOPS attempts.
|
||||||
|
*/
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
// if you have to modify the parameter below, your database is overloaded,
|
||||||
|
// or you need to implement generation of id's yourself!
|
||||||
|
$MAXLOOPS = 100;
|
||||||
|
//$this->debug=1;
|
||||||
|
while (--$MAXLOOPS>=0) {
|
||||||
|
$num = $this->GetOne("select id from $seq");
|
||||||
|
if ($num === false) {
|
||||||
|
$this->Execute(sprintf($this->_genSeqSQL ,$seq));
|
||||||
|
$start -= 1;
|
||||||
|
$num = '0';
|
||||||
|
$ok = $this->Execute("insert into $seq values($start)");
|
||||||
|
if (!$ok) return false;
|
||||||
|
}
|
||||||
|
$this->Execute("update $seq set id=id+1 where id=$num");
|
||||||
|
|
||||||
|
if ($this->affected_rows() > 0) {
|
||||||
|
$num += 1;
|
||||||
|
$this->genID = $num;
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||||
|
if (empty($this->_connectionID)) return @odbc_errormsg();
|
||||||
|
return @odbc_errormsg($this->_connectionID);
|
||||||
|
} else return ADOConnection::ErrorMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
if ($this->_errorCode !== false) {
|
||||||
|
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||||
|
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($this->_connectionID)) $e = @odbc_error();
|
||||||
|
else $e = @odbc_error($this->_connectionID);
|
||||||
|
|
||||||
|
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||||
|
// so we check and patch
|
||||||
|
if (strlen($e)<=2) return 0;
|
||||||
|
return $e;
|
||||||
|
} else return ADOConnection::ErrorNo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->_autocommit = false;
|
||||||
|
return odbc_autocommit($this->_connectionID,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
$ret = odbc_commit($this->_connectionID);
|
||||||
|
odbc_autocommit($this->_connectionID,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
$ret = odbc_rollback($this->_connectionID);
|
||||||
|
odbc_autocommit($this->_connectionID,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
if ($this->uCaseTables) $table = strtoupper($table);
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table);
|
||||||
|
|
||||||
|
if (!$qid) {
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$rs = new ADORecordSet_odbc($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs) return false;
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
$rs->Close();
|
||||||
|
//print_r($arr);
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function MetaTables($ttype=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = odbc_tables($this->_connectionID);
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_odbc($qid);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
if (!$rs) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
//print_r($arr);
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
$arr2 = array();
|
||||||
|
|
||||||
|
if ($ttype) {
|
||||||
|
$isview = strncmp($ttype,'V',1) === 0;
|
||||||
|
}
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if (!$arr[$i][2]) continue;
|
||||||
|
$type = $arr[$i][3];
|
||||||
|
if ($ttype) {
|
||||||
|
if ($isview) {
|
||||||
|
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
|
||||||
|
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
|
||||||
|
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp
|
||||||
|
/ SQL data type codes /
|
||||||
|
#define SQL_UNKNOWN_TYPE 0
|
||||||
|
#define SQL_CHAR 1
|
||||||
|
#define SQL_NUMERIC 2
|
||||||
|
#define SQL_DECIMAL 3
|
||||||
|
#define SQL_INTEGER 4
|
||||||
|
#define SQL_SMALLINT 5
|
||||||
|
#define SQL_FLOAT 6
|
||||||
|
#define SQL_REAL 7
|
||||||
|
#define SQL_DOUBLE 8
|
||||||
|
#if (ODBCVER >= 0x0300)
|
||||||
|
#define SQL_DATETIME 9
|
||||||
|
#endif
|
||||||
|
#define SQL_VARCHAR 12
|
||||||
|
|
||||||
|
|
||||||
|
/ One-parameter shortcuts for date/time data types /
|
||||||
|
#if (ODBCVER >= 0x0300)
|
||||||
|
#define SQL_TYPE_DATE 91
|
||||||
|
#define SQL_TYPE_TIME 92
|
||||||
|
#define SQL_TYPE_TIMESTAMP 93
|
||||||
|
|
||||||
|
#define SQL_UNICODE (-95)
|
||||||
|
#define SQL_UNICODE_VARCHAR (-96)
|
||||||
|
#define SQL_UNICODE_LONGVARCHAR (-97)
|
||||||
|
*/
|
||||||
|
function ODBCTypes($t)
|
||||||
|
{
|
||||||
|
switch ((integer)$t) {
|
||||||
|
case 1:
|
||||||
|
case 12:
|
||||||
|
case 0:
|
||||||
|
case -95:
|
||||||
|
case -96:
|
||||||
|
return 'C';
|
||||||
|
case -97:
|
||||||
|
case -1: //text
|
||||||
|
return 'X';
|
||||||
|
case -4: //image
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
case 91:
|
||||||
|
return 'D';
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
case 11:
|
||||||
|
case 92:
|
||||||
|
case 93:
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case -6:
|
||||||
|
return 'I';
|
||||||
|
|
||||||
|
case -11: // uniqidentifier
|
||||||
|
return 'R';
|
||||||
|
case -7: //bit
|
||||||
|
return 'L';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
if ($this->uCaseTables) $table = strtoupper($table);
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
|
||||||
|
/*if (false) { // after testing, confirmed that the following does not work becoz of a bug
|
||||||
|
$qid2 = odbc_tables($this->_connectionID);
|
||||||
|
$rs = new ADORecordSet_odbc($qid2);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
if (!$rs) return false;
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
$rs->_fetch();
|
||||||
|
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
if ($table == strtoupper($rs->fields[2])) {
|
||||||
|
$q = $rs->fields[0];
|
||||||
|
$o = $rs->fields[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
|
||||||
|
$qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
|
||||||
|
} */
|
||||||
|
|
||||||
|
switch ($this->databaseType) {
|
||||||
|
case 'access':
|
||||||
|
case 'vfp':
|
||||||
|
$qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%');
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 'db2':
|
||||||
|
$colname = "%";
|
||||||
|
$qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%');
|
||||||
|
if (empty($qid)) $qid = odbc_columns($this->_connectionID);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (empty($qid)) return $false;
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_odbc($qid);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs) return $false;
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
$rs->_fetch();
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
$rs->fields indices
|
||||||
|
0 TABLE_QUALIFIER
|
||||||
|
1 TABLE_SCHEM
|
||||||
|
2 TABLE_NAME
|
||||||
|
3 COLUMN_NAME
|
||||||
|
4 DATA_TYPE
|
||||||
|
5 TYPE_NAME
|
||||||
|
6 PRECISION
|
||||||
|
7 LENGTH
|
||||||
|
8 SCALE
|
||||||
|
9 RADIX
|
||||||
|
10 NULLABLE
|
||||||
|
11 REMARKS
|
||||||
|
*/
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
// adodb_pr($rs->fields);
|
||||||
|
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[3];
|
||||||
|
$fld->type = $this->ODBCTypes($rs->fields[4]);
|
||||||
|
|
||||||
|
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
|
||||||
|
// access uses precision to store length for char/varchar
|
||||||
|
if ($fld->type == 'C' or $fld->type == 'X') {
|
||||||
|
if ($this->databaseType == 'access')
|
||||||
|
$fld->max_length = $rs->fields[6];
|
||||||
|
else if ($rs->fields[4] <= -95) // UNICODE
|
||||||
|
$fld->max_length = $rs->fields[7]/2;
|
||||||
|
else
|
||||||
|
$fld->max_length = $rs->fields[7];
|
||||||
|
} else
|
||||||
|
$fld->max_length = $rs->fields[7];
|
||||||
|
$fld->not_null = !empty($rs->fields[10]);
|
||||||
|
$fld->scale = $rs->fields[8];
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
} else if (sizeof($retarr)>0)
|
||||||
|
break;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close(); //-- crashes 4.03pl1 -- why?
|
||||||
|
|
||||||
|
if (empty($retarr)) $retarr = false;
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
if (! $this->_bindInputArray) return $sql; // no binding
|
||||||
|
$stmt = odbc_prepare($this->_connectionID,$sql);
|
||||||
|
if (!$stmt) {
|
||||||
|
// we don't know whether odbc driver is parsing prepared stmts, so just return sql
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
return array($sql,$stmt,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns queryID or false */
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
GLOBAL $php_errormsg;
|
||||||
|
if (isset($php_errormsg)) $php_errormsg = '';
|
||||||
|
$this->_error = '';
|
||||||
|
|
||||||
|
if ($inputarr) {
|
||||||
|
if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
} else {
|
||||||
|
$stmtid = odbc_prepare($this->_connectionID,$sql);
|
||||||
|
|
||||||
|
if ($stmtid == false) {
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! odbc_execute($stmtid,$inputarr)) {
|
||||||
|
//@odbc_free_result($stmtid);
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = odbc_errormsg();
|
||||||
|
$this->_errorCode = odbc_error();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
if (!odbc_execute($stmtid)) {
|
||||||
|
//@odbc_free_result($stmtid);
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = odbc_errormsg();
|
||||||
|
$this->_errorCode = odbc_error();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
$stmtid = odbc_exec($this->_connectionID,$sql);
|
||||||
|
|
||||||
|
$this->_lastAffectedRows = 0;
|
||||||
|
if ($stmtid) {
|
||||||
|
if (@odbc_num_fields($stmtid) == 0) {
|
||||||
|
$this->_lastAffectedRows = odbc_num_rows($stmtid);
|
||||||
|
$stmtid = true;
|
||||||
|
} else {
|
||||||
|
$this->_lastAffectedRows = 0;
|
||||||
|
odbc_binmode($stmtid,$this->binmode);
|
||||||
|
odbc_longreadlen($stmtid,$this->maxblobsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = '';
|
||||||
|
$this->_errorCode = 0;
|
||||||
|
} else
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
} else {
|
||||||
|
if ($this->_haserrorfunctions) {
|
||||||
|
$this->_errorMsg = odbc_errormsg();
|
||||||
|
$this->_errorCode = odbc_error();
|
||||||
|
} else
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||||
|
}
|
||||||
|
return $stmtid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Insert a null into the blob field of the table first.
|
||||||
|
Then use UpdateBlob to store the blob.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||||
|
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||||
|
*/
|
||||||
|
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$ret = @odbc_close($this->_connectionID);
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return $this->_lastAffectedRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_odbc extends ADORecordSet {
|
||||||
|
|
||||||
|
var $bind = false;
|
||||||
|
var $databaseType = "odbc";
|
||||||
|
var $dataProvider = "odbc";
|
||||||
|
var $useFetchArray;
|
||||||
|
var $_has_stupid_odbc_fetch_api_change;
|
||||||
|
|
||||||
|
function ADORecordSet_odbc($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
|
||||||
|
$this->_queryID = $id;
|
||||||
|
|
||||||
|
// the following is required for mysql odbc driver in 4.3.1 -- why?
|
||||||
|
$this->EOF = false;
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
//$this->ADORecordSet($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns the field object
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
|
||||||
|
$off=$fieldOffset+1; // offsets begin at 1
|
||||||
|
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$o->name = @odbc_field_name($this->_queryID,$off);
|
||||||
|
$o->type = @odbc_field_type($this->_queryID,$off);
|
||||||
|
$o->max_length = @odbc_field_len($this->_queryID,$off);
|
||||||
|
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||||
|
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1;
|
||||||
|
$this->_numOfFields = @odbc_num_fields($this->_queryID);
|
||||||
|
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
|
||||||
|
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
|
||||||
|
//$this->useFetchArray = $this->connection->useFetchArray;
|
||||||
|
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
|
||||||
|
function GetArrayLimit($nrows,$offset=-1)
|
||||||
|
{
|
||||||
|
if ($offset <= 0) {
|
||||||
|
$rs = $this->GetArray($nrows);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
$savem = $this->fetchMode;
|
||||||
|
$this->fetchMode = ADODB_FETCH_NUM;
|
||||||
|
$this->Move($offset);
|
||||||
|
$this->fetchMode = $savem;
|
||||||
|
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = array();
|
||||||
|
$cnt = 0;
|
||||||
|
while (!$this->EOF && $nrows != $cnt) {
|
||||||
|
$results[$cnt++] = $this->fields;
|
||||||
|
$this->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if ($this->_numOfRows != 0 && !$this->EOF) {
|
||||||
|
$this->_currentRow++;
|
||||||
|
|
||||||
|
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||||
|
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
|
||||||
|
else {
|
||||||
|
$row = 0;
|
||||||
|
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
|
||||||
|
}
|
||||||
|
if ($rez) {
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fields = false;
|
||||||
|
$this->EOF = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||||
|
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
|
||||||
|
else {
|
||||||
|
$row = 0;
|
||||||
|
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
|
||||||
|
}
|
||||||
|
if ($rez) {
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$this->fields = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @odbc_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
368
includes/adodb/drivers/adodb-odbc_db2.inc.php
Normal file
368
includes/adodb/drivers/adodb-odbc_db2.inc.php
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
DB2 data driver. Requires ODBC.
|
||||||
|
|
||||||
|
From phpdb list:
|
||||||
|
|
||||||
|
Hi Andrew,
|
||||||
|
|
||||||
|
thanks a lot for your help. Today we discovered what
|
||||||
|
our real problem was:
|
||||||
|
|
||||||
|
After "playing" a little bit with the php-scripts that try
|
||||||
|
to connect to the IBM DB2, we set the optional parameter
|
||||||
|
Cursortype when calling odbc_pconnect(....).
|
||||||
|
|
||||||
|
And the exciting thing: When we set the cursor type
|
||||||
|
to SQL_CUR_USE_ODBC Cursor Type, then
|
||||||
|
the whole query speed up from 1 till 10 seconds
|
||||||
|
to 0.2 till 0.3 seconds for 100 records. Amazing!!!
|
||||||
|
|
||||||
|
Therfore, PHP is just almost fast as calling the DB2
|
||||||
|
from Servlets using JDBC (don't take too much care
|
||||||
|
about the speed at whole: the database was on a
|
||||||
|
completely other location, so the whole connection
|
||||||
|
was made over a slow network connection).
|
||||||
|
|
||||||
|
I hope this helps when other encounter the same
|
||||||
|
problem when trying to connect to DB2 from
|
||||||
|
PHP.
|
||||||
|
|
||||||
|
Kind regards,
|
||||||
|
Christian Szardenings
|
||||||
|
|
||||||
|
2 Oct 2001
|
||||||
|
Mark Newnham has discovered that the SQL_CUR_USE_ODBC is not supported by
|
||||||
|
IBM's DB2 ODBC driver, so this must be a 3rd party ODBC driver.
|
||||||
|
|
||||||
|
From the IBM CLI Reference:
|
||||||
|
|
||||||
|
SQL_ATTR_ODBC_CURSORS (DB2 CLI v5)
|
||||||
|
This connection attribute is defined by ODBC, but is not supported by DB2
|
||||||
|
CLI. Any attempt to set or get this attribute will result in an SQLSTATE of
|
||||||
|
HYC00 (Driver not capable).
|
||||||
|
|
||||||
|
A 32-bit option specifying how the Driver Manager uses the ODBC cursor
|
||||||
|
library.
|
||||||
|
|
||||||
|
So I guess this means the message [above] was related to using a 3rd party
|
||||||
|
odbc driver.
|
||||||
|
|
||||||
|
Setting SQL_CUR_USE_ODBC
|
||||||
|
========================
|
||||||
|
To set SQL_CUR_USE_ODBC for drivers that require it, do this:
|
||||||
|
|
||||||
|
$db = NewADOConnection('odbc_db2');
|
||||||
|
$db->curMode = SQL_CUR_USE_ODBC;
|
||||||
|
$db->Connect($dsn, $userid, $pwd);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
USING CLI INTERFACE
|
||||||
|
===================
|
||||||
|
|
||||||
|
I have had reports that the $host and $database params have to be reversed in
|
||||||
|
Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu:
|
||||||
|
|
||||||
|
> The symptom is that if I change the database engine from postgres or any other to DB2 then the following
|
||||||
|
> connection command becomes wrong despite being described this version to be correct in the docs.
|
||||||
|
>
|
||||||
|
> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME )
|
||||||
|
>
|
||||||
|
> In case of DB2 I had to swap the first and last arguments in order to connect properly.
|
||||||
|
|
||||||
|
|
||||||
|
System Error 5
|
||||||
|
==============
|
||||||
|
IF you get a System Error 5 when trying to Connect/Load, it could be a permission problem. Give the user connecting
|
||||||
|
to DB2 full rights to the DB2 SQLLIB directory, and place the user in the DBUSERS group.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
if (!defined('ADODB_ODBC_DB2')){
|
||||||
|
define('ADODB_ODBC_DB2',1);
|
||||||
|
|
||||||
|
class ADODB_ODBC_DB2 extends ADODB_odbc {
|
||||||
|
var $databaseType = "db2";
|
||||||
|
var $concat_operator = '||';
|
||||||
|
var $sysTime = 'CURRENT TIME';
|
||||||
|
var $sysDate = 'CURRENT DATE';
|
||||||
|
var $sysTimeStamp = 'CURRENT TIMESTAMP';
|
||||||
|
// The complete string representation of a timestamp has the form
|
||||||
|
// yyyy-mm-dd-hh.mm.ss.nnnnnn.
|
||||||
|
var $fmtTimeStamp = "'Y-m-d-H.i.s'";
|
||||||
|
var $ansiOuter = true;
|
||||||
|
var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $rsPrefix = 'ADORecordset_odbc_';
|
||||||
|
|
||||||
|
function ADODB_DB2()
|
||||||
|
{
|
||||||
|
if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " COALESCE($field, $ifNull) "; // if DB2 UDB
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
//odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/);
|
||||||
|
$vers = $this->GetOne('select versionnumber from sysibm.sysversions');
|
||||||
|
//odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/);
|
||||||
|
return array('description'=>'DB2 ODBC driver', 'version'=>$vers);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return $this->GetOne($this->identitySQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
function RowLock($tables,$where,$flds='1 as ignore')
|
||||||
|
{
|
||||||
|
if ($this->_autocommit) $this->BeginTrans();
|
||||||
|
return $this->GetOne("select $flds from $tables where $where for update");
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%")
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, "");
|
||||||
|
|
||||||
|
$rs = new ADORecordSet_odbc($qid);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
if (!$rs) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
//print_r($arr);
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
$arr2 = array();
|
||||||
|
|
||||||
|
if ($ttype) {
|
||||||
|
$isview = strncmp($ttype,'V',1) === 0;
|
||||||
|
}
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
|
||||||
|
if (!$arr[$i][2]) continue;
|
||||||
|
if (strncmp($arr[$i][1],'SYS',3) === 0) continue;
|
||||||
|
|
||||||
|
$type = $arr[$i][3];
|
||||||
|
|
||||||
|
if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2];
|
||||||
|
|
||||||
|
if ($ttype) {
|
||||||
|
if ($isview) {
|
||||||
|
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
|
||||||
|
} else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2];
|
||||||
|
} else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes ($table, $primary = FALSE, $owner=false)
|
||||||
|
{
|
||||||
|
// save old fetch mode
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
$false = false;
|
||||||
|
// get index details
|
||||||
|
$table = strtoupper($table);
|
||||||
|
$SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'";
|
||||||
|
if ($primary)
|
||||||
|
$SQL.= " AND UNIQUERULE='P'";
|
||||||
|
$rs = $this->Execute($SQL);
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
if (isset($savem))
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$indexes = array ();
|
||||||
|
// parse index data into array
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
$indexes[$row[0]] = array(
|
||||||
|
'unique' => ($row[1] == 'U' || $row[1] == 'P'),
|
||||||
|
'columns' => array()
|
||||||
|
);
|
||||||
|
$cols = ltrim($row[2],'+');
|
||||||
|
$indexes[$row[0]]['columns'] = explode('+', $cols);
|
||||||
|
}
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
// use right() and replace() ?
|
||||||
|
if (!$col) $col = $this->sysDate;
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= '||';
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= "char(year($col))";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
$s .= "substr(monthname($col),1,3)";
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
$s .= "right(digits(month($col)),2)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= "right(digits(day($col)),2)";
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
case 'I':
|
||||||
|
if ($col != $this->sysDate)
|
||||||
|
$s .= "right(digits(minute($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
case 's':
|
||||||
|
if ($col != $this->sysDate)
|
||||||
|
$s .= "right(digits(second($col)),2)";
|
||||||
|
else $s .= "''";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
|
||||||
|
{
|
||||||
|
$nrows = (integer) $nrows;
|
||||||
|
if ($offset <= 0) {
|
||||||
|
// could also use " OPTIMIZE FOR $nrows ROWS "
|
||||||
|
if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||||
|
$rs = $this->Execute($sql,$inputArr);
|
||||||
|
} else {
|
||||||
|
if ($offset > 0 && $nrows < 0);
|
||||||
|
else {
|
||||||
|
$nrows += $offset;
|
||||||
|
$sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||||
|
}
|
||||||
|
$rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_odbc_db2 extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = "db2";
|
||||||
|
|
||||||
|
function ADORecordSet_db2($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1,$fieldobj=false)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'CHARACTER':
|
||||||
|
case 'C':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
|
||||||
|
case 'LONGCHAR':
|
||||||
|
case 'TEXT':
|
||||||
|
case 'CLOB':
|
||||||
|
case 'DBCLOB': // double-byte
|
||||||
|
case 'X':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
case 'BLOB':
|
||||||
|
case 'GRAPHIC':
|
||||||
|
case 'VARGRAPHIC':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'DATE':
|
||||||
|
case 'D':
|
||||||
|
return 'D';
|
||||||
|
|
||||||
|
case 'TIME':
|
||||||
|
case 'TIMESTAMP':
|
||||||
|
case 'T':
|
||||||
|
return 'T';
|
||||||
|
|
||||||
|
//case 'BOOLEAN':
|
||||||
|
//case 'BIT':
|
||||||
|
// return 'L';
|
||||||
|
|
||||||
|
//case 'COUNTER':
|
||||||
|
// return 'R';
|
||||||
|
|
||||||
|
case 'INT':
|
||||||
|
case 'INTEGER':
|
||||||
|
case 'BIGINT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'I':
|
||||||
|
return 'I';
|
||||||
|
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //define
|
||||||
|
?>
|
306
includes/adodb/drivers/adodb-odbc_mssql.inc.php
Normal file
306
includes/adodb/drivers/adodb-odbc_mssql.inc.php
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix.
|
||||||
|
For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_odbc_mssql extends ADODB_odbc {
|
||||||
|
var $databaseType = 'odbc_mssql';
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))";
|
||||||
|
var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
|
||||||
|
var $hasTop = 'top'; // support mssql/interbase SELECT TOP 10 * FROM TABLE
|
||||||
|
var $sysDate = 'GetDate()';
|
||||||
|
var $sysTimeStamp = 'GetDate()';
|
||||||
|
var $leftOuter = '*=';
|
||||||
|
var $rightOuter = '=*';
|
||||||
|
var $substr = 'substring';
|
||||||
|
var $length = 'len';
|
||||||
|
var $ansiOuter = true; // for mssql7 or later
|
||||||
|
var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON,
|
||||||
|
# concatenating a null value with a string yields a NULL result
|
||||||
|
|
||||||
|
function ADODB_odbc_mssql()
|
||||||
|
{
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
//$this->curmode = SQL_CUR_USE_ODBC;
|
||||||
|
}
|
||||||
|
|
||||||
|
// crashes php...
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$row = $this->GetRow("execute sp_server_info 2");
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
if (!is_array($row)) return false;
|
||||||
|
$arr['description'] = $row[2];
|
||||||
|
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
return " ISNULL($field, $ifNull) "; // if MS SQL Server
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
// SCOPE_IDENTITY()
|
||||||
|
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||||
|
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||||
|
// function, or batch. Thus, two statements are in the same scope if
|
||||||
|
// they are in the same stored procedure, function, or batch.
|
||||||
|
return $this->GetOne($this->identitySQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$table = $this->qstr(strtoupper($table));
|
||||||
|
|
||||||
|
$sql =
|
||||||
|
"select object_name(constid) as constraint_name,
|
||||||
|
col_name(fkeyid, fkey) as column_name,
|
||||||
|
object_name(rkeyid) as referenced_table_name,
|
||||||
|
col_name(rkeyid, rkey) as referenced_column_name
|
||||||
|
from sysforeignkeys
|
||||||
|
where upper(object_name(fkeyid)) = $table
|
||||||
|
order by constraint_name, referenced_table_name, keyno";
|
||||||
|
|
||||||
|
$constraints = $this->GetArray($sql);
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
$arr = false;
|
||||||
|
foreach($constraints as $constr) {
|
||||||
|
//print_r($constr);
|
||||||
|
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
|
||||||
|
}
|
||||||
|
if (!$arr) return false;
|
||||||
|
|
||||||
|
$arr2 = false;
|
||||||
|
|
||||||
|
foreach($arr as $k => $v) {
|
||||||
|
foreach($v as $a => $b) {
|
||||||
|
if ($upper) $a = strtoupper($a);
|
||||||
|
$arr2[$a] = $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
if ($mask) {$this->debug=1;
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
$mask = $this->qstr($mask);
|
||||||
|
$this->metaTablesSQL .= " AND name like $mask";
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$arr = ADOConnection::MetaColumns($table);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MetaIndexes($table,$primary=false)
|
||||||
|
{
|
||||||
|
$table = $this->qstr($table);
|
||||||
|
|
||||||
|
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||||
|
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||||
|
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||||
|
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||||
|
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||||
|
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||||
|
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
|
||||||
|
ORDER BY O.name, I.Name, K.keyno";
|
||||||
|
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
if (!$primary && $row[5]) continue;
|
||||||
|
|
||||||
|
$indexes[$row[0]]['unique'] = $row[6];
|
||||||
|
$indexes[$row[0]]['columns'][] = $row[1];
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||||
|
return ADODB_odbc::_query($sql,$inputarr);
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Stein-Aksel Basma" <basma@accelero.no>
|
||||||
|
// tested with MSSQL 2000
|
||||||
|
function MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$schema = '';
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
//if (!$schema) $schema = $this->database;
|
||||||
|
if ($schema) $schema = "and k.table_catalog like '$schema%'";
|
||||||
|
|
||||||
|
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
|
||||||
|
information_schema.table_constraints tc
|
||||||
|
where tc.constraint_name = k.constraint_name and tc.constraint_type =
|
||||||
|
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||||
|
$a = $this->GetCol($sql);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if ($a && sizeof($a)>0) return $a;
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
if ($nrows > 0 && $offset <= 0) {
|
||||||
|
$sql = preg_replace(
|
||||||
|
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);
|
||||||
|
$rs = $this->Execute($sql,$inputarr);
|
||||||
|
} else
|
||||||
|
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
if (!$col) $col = $this->sysTimeStamp;
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= '+';
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= "datename(yyyy,$col)";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
$s .= "convert(char(3),$col,0)";
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
$s .= "replace(str(month($col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
case 'q':
|
||||||
|
$s .= "datename(quarter,$col)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= "replace(str(day($col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbc_mssql extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = 'odbc_mssql';
|
||||||
|
|
||||||
|
function ADORecordSet_odbc_mssql($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
115
includes/adodb/drivers/adodb-odbc_oracle.inc.php
Normal file
115
includes/adodb/drivers/adodb-odbc_oracle.inc.php
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Oracle support via ODBC. Requires ODBC. Works on Windows.
|
||||||
|
*/
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_odbc_oracle extends ADODB_odbc {
|
||||||
|
var $databaseType = 'odbc_oracle';
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $fmtDate = "'Y-m-d 00:00:00'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||||
|
var $metaTablesSQL = 'select table_name from cat';
|
||||||
|
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
|
||||||
|
var $sysDate = "TRUNC(SYSDATE)";
|
||||||
|
var $sysTimeStamp = 'SYSDATE';
|
||||||
|
|
||||||
|
//var $_bindInputArray = false;
|
||||||
|
|
||||||
|
function ADODB_odbc_oracle()
|
||||||
|
{
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
$false = false;
|
||||||
|
$rs = $this->Execute($this->metaTablesSQL);
|
||||||
|
if ($rs === false) return $false;
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
$arr2[] = $arr[$i][0];
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||||
|
if ($rs === false) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) { //print_r($rs->fields);
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
$fld->max_length = $rs->fields[2];
|
||||||
|
|
||||||
|
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||||
|
else $retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
$php_errormsg = '';
|
||||||
|
$this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
|
||||||
|
$this->_errorMsg = $php_errormsg;
|
||||||
|
|
||||||
|
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
|
||||||
|
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
$php_errormsg = '';
|
||||||
|
$this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
|
||||||
|
$this->_errorMsg = $php_errormsg;
|
||||||
|
|
||||||
|
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
|
||||||
|
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
|
||||||
|
return $this->_connectionID != false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbc_oracle extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = 'odbc_oracle';
|
||||||
|
|
||||||
|
function ADORecordSet_odbc_oracle($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
793
includes/adodb/drivers/adodb-odbtp.inc.php
Normal file
793
includes/adodb/drivers/adodb-odbtp.inc.php
Normal file
@ -0,0 +1,793 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
*/
|
||||||
|
// Code contributed by "stefan bogdan" <sbogdan#rsb.ro>
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
define("_ADODB_ODBTP_LAYER", 2 );
|
||||||
|
|
||||||
|
class ADODB_odbtp extends ADOConnection{
|
||||||
|
var $databaseType = "odbtp";
|
||||||
|
var $dataProvider = "odbtp";
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $odbc_driver = 0;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $hasInsertID = false;
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $hasMoveFirst = true;
|
||||||
|
|
||||||
|
var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)";
|
||||||
|
var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'";
|
||||||
|
var $_bindInputArray = false;
|
||||||
|
var $_useUnicodeSQL = false;
|
||||||
|
var $_canPrepareSP = false;
|
||||||
|
var $_dontPoolDBC = true;
|
||||||
|
|
||||||
|
function ADODB_odbtp()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID),
|
||||||
|
'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID));
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if (empty($this->_connectionID)) return @odbtp_last_error();
|
||||||
|
return @odbtp_last_error($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if (empty($this->_connectionID)) return @odbtp_last_error_state();
|
||||||
|
return @odbtp_last_error_state($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
// SCOPE_IDENTITY()
|
||||||
|
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||||
|
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||||
|
// function, or batch. Thus, two statements are in the same scope if
|
||||||
|
// they are in the same stored procedure, function, or batch.
|
||||||
|
return $this->GetOne($this->identitySQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
if ($this->_queryID) {
|
||||||
|
return @odbtp_affected_rows ($this->_queryID);
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
//verify existence
|
||||||
|
$num = $this->GetOne("select seq_value from adodb_seq");
|
||||||
|
$seqtab='adodb_seq';
|
||||||
|
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
|
||||||
|
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
|
||||||
|
//if using vfp dbc file
|
||||||
|
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
|
||||||
|
$path = substr($path,0,strrpos($path,'\/'));
|
||||||
|
$seqtab = $path . '/' . $seqtab;
|
||||||
|
}
|
||||||
|
if($num == false) {
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
|
||||||
|
}
|
||||||
|
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'");
|
||||||
|
if ($num) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$start -= 1;
|
||||||
|
return $this->Execute("insert into adodb_seq values('$seqname',$start)");
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropSequence($seqname)
|
||||||
|
{
|
||||||
|
if (empty($this->_dropSeqSQL)) return false;
|
||||||
|
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
$seqtab='adodb_seq';
|
||||||
|
if( $this->odbc_driver == ODB_DRIVER_FOXPRO) {
|
||||||
|
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
|
||||||
|
//if using vfp dbc file
|
||||||
|
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
|
||||||
|
$path = substr($path,0,strrpos($path,'\/'));
|
||||||
|
$seqtab = $path . '/' . $seqtab;
|
||||||
|
}
|
||||||
|
$MAXLOOPS = 100;
|
||||||
|
while (--$MAXLOOPS>=0) {
|
||||||
|
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'");
|
||||||
|
if ($num === false) {
|
||||||
|
//verify if abodb_seq table exist
|
||||||
|
$ok = $this->GetOne("select seq_value from adodb_seq ");
|
||||||
|
if(!$ok) {
|
||||||
|
//creating the sequence table adodb_seq
|
||||||
|
$this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
|
||||||
|
}
|
||||||
|
$start -= 1;
|
||||||
|
$num = '0';
|
||||||
|
$ok = $this->Execute("insert into adodb_seq values('$seq',$start)");
|
||||||
|
if (!$ok) return false;
|
||||||
|
}
|
||||||
|
$ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'");
|
||||||
|
if($ok) {
|
||||||
|
$num += 1;
|
||||||
|
$this->genID = $num;
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//example for $UserOrDSN
|
||||||
|
//for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO;
|
||||||
|
//for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO;
|
||||||
|
//for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=;
|
||||||
|
//for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest;
|
||||||
|
//if uid & pwd can be separate
|
||||||
|
function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
|
||||||
|
{
|
||||||
|
$this->_connectionID = odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase);
|
||||||
|
if ($this->_connectionID === false) {
|
||||||
|
$this->_errorMsg = $this->ErrorMsg() ;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
odbtp_convert_datetime($this->_connectionID,true);
|
||||||
|
|
||||||
|
if ($this->_dontPoolDBC) {
|
||||||
|
if (function_exists('odbtp_dont_pool_dbc'))
|
||||||
|
@odbtp_dont_pool_dbc($this->_connectionID);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$this->_dontPoolDBC = true;
|
||||||
|
}
|
||||||
|
$this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID);
|
||||||
|
$dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID));
|
||||||
|
$this->odbc_name = $dbms;
|
||||||
|
|
||||||
|
// Account for inconsistent DBMS names
|
||||||
|
if( $this->odbc_driver == ODB_DRIVER_ORACLE )
|
||||||
|
$dbms = 'oracle';
|
||||||
|
else if( $this->odbc_driver == ODB_DRIVER_SYBASE )
|
||||||
|
$dbms = 'sybase';
|
||||||
|
|
||||||
|
// Set DBMS specific attributes
|
||||||
|
switch( $dbms ) {
|
||||||
|
case 'microsoft sql server':
|
||||||
|
$this->databaseType = 'odbtp_mssql';
|
||||||
|
$this->fmtDate = "'Y-m-d'";
|
||||||
|
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||||
|
$this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||||
|
$this->sysTimeStamp = 'GetDate()';
|
||||||
|
$this->ansiOuter = true;
|
||||||
|
$this->leftOuter = '*=';
|
||||||
|
$this->rightOuter = '=*';
|
||||||
|
$this->hasTop = 'top';
|
||||||
|
$this->hasInsertID = true;
|
||||||
|
$this->hasTransactions = true;
|
||||||
|
$this->_bindInputArray = true;
|
||||||
|
$this->_canSelectDb = true;
|
||||||
|
$this->substr = "substring";
|
||||||
|
$this->length = 'len';
|
||||||
|
$this->identitySQL = 'select SCOPE_IDENTITY()';
|
||||||
|
$this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'";
|
||||||
|
$this->_canPrepareSP = true;
|
||||||
|
break;
|
||||||
|
case 'access':
|
||||||
|
$this->databaseType = 'odbtp_access';
|
||||||
|
$this->fmtDate = "#Y-m-d#";
|
||||||
|
$this->fmtTimeStamp = "#Y-m-d h:i:sA#";
|
||||||
|
$this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||||
|
$this->sysTimeStamp = 'NOW';
|
||||||
|
$this->hasTop = 'top';
|
||||||
|
$this->hasTransactions = false;
|
||||||
|
$this->_canPrepareSP = true; // For MS Access only.
|
||||||
|
break;
|
||||||
|
case 'visual foxpro':
|
||||||
|
$this->databaseType = 'odbtp_vfp';
|
||||||
|
$this->fmtDate = "{^Y-m-d}";
|
||||||
|
$this->fmtTimeStamp = "{^Y-m-d, h:i:sA}";
|
||||||
|
$this->sysDate = 'date()';
|
||||||
|
$this->sysTimeStamp = 'datetime()';
|
||||||
|
$this->ansiOuter = true;
|
||||||
|
$this->hasTop = 'top';
|
||||||
|
$this->hasTransactions = false;
|
||||||
|
$this->replaceQuote = "'+chr(39)+'";
|
||||||
|
$this->true = '.T.';
|
||||||
|
$this->false = '.F.';
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'oracle':
|
||||||
|
$this->databaseType = 'odbtp_oci8';
|
||||||
|
$this->fmtDate = "'Y-m-d 00:00:00'";
|
||||||
|
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||||
|
$this->sysDate = 'TRUNC(SYSDATE)';
|
||||||
|
$this->sysTimeStamp = 'SYSDATE';
|
||||||
|
$this->hasTransactions = true;
|
||||||
|
$this->_bindInputArray = true;
|
||||||
|
$this->concat_operator = '||';
|
||||||
|
break;
|
||||||
|
case 'sybase':
|
||||||
|
$this->databaseType = 'odbtp_sybase';
|
||||||
|
$this->fmtDate = "'Y-m-d'";
|
||||||
|
$this->fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
$this->sysDate = 'GetDate()';
|
||||||
|
$this->sysTimeStamp = 'GetDate()';
|
||||||
|
$this->leftOuter = '*=';
|
||||||
|
$this->rightOuter = '=*';
|
||||||
|
$this->hasInsertID = true;
|
||||||
|
$this->hasTransactions = true;
|
||||||
|
$this->identitySQL = 'select SCOPE_IDENTITY()';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->databaseType = 'odbtp';
|
||||||
|
if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) )
|
||||||
|
$this->hasTransactions = true;
|
||||||
|
else
|
||||||
|
$this->hasTransactions = false;
|
||||||
|
}
|
||||||
|
@odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID );
|
||||||
|
|
||||||
|
if ($this->_useUnicodeSQL )
|
||||||
|
@odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
|
||||||
|
{
|
||||||
|
$this->_dontPoolDBC = false;
|
||||||
|
return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase);
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
if (!@odbtp_select_db($dbName, $this->_connectionID)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$this->database = $dbName;
|
||||||
|
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype='',$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
|
||||||
|
|
||||||
|
$arr = $this->GetArray("||SQLTables||||$ttype");
|
||||||
|
|
||||||
|
if (isset($savefm)) $this->SetFetchMode($savefm);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if ($arr[$i][3] == 'SYSTEM TABLE' ) continue;
|
||||||
|
if ($arr[$i][2])
|
||||||
|
$arr2[] = $showSchema && $arr[$i][1]? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table,$upper=true)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$schema = false;
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
if ($upper) $table = strtoupper($table);
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
|
||||||
|
|
||||||
|
$rs = $this->Execute( "||SQLColumns||$schema|$table" );
|
||||||
|
|
||||||
|
if (isset($savefm)) $this->SetFetchMode($savefm);
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
if (!$rs || $rs->EOF) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
//print_r($rs->fields);
|
||||||
|
if (strtoupper($rs->fields[2]) == $table) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[3];
|
||||||
|
$fld->type = $rs->fields[5];
|
||||||
|
$fld->max_length = $rs->fields[6];
|
||||||
|
$fld->not_null = !empty($rs->fields[9]);
|
||||||
|
$fld->scale = $rs->fields[7];
|
||||||
|
if (isset($rs->fields[12])) // vfp does not have field 12
|
||||||
|
if (!is_null($rs->fields[12])) {
|
||||||
|
$fld->has_default = true;
|
||||||
|
$fld->default_value = $rs->fields[12];
|
||||||
|
}
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
} else if (!empty($retarr))
|
||||||
|
break;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaPrimaryKeys($table, $owner='')
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$arr = $this->GetArray("||SQLPrimaryKeys||$owner|$table");
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
//print_r($arr);
|
||||||
|
$arr2 = array();
|
||||||
|
for ($i=0; $i < sizeof($arr); $i++) {
|
||||||
|
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaForeignKeys($table, $owner='', $upper=false)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$savem = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
$constraints = $this->GetArray("||SQLForeignKeys|||||$owner|$table");
|
||||||
|
$ADODB_FETCH_MODE = $savem;
|
||||||
|
|
||||||
|
$arr = false;
|
||||||
|
foreach($constraints as $constr) {
|
||||||
|
//print_r($constr);
|
||||||
|
$arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3];
|
||||||
|
}
|
||||||
|
if (!$arr) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$arr2 = array();
|
||||||
|
|
||||||
|
foreach($arr as $k => $v) {
|
||||||
|
foreach($v as $a => $b) {
|
||||||
|
if ($upper) $a = strtoupper($a);
|
||||||
|
$arr2[$a] = $b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->autoCommit = false;
|
||||||
|
if (defined('ODB_TXN_DEFAULT'))
|
||||||
|
$txn = ODB_TXN_DEFAULT;
|
||||||
|
else
|
||||||
|
$txn = ODB_TXN_READUNCOMMITTED;
|
||||||
|
$rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID);
|
||||||
|
if(!$rs) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->autoCommit = true;
|
||||||
|
if( ($ret = @odbtp_commit($this->_connectionID)) )
|
||||||
|
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->autoCommit = true;
|
||||||
|
if( ($ret = @odbtp_rollback($this->_connectionID)) )
|
||||||
|
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
// TOP requires ORDER BY for Visual FoxPro
|
||||||
|
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
|
||||||
|
if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1';
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
if (! $this->_bindInputArray) return $sql; // no binding
|
||||||
|
$stmt = @odbtp_prepare($sql,$this->_connectionID);
|
||||||
|
if (!$stmt) {
|
||||||
|
// print "Prepare Error for ($sql) ".$this->ErrorMsg()."<br>";
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
return array($sql,$stmt,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function PrepareSP($sql)
|
||||||
|
{
|
||||||
|
if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures
|
||||||
|
|
||||||
|
$stmt = @odbtp_prepare_proc($sql,$this->_connectionID);
|
||||||
|
if (!$stmt) return false;
|
||||||
|
return array($sql,$stmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Usage:
|
||||||
|
$stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group
|
||||||
|
|
||||||
|
# note that the parameter does not have @ in front!
|
||||||
|
$db->Parameter($stmt,$id,'myid');
|
||||||
|
$db->Parameter($stmt,$group,'group',false,64);
|
||||||
|
$db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY);
|
||||||
|
$db->Execute($stmt);
|
||||||
|
|
||||||
|
@param $stmt Statement returned by Prepare() or PrepareSP().
|
||||||
|
@param $var PHP variable to bind to. Can set to null (for isNull support).
|
||||||
|
@param $name Name of stored procedure variable name to bind to.
|
||||||
|
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp.
|
||||||
|
@param [$maxLen] Holds an maximum length of the variable.
|
||||||
|
@param [$type] The data type of $var. Legal values depend on driver.
|
||||||
|
|
||||||
|
See odbtp_attach_param documentation at http://odbtp.sourceforge.net.
|
||||||
|
*/
|
||||||
|
function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0)
|
||||||
|
{
|
||||||
|
if ( $this->odbc_driver == ODB_DRIVER_JET ) {
|
||||||
|
$name = '['.$name.']';
|
||||||
|
if( !$type && $this->_useUnicodeSQL
|
||||||
|
&& @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR )
|
||||||
|
{
|
||||||
|
$type = ODB_WCHAR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$name = '@'.$name;
|
||||||
|
}
|
||||||
|
return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Insert a null into the blob field of the table first.
|
||||||
|
Then use UpdateBlob to store the blob.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||||
|
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||||
|
*/
|
||||||
|
|
||||||
|
function UpdateBlob($table,$column,$val,$where,$blobtype='image')
|
||||||
|
{
|
||||||
|
$sql = "UPDATE $table SET $column = ? WHERE $where";
|
||||||
|
if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) )
|
||||||
|
return false;
|
||||||
|
if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) )
|
||||||
|
return false;
|
||||||
|
if( !@odbtp_set( $stmt, 1, $val ) )
|
||||||
|
return false;
|
||||||
|
return @odbtp_execute( $stmt ) != false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes($table,$primary=false)
|
||||||
|
{
|
||||||
|
switch ( $this->odbc_driver) {
|
||||||
|
case ODB_DRIVER_MSSQL:
|
||||||
|
return $this->MetaIndexes_mssql($table, $primary);
|
||||||
|
default:
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes_mssql($table,$primary=false)
|
||||||
|
{
|
||||||
|
$table = strtolower($this->qstr($table));
|
||||||
|
|
||||||
|
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||||
|
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||||
|
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||||
|
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||||
|
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||||
|
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||||
|
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND lower(O.Name) = $table
|
||||||
|
ORDER BY O.name, I.Name, K.keyno";
|
||||||
|
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
if ($primary && !$row[5]) continue;
|
||||||
|
|
||||||
|
$indexes[$row[0]]['unique'] = $row[6];
|
||||||
|
$indexes[$row[0]]['columns'][] = $row[1];
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function IfNull( $field, $ifNull )
|
||||||
|
{
|
||||||
|
switch( $this->odbc_driver ) {
|
||||||
|
case ODB_DRIVER_MSSQL:
|
||||||
|
return " ISNULL($field, $ifNull) ";
|
||||||
|
case ODB_DRIVER_JET:
|
||||||
|
return " IIF(IsNull($field), $ifNull, $field) ";
|
||||||
|
}
|
||||||
|
return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
global $php_errormsg;
|
||||||
|
|
||||||
|
if ($inputarr) {
|
||||||
|
if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
} else {
|
||||||
|
$stmtid = @odbtp_prepare($sql,$this->_connectionID);
|
||||||
|
if ($stmtid == false) {
|
||||||
|
$this->_errorMsg = $php_errormsg;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$num_params = @odbtp_num_params( $stmtid );
|
||||||
|
for( $param = 1; $param <= $num_params; $param++ ) {
|
||||||
|
@odbtp_input( $stmtid, $param );
|
||||||
|
@odbtp_set( $stmtid, $param, $inputarr[$param-1] );
|
||||||
|
}
|
||||||
|
if (!@odbtp_execute($stmtid) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (is_array($sql)) {
|
||||||
|
$stmtid = $sql[1];
|
||||||
|
if (!@odbtp_execute($stmtid)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$stmtid = odbtp_query($sql,$this->_connectionID);
|
||||||
|
}
|
||||||
|
$this->_lastAffectedRows = 0;
|
||||||
|
if ($stmtid) {
|
||||||
|
$this->_lastAffectedRows = @odbtp_affected_rows($stmtid);
|
||||||
|
}
|
||||||
|
return $stmtid;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$ret = @odbtp_close($this->_connectionID);
|
||||||
|
$this->_connectionID = false;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp';
|
||||||
|
var $canSeek = true;
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
$this->ADORecordSet($queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$this->_numOfFields = @odbtp_num_fields($this->_queryID);
|
||||||
|
if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID)))
|
||||||
|
$this->_numOfRows = -1;
|
||||||
|
|
||||||
|
if (!$this->connection->_useUnicodeSQL) return;
|
||||||
|
|
||||||
|
if ($this->connection->odbc_driver == ODB_DRIVER_JET) {
|
||||||
|
if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR,
|
||||||
|
$this->connection->_connectionID))
|
||||||
|
{
|
||||||
|
for ($f = 0; $f < $this->_numOfFields; $f++) {
|
||||||
|
if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR)
|
||||||
|
@odbtp_bind_field($this->_queryID, $f, ODB_WCHAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = 0)
|
||||||
|
{
|
||||||
|
$off=$fieldOffset; // offsets begin at 0
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$o->name = @odbtp_field_name($this->_queryID,$off);
|
||||||
|
$o->type = @odbtp_field_type($this->_queryID,$off);
|
||||||
|
$o->max_length = @odbtp_field_length($this->_queryID,$off);
|
||||||
|
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||||
|
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return @odbtp_data_seek($this->_queryID, $row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||||
|
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$name = @odbtp_field_name( $this->_queryID, $i );
|
||||||
|
$this->bind[strtoupper($name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch_odbtp($type=0)
|
||||||
|
{
|
||||||
|
switch ($this->fetchMode) {
|
||||||
|
case ADODB_FETCH_NUM:
|
||||||
|
$this->fields = @odbtp_fetch_row($this->_queryID, $type);
|
||||||
|
break;
|
||||||
|
case ADODB_FETCH_ASSOC:
|
||||||
|
$this->fields = @odbtp_fetch_assoc($this->_queryID, $type);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->fields = @odbtp_fetch_array($this->_queryID, $type);
|
||||||
|
}
|
||||||
|
if ($this->databaseType = 'odbtp_vfp') {
|
||||||
|
if ($this->fields)
|
||||||
|
foreach($this->fields as $k => $v) {
|
||||||
|
if (strncmp($v,'1899-12-30',10) == 0) $this->fields[$k] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return is_array($this->fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
return $this->_fetch_odbtp();
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveFirst()
|
||||||
|
{
|
||||||
|
if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false;
|
||||||
|
$this->EOF = false;
|
||||||
|
$this->_currentRow = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveLast()
|
||||||
|
{
|
||||||
|
if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false;
|
||||||
|
$this->EOF = false;
|
||||||
|
$this->_currentRow = $this->_numOfRows - 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function NextRecordSet()
|
||||||
|
{
|
||||||
|
if (!@odbtp_next_result($this->_queryID)) return false;
|
||||||
|
$this->_inited = false;
|
||||||
|
$this->bind = false;
|
||||||
|
$this->_currentRow = -1;
|
||||||
|
$this->Init();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @odbtp_free_query($this->_queryID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp_mssql';
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp_mssql($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbtp($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp_access extends ADORecordSet_odbtp {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp_access';
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp_access($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbtp($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp_vfp';
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp_vfp($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbtp($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp_oci8';
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp_oci8($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbtp($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp {
|
||||||
|
|
||||||
|
var $databaseType = 'odbtp_sybase';
|
||||||
|
|
||||||
|
function ADORecordSet_odbtp_sybase($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbtp($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
39
includes/adodb/drivers/adodb-odbtp_unicode.inc.php
Normal file
39
includes/adodb/drivers/adodb-odbtp_unicode.inc.php
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code contributed by "Robert Twitty" <rtwitty#neutron.ushmm.org>
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Because the ODBTP server sends and reads UNICODE text data using UTF-8
|
||||||
|
encoding, the following HTML meta tag must be included within the HTML
|
||||||
|
head section of every HTML form and script page:
|
||||||
|
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
|
||||||
|
Also, all SQL query strings must be submitted as UTF-8 encoded text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBTP_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbtp.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADODB_odbtp_unicode extends ADODB_odbtp {
|
||||||
|
var $databaseType = 'odbtp';
|
||||||
|
var $_useUnicodeSQL = true;
|
||||||
|
|
||||||
|
function ADODB_odbtp_unicode()
|
||||||
|
{
|
||||||
|
$this->ADODB_odbtp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
338
includes/adodb/drivers/adodb-oracle.inc.php
Normal file
338
includes/adodb/drivers/adodb-oracle.inc.php
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7.
|
||||||
|
|
||||||
|
If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB_oracle extends ADOConnection {
|
||||||
|
var $databaseType = "oracle";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $_curs;
|
||||||
|
var $_initdate = true; // init date to YYYY-MM-DD
|
||||||
|
var $metaTablesSQL = 'select table_name from cat';
|
||||||
|
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
|
||||||
|
var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')";
|
||||||
|
var $sysTimeStamp = 'SYSDATE';
|
||||||
|
var $connectSID = true;
|
||||||
|
|
||||||
|
function ADODB_oracle()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// format and return date string in database date format
|
||||||
|
function DBDate($d)
|
||||||
|
{
|
||||||
|
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
|
||||||
|
return 'TO_DATE('.adodb_date($this->fmtDate,$d).",'YYYY-MM-DD')";
|
||||||
|
}
|
||||||
|
|
||||||
|
// format and return date string in database timestamp format
|
||||||
|
function DBTimeStamp($ts)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
|
||||||
|
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BindDate($d)
|
||||||
|
{
|
||||||
|
$d = ADOConnection::DBDate($d);
|
||||||
|
if (strncmp($d,"'",1)) return $d;
|
||||||
|
|
||||||
|
return substr($d,1,strlen($d)-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function BindTimeStamp($d)
|
||||||
|
{
|
||||||
|
$d = ADOConnection::DBTimeStamp($d);
|
||||||
|
if (strncmp($d,"'",1)) return $d;
|
||||||
|
|
||||||
|
return substr($d,1,strlen($d)-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
$this->autoCommit = false;
|
||||||
|
ora_commitoff($this->_connectionID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
$ret = ora_commit($this->_connectionID);
|
||||||
|
ora_commiton($this->_connectionID);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
$ret = ora_rollback($this->_connectionID);
|
||||||
|
ora_commiton($this->_connectionID);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||||
|
|
||||||
|
if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs);
|
||||||
|
if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID);
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if ($this->_errorCode !== false) return $this->_errorCode;
|
||||||
|
|
||||||
|
if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs);
|
||||||
|
if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID);
|
||||||
|
return $this->_errorCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
|
||||||
|
{
|
||||||
|
if (!function_exists('ora_plogon')) return null;
|
||||||
|
|
||||||
|
// <G. Giunta 2003/03/03/> Reset error messages before connecting
|
||||||
|
$this->_errorMsg = false;
|
||||||
|
$this->_errorCode = false;
|
||||||
|
|
||||||
|
// G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set
|
||||||
|
// the oracle home to the host name of remote DB?
|
||||||
|
// if ($argHostname) putenv("ORACLE_HOME=$argHostname");
|
||||||
|
|
||||||
|
if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen <jorma.tuomainen@ppoy.fi>
|
||||||
|
if (empty($argDatabasename)) $argDatabasename = $argHostname;
|
||||||
|
else {
|
||||||
|
if(strpos($argHostname,":")) {
|
||||||
|
$argHostinfo=explode(":",$argHostname);
|
||||||
|
$argHostname=$argHostinfo[0];
|
||||||
|
$argHostport=$argHostinfo[1];
|
||||||
|
} else {
|
||||||
|
$argHostport="1521";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($this->connectSID) {
|
||||||
|
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
|
||||||
|
.")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
|
||||||
|
} else
|
||||||
|
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
|
||||||
|
.")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($argDatabasename) $argUsername .= "@$argDatabasename";
|
||||||
|
|
||||||
|
//if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
|
||||||
|
if ($mode == 1)
|
||||||
|
$this->_connectionID = ora_plogon($argUsername,$argPassword);
|
||||||
|
else
|
||||||
|
$this->_connectionID = ora_logon($argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($this->autoCommit) ora_commiton($this->_connectionID);
|
||||||
|
if ($this->_initdate) {
|
||||||
|
$rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'");
|
||||||
|
if ($rs) ora_close($rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
// <G. Giunta 2003/03/03/> Reset error messages before executing
|
||||||
|
$this->_errorMsg = false;
|
||||||
|
$this->_errorCode = false;
|
||||||
|
|
||||||
|
$curs = ora_open($this->_connectionID);
|
||||||
|
|
||||||
|
if ($curs === false) return false;
|
||||||
|
$this->_curs = $curs;
|
||||||
|
if (!ora_parse($curs,$sql)) return false;
|
||||||
|
if (ora_exec($curs)) return $curs;
|
||||||
|
// <G. Giunta 2004/03/03> before we close the cursor, we have to store the error message
|
||||||
|
// that we can obtain ONLY from the cursor (and not from the connection)
|
||||||
|
$this->_errorCode = @ora_errorcode($curs);
|
||||||
|
$this->_errorMsg = @ora_error($curs);
|
||||||
|
// </G. Giunta 2004/03/03>
|
||||||
|
@ora_close($curs);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @ora_logoff($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_oracle extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = "oracle";
|
||||||
|
var $bind = false;
|
||||||
|
|
||||||
|
function ADORecordset_oracle($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
|
||||||
|
$this->_queryID = $queryID;
|
||||||
|
|
||||||
|
$this->_inited = true;
|
||||||
|
$this->fields = array();
|
||||||
|
if ($queryID) {
|
||||||
|
$this->_currentRow = 0;
|
||||||
|
$this->EOF = !$this->_fetch();
|
||||||
|
@$this->_initrs();
|
||||||
|
} else {
|
||||||
|
$this->_numOfRows = 0;
|
||||||
|
$this->_numOfFields = 0;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_queryID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns: an object containing field information.
|
||||||
|
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||||
|
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||||
|
fetchField() is retrieved. */
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$fld->name = ora_columnname($this->_queryID, $fieldOffset);
|
||||||
|
$fld->type = ora_columntype($this->_queryID, $fieldOffset);
|
||||||
|
$fld->max_length = ora_columnsize($this->_queryID, $fieldOffset);
|
||||||
|
return $fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use associative array to get fields array */
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$this->_numOfRows = -1;
|
||||||
|
$this->_numOfFields = @ora_numcols($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch($ignore_fields=false) {
|
||||||
|
// should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1
|
||||||
|
if ($this->fetchMode & ADODB_FETCH_ASSOC)
|
||||||
|
return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC);
|
||||||
|
else
|
||||||
|
return @ora_fetch_into($this->_queryID,&$this->fields,ORA_FETCHINTO_NULLS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||||
|
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @ora_close($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'VARCHAR2':
|
||||||
|
case 'CHAR':
|
||||||
|
case 'VARBINARY':
|
||||||
|
case 'BINARY':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
case 'LONG':
|
||||||
|
case 'LONG VARCHAR':
|
||||||
|
case 'CLOB':
|
||||||
|
return 'X';
|
||||||
|
case 'LONG RAW':
|
||||||
|
case 'LONG VARBINARY':
|
||||||
|
case 'BLOB':
|
||||||
|
return 'B';
|
||||||
|
|
||||||
|
case 'DATE': return 'D';
|
||||||
|
|
||||||
|
//case 'T': return 'T';
|
||||||
|
|
||||||
|
case 'BIT': return 'L';
|
||||||
|
case 'INT':
|
||||||
|
case 'SMALLINT':
|
||||||
|
case 'INTEGER': return 'I';
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
580
includes/adodb/drivers/adodb-pdo.inc.php
Normal file
580
includes/adodb/drivers/adodb-pdo.inc.php
Normal file
@ -0,0 +1,580 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Requires ODBC. Works on Windows and Unix.
|
||||||
|
|
||||||
|
Problems:
|
||||||
|
Where is float/decimal type in pdo_param_type
|
||||||
|
LOB handling for CLOB/BLOB differs significantly
|
||||||
|
*/
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
enum pdo_param_type {
|
||||||
|
PDO::PARAM_NULL, 0
|
||||||
|
|
||||||
|
/* int as in long (the php native int type).
|
||||||
|
* If you mark a column as an int, PDO expects get_col to return
|
||||||
|
* a pointer to a long
|
||||||
|
PDO::PARAM_INT, 1
|
||||||
|
|
||||||
|
/* get_col ptr should point to start of the string buffer
|
||||||
|
PDO::PARAM_STR, 2
|
||||||
|
|
||||||
|
/* get_col: when len is 0 ptr should point to a php_stream *,
|
||||||
|
* otherwise it should behave like a string. Indicate a NULL field
|
||||||
|
* value by setting the ptr to NULL
|
||||||
|
PDO::PARAM_LOB, 3
|
||||||
|
|
||||||
|
/* get_col: will expect the ptr to point to a new PDOStatement object handle,
|
||||||
|
* but this isn't wired up yet
|
||||||
|
PDO::PARAM_STMT, 4 /* hierarchical result set
|
||||||
|
|
||||||
|
/* get_col ptr should point to a zend_bool
|
||||||
|
PDO::PARAM_BOOL, 5
|
||||||
|
|
||||||
|
|
||||||
|
/* magic flag to denote a parameter as being input/output
|
||||||
|
PDO::PARAM_INPUT_OUTPUT = 0x80000000
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
function adodb_pdo_type($t)
|
||||||
|
{
|
||||||
|
switch($t) {
|
||||||
|
case 2: return 'VARCHAR';
|
||||||
|
case 3: return 'BLOB';
|
||||||
|
default: return 'NUMERIC';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ADODB_pdo extends ADOConnection {
|
||||||
|
var $databaseType = "pdo";
|
||||||
|
var $dataProvider = "pdo";
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
var $_genSeqSQL = "create table %s (id integer)";
|
||||||
|
var $_autocommit = true;
|
||||||
|
var $_haserrorfunctions = true;
|
||||||
|
var $_lastAffectedRows = 0;
|
||||||
|
|
||||||
|
var $_errormsg = false;
|
||||||
|
var $_errorno = false;
|
||||||
|
|
||||||
|
var $dsnType = '';
|
||||||
|
var $stmt = false;
|
||||||
|
|
||||||
|
function ADODB_pdo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
function _UpdatePDO()
|
||||||
|
{
|
||||||
|
$d = $this->_driver;
|
||||||
|
$this->fmtDate = $d->fmtDate;
|
||||||
|
$this->fmtTimeStamp = $d->fmtTimeStamp;
|
||||||
|
$this->replaceQuote = $d->replaceQuote;
|
||||||
|
$this->sysDate = $d->sysDate;
|
||||||
|
$this->sysTimeStamp = $d->sysTimeStamp;
|
||||||
|
$this->random = $d->random;
|
||||||
|
$this->concat_operator = $d->concat_operator;
|
||||||
|
$this->nameQuote = $d->nameQuote;
|
||||||
|
|
||||||
|
$this->hasGenID = $d->hasGenID;
|
||||||
|
$this->_genIDSQL = $d->_genIDSQL;
|
||||||
|
$this->_genSeqSQL = $d->_genSeqSQL;
|
||||||
|
$this->_dropSeqSQL = $d->_dropSeqSQL;
|
||||||
|
|
||||||
|
$d->_init($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Time()
|
||||||
|
{
|
||||||
|
if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual";
|
||||||
|
else $sql = "select $this->sysTimeStamp";
|
||||||
|
|
||||||
|
$rs = $this->_Execute($sql);
|
||||||
|
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
|
||||||
|
{
|
||||||
|
$at = strpos($argDSN,':');
|
||||||
|
$this->dsnType = substr($argDSN,0,$at);
|
||||||
|
|
||||||
|
if ($argDatabasename) {
|
||||||
|
$argDSN .= ';dbname='.$argDatabasename;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->_connectionID = false;
|
||||||
|
$this->_errorno = -1;
|
||||||
|
//var_dump($e);
|
||||||
|
$this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->_connectionID) {
|
||||||
|
switch(ADODB_ASSOC_CASE){
|
||||||
|
case 0: $m = PDO::CASE_LOWER; break;
|
||||||
|
case 1: $m = PDO::CASE_UPPER; break;
|
||||||
|
default:
|
||||||
|
case 2: $m = PDO::CASE_NATURAL; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
|
||||||
|
$this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);
|
||||||
|
|
||||||
|
$class = 'ADODB_pdo_'.$this->dsnType;
|
||||||
|
//$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||||
|
switch($this->dsnType) {
|
||||||
|
case 'oci':
|
||||||
|
case 'mysql':
|
||||||
|
case 'pgsql':
|
||||||
|
case 'mssql':
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (class_exists($class))
|
||||||
|
$this->_driver = new $class();
|
||||||
|
else
|
||||||
|
$this->_driver = new ADODB_pdo_base();
|
||||||
|
|
||||||
|
$this->_driver->_connectionID = $this->_connectionID;
|
||||||
|
$this->_UpdatePDO();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$this->_driver = new ADODB_pdo_base();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Concat()
|
||||||
|
{
|
||||||
|
$args = func_get_args();
|
||||||
|
if(method_exists($this->_driver, 'Concat'))
|
||||||
|
return call_user_func_array(array($this->_driver, 'Concat'), $args);
|
||||||
|
|
||||||
|
return call_user_func_array(array($this,'parent::Concat'), $args);
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$save = $this->_driver->fetchMode;
|
||||||
|
$this->_driver->fetchMode = $this->fetchMode;
|
||||||
|
$this->_driver->debug = $this->debug;
|
||||||
|
$ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
$this->_driver->fetchMode = $save;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
return $this->_driver->ServerInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
return $this->_driver->MetaTables($ttype,$showSchema,$mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table,$normalize=true)
|
||||||
|
{
|
||||||
|
return $this->_driver->MetaColumns($table,$normalize);
|
||||||
|
}
|
||||||
|
|
||||||
|
function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
|
||||||
|
{
|
||||||
|
$obj = $stmt[1];
|
||||||
|
if ($type) $obj->bindParam($name,$var,$type,$maxLen);
|
||||||
|
else $obj->bindParam($name, $var);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_errormsg !== false) return $this->_errormsg;
|
||||||
|
if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo();
|
||||||
|
else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo();
|
||||||
|
else return 'No Connection Established';
|
||||||
|
|
||||||
|
|
||||||
|
if ($arr) {
|
||||||
|
if (sizeof($arr)<2) return '';
|
||||||
|
if ((integer)$arr[1]) return $arr[2];
|
||||||
|
else return '';
|
||||||
|
} else return '-1';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if ($this->_errorno !== false) return $this->_errorno;
|
||||||
|
if (!empty($this->_stmt)) $err = $this->_stmt->errorCode();
|
||||||
|
else if (!empty($this->_connectionID)) {
|
||||||
|
$arr = $this->_connectionID->errorInfo();
|
||||||
|
if (isset($arr[0])) $err = $arr[0];
|
||||||
|
else $err = -1;
|
||||||
|
} else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ($err == '00000') return 0; // allows empty check
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->_autocommit = false;
|
||||||
|
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
|
||||||
|
return $this->_connectionID->beginTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
|
||||||
|
$ret = $this->_connectionID->commit();
|
||||||
|
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
|
||||||
|
$ret = $this->_connectionID->rollback();
|
||||||
|
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
$this->_stmt = $this->_connectionID->prepare($sql);
|
||||||
|
if ($this->_stmt) return array($sql,$this->_stmt);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function PrepareStmt($sql)
|
||||||
|
{
|
||||||
|
$stmt = $this->_connectionID->prepare($sql);
|
||||||
|
if (!$stmt) return false;
|
||||||
|
$obj = new ADOPDOStatement($stmt,$this);
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* returns queryID or false */
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
if (is_array($sql)) {
|
||||||
|
$stmt = $sql[1];
|
||||||
|
} else {
|
||||||
|
$stmt = $this->_connectionID->prepare($sql);
|
||||||
|
}
|
||||||
|
#adodb_backtrace();
|
||||||
|
#var_dump($this->_bindInputArray);
|
||||||
|
if ($stmt) {
|
||||||
|
$this->_driver->debug = $this->debug;
|
||||||
|
if ($inputarr) $ok = $stmt->execute($inputarr);
|
||||||
|
else $ok = $stmt->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$this->_errormsg = false;
|
||||||
|
$this->_errorno = false;
|
||||||
|
|
||||||
|
if ($ok) {
|
||||||
|
$this->_stmt = $stmt;
|
||||||
|
return $stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($stmt) {
|
||||||
|
|
||||||
|
$arr = $stmt->errorinfo();
|
||||||
|
if ((integer)$arr[1]) {
|
||||||
|
$this->_errormsg = $arr[2];
|
||||||
|
$this->_errorno = $arr[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$this->_errormsg = false;
|
||||||
|
$this->_errorno = false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$this->_stmt = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADODB_pdo_base extends ADODB_pdo {
|
||||||
|
|
||||||
|
var $sysDate = "'?'";
|
||||||
|
var $sysTimeStamp = "'?'";
|
||||||
|
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
$parentDriver->_bindInputArray = true;
|
||||||
|
#$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
return ADOConnection::ServerInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADOPDOStatement {
|
||||||
|
|
||||||
|
var $databaseType = "pdo";
|
||||||
|
var $dataProvider = "pdo";
|
||||||
|
var $_stmt;
|
||||||
|
var $_connectionID;
|
||||||
|
|
||||||
|
function ADOPDOStatement($stmt,$connection)
|
||||||
|
{
|
||||||
|
$this->_stmt = $stmt;
|
||||||
|
$this->_connectionID = $connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Execute($inputArr=false)
|
||||||
|
{
|
||||||
|
$savestmt = $this->_connectionID->_stmt;
|
||||||
|
$rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
|
||||||
|
$this->_connectionID->_stmt = $savestmt;
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function InParameter(&$var,$name,$maxLen=4000,$type=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen);
|
||||||
|
else $this->_stmt->bindParam($name, $var);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Affected_Rows()
|
||||||
|
{
|
||||||
|
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_stmt) $arr = $this->_stmt->errorInfo();
|
||||||
|
else $arr = $this->_connectionID->errorInfo();
|
||||||
|
|
||||||
|
if (is_array($arr)) {
|
||||||
|
if ((integer) $arr[0] && isset($arr[2])) return $arr[2];
|
||||||
|
else return '';
|
||||||
|
} else return '-1';
|
||||||
|
}
|
||||||
|
|
||||||
|
function NumCols()
|
||||||
|
{
|
||||||
|
return ($this->_stmt) ? $this->_stmt->columnCount() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
if ($this->_stmt) return $this->_stmt->errorCode();
|
||||||
|
else return $this->_connectionID->errorInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_pdo extends ADORecordSet {
|
||||||
|
|
||||||
|
var $bind = false;
|
||||||
|
var $databaseType = "pdo";
|
||||||
|
var $dataProvider = "pdo";
|
||||||
|
|
||||||
|
function ADORecordSet_pdo($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
switch($mode) {
|
||||||
|
case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break;
|
||||||
|
|
||||||
|
case ADODB_FETCH_BOTH:
|
||||||
|
default: $mode = PDO::FETCH_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->fetchMode = $mode;
|
||||||
|
|
||||||
|
$this->_queryID = $id;
|
||||||
|
$this->ADORecordSet($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Init()
|
||||||
|
{
|
||||||
|
if ($this->_inited) return;
|
||||||
|
$this->_inited = true;
|
||||||
|
if ($this->_queryID) @$this->_initrs();
|
||||||
|
else {
|
||||||
|
$this->_numOfRows = 0;
|
||||||
|
$this->_numOfFields = 0;
|
||||||
|
}
|
||||||
|
if ($this->_numOfRows != 0 && $this->_currentRow == -1) {
|
||||||
|
$this->_currentRow = 0;
|
||||||
|
if ($this->EOF = ($this->_fetch() === false)) {
|
||||||
|
$this->_numOfRows = 0; // _numOfRows could be -1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
|
||||||
|
if (!$this->_numOfRows) $this->_numOfRows = -1;
|
||||||
|
$this->_numOfFields = $this->_queryID->columnCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the field object
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
$off=$fieldOffset+1; // offsets begin at 1
|
||||||
|
|
||||||
|
$o= new ADOFieldObject();
|
||||||
|
$arr = @$this->_queryID->getColumnMeta($fieldOffset);
|
||||||
|
if (!$arr) {
|
||||||
|
$o->name = 'bad getColumnMeta()';
|
||||||
|
$o->max_length = -1;
|
||||||
|
$o->type = 'VARCHAR';
|
||||||
|
$o->precision = 0;
|
||||||
|
# $false = false;
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
//adodb_pr($arr);
|
||||||
|
$o->name = $arr['name'];
|
||||||
|
if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type'];
|
||||||
|
else $o->type = adodb_pdo_type($arr['pdo_type']);
|
||||||
|
$o->max_length = $arr['len'];
|
||||||
|
$o->precision = $arr['precision'];
|
||||||
|
|
||||||
|
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||||
|
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
if (!$this->_queryID) return false;
|
||||||
|
|
||||||
|
$this->fields = $this->_queryID->fetch($this->fetchMode);
|
||||||
|
return !empty($this->fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
$this->_queryID = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->adodbFetchMode != ADODB_FETCH_NUM) return @$this->fields[$colname];
|
||||||
|
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
61
includes/adodb/drivers/adodb-pdo_mssql.inc.php
Normal file
61
includes/adodb/drivers/adodb-pdo_mssql.inc.php
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB_pdo_mssql extends ADODB_pdo {
|
||||||
|
|
||||||
|
var $hasTop = 'top';
|
||||||
|
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||||
|
var $sysTimeStamp = 'GetDate()';
|
||||||
|
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
|
||||||
|
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO mssql driver
|
||||||
|
$parentDriver->_bindInputArray = false;
|
||||||
|
$parentDriver->hasInsertID = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
return ADOConnection::ServerInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
182
includes/adodb/drivers/adodb-pdo_mysql.inc.php
Normal file
182
includes/adodb/drivers/adodb-pdo_mysql.inc.php
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB_pdo_mysql extends ADODB_pdo {
|
||||||
|
var $metaTablesSQL = "SHOW TABLES";
|
||||||
|
var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
|
||||||
|
var $sysDate = 'CURDATE()';
|
||||||
|
var $sysTimeStamp = 'NOW()';
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
|
||||||
|
var $_dropSeqSQL = "drop table %s";
|
||||||
|
|
||||||
|
var $nameQuote = '`';
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
|
||||||
|
$parentDriver->hasTransactions = false;
|
||||||
|
#$parentDriver->_bindInputArray = false;
|
||||||
|
$parentDriver->hasInsertID = true;
|
||||||
|
$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// dayFraction is a day in floating point
|
||||||
|
function OffsetDate($dayFraction,$date=false)
|
||||||
|
{
|
||||||
|
if (!$date) $date = $this->sysDate;
|
||||||
|
|
||||||
|
$fraction = $dayFraction * 24 * 3600;
|
||||||
|
return $date . ' + INTERVAL ' . $fraction.' SECOND';
|
||||||
|
|
||||||
|
// return "from_unixtime(unix_timestamp($date)+$fraction)";
|
||||||
|
}
|
||||||
|
|
||||||
|
function Concat()
|
||||||
|
{
|
||||||
|
$s = "";
|
||||||
|
$arr = func_get_args();
|
||||||
|
|
||||||
|
// suggestion by andrew005#mnogo.ru
|
||||||
|
$s = implode(',',$arr);
|
||||||
|
if (strlen($s) > 0) return "CONCAT($s)"; return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||||
|
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
if ($showSchema && is_string($showSchema)) {
|
||||||
|
$this->metaTablesSQL .= " from $showSchema";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$mask = $this->qstr($mask);
|
||||||
|
$this->metaTablesSQL .= " like $mask";
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetTransactionMode( $transaction_mode )
|
||||||
|
{
|
||||||
|
$this->_transmode = $transaction_mode;
|
||||||
|
if (empty($transaction_mode)) {
|
||||||
|
$this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||||
|
$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
if ($schema) {
|
||||||
|
$dbName = $this->database;
|
||||||
|
$this->SelectDB($schema);
|
||||||
|
}
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||||
|
|
||||||
|
if ($schema) {
|
||||||
|
$this->SelectDB($dbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF){
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$type = $rs->fields[1];
|
||||||
|
|
||||||
|
// split type into type(length):
|
||||||
|
$fld->scale = null;
|
||||||
|
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||||
|
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
|
||||||
|
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||||
|
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
|
||||||
|
$fld->type = $query_array[1];
|
||||||
|
$arr = explode(",",$query_array[2]);
|
||||||
|
$fld->enums = $arr;
|
||||||
|
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
|
||||||
|
$fld->max_length = ($zlen > 0) ? $zlen : 1;
|
||||||
|
} else {
|
||||||
|
$fld->type = $type;
|
||||||
|
$fld->max_length = -1;
|
||||||
|
}
|
||||||
|
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||||
|
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||||
|
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||||
|
$fld->binary = (strpos($type,'blob') !== false);
|
||||||
|
$fld->unsigned = (strpos($type,'unsigned') !== false);
|
||||||
|
|
||||||
|
if (!$fld->binary) {
|
||||||
|
$d = $rs->fields[4];
|
||||||
|
if ($d != '' && $d != 'NULL') {
|
||||||
|
$fld->has_default = true;
|
||||||
|
$fld->default_value = $d;
|
||||||
|
} else {
|
||||||
|
$fld->has_default = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($save == ADODB_FETCH_NUM) {
|
||||||
|
$retarr[] = $fld;
|
||||||
|
} else {
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
}
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// parameters use PostgreSQL convention, not MySQL
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
|
||||||
|
{
|
||||||
|
$offsetStr =($offset>=0) ? "$offset," : '';
|
||||||
|
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
|
||||||
|
if ($nrows < 0) $nrows = '18446744073709551615';
|
||||||
|
|
||||||
|
if ($secs)
|
||||||
|
$rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
93
includes/adodb/drivers/adodb-pdo_oci.inc.php
Normal file
93
includes/adodb/drivers/adodb-pdo_oci.inc.php
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB_pdo_oci extends ADODB_pdo_base {
|
||||||
|
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $sysDate = "TRUNC(SYSDATE)";
|
||||||
|
var $sysTimeStamp = 'SYSDATE';
|
||||||
|
var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
|
||||||
|
var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
|
||||||
|
var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')";
|
||||||
|
var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno";
|
||||||
|
|
||||||
|
var $_initdate = true;
|
||||||
|
var $_hasdual = true;
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
$parentDriver->_bindInputArray = true;
|
||||||
|
$parentDriver->_nestedSQL = true;
|
||||||
|
if ($this->_initdate) {
|
||||||
|
$parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
if ($mask) {
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
$mask = $this->qstr(strtoupper($mask));
|
||||||
|
$this->metaTablesSQL .= " AND table_name like $mask";
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$false = false;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||||
|
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
if (!$rs) {
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) { //print_r($rs->fields);
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
$fld->max_length = $rs->fields[2];
|
||||||
|
$fld->scale = $rs->fields[3];
|
||||||
|
if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) {
|
||||||
|
$fld->type ='INT';
|
||||||
|
$fld->max_length = $rs->fields[4];
|
||||||
|
}
|
||||||
|
$fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
|
||||||
|
$fld->binary = (strpos($fld->type,'BLOB') !== false);
|
||||||
|
$fld->default_value = $rs->fields[6];
|
||||||
|
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||||
|
else $retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
if (empty($retarr))
|
||||||
|
return $false;
|
||||||
|
else
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
230
includes/adodb/drivers/adodb-pdo_pgsql.inc.php
Normal file
230
includes/adodb/drivers/adodb-pdo_pgsql.inc.php
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 8.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB_pdo_pgsql extends ADODB_pdo {
|
||||||
|
var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
|
||||||
|
var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
|
||||||
|
and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
|
||||||
|
'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
|
||||||
|
union
|
||||||
|
select viewname,'V' from pg_views where viewname not like 'pg\_%'";
|
||||||
|
//"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
|
||||||
|
var $isoDates = true; // accepts dates in ISO format
|
||||||
|
var $sysDate = "CURRENT_DATE";
|
||||||
|
var $sysTimeStamp = "CURRENT_TIMESTAMP";
|
||||||
|
var $blobEncodeType = 'C';
|
||||||
|
var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
|
||||||
|
FROM pg_class c, pg_attribute a,pg_type t
|
||||||
|
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
|
||||||
|
AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
|
||||||
|
|
||||||
|
// used when schema defined
|
||||||
|
var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
|
||||||
|
FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
|
||||||
|
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
|
||||||
|
and c.relnamespace=n.oid and n.nspname='%s'
|
||||||
|
and a.attname not like '....%%' AND a.attnum > 0
|
||||||
|
AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
|
||||||
|
|
||||||
|
// get primary key etc -- from Freek Dijkstra
|
||||||
|
var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key
|
||||||
|
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'";
|
||||||
|
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
|
||||||
|
// below suggested by Freek Dijkstra
|
||||||
|
var $true = 't'; // string that represents TRUE for a database
|
||||||
|
var $false = 'f'; // string that represents FALSE for a database
|
||||||
|
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
|
||||||
|
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
|
||||||
|
var $hasMoveFirst = true;
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $_genIDSQL = "SELECT NEXTVAL('%s')";
|
||||||
|
var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
|
||||||
|
var $_dropSeqSQL = "DROP SEQUENCE %s";
|
||||||
|
var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum";
|
||||||
|
var $random = 'random()'; /// random function
|
||||||
|
var $concat_operator='||';
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
|
||||||
|
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
|
||||||
|
$parentDriver->hasInsertID = true;
|
||||||
|
$parentDriver->_nestedSQL = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||||
|
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
|
||||||
|
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : '';
|
||||||
|
if ($secs2cache)
|
||||||
|
$rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
$info = $this->ServerInfo();
|
||||||
|
if ($info['version'] >= 7.3) {
|
||||||
|
$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
|
||||||
|
and schemaname not in ( 'pg_catalog','information_schema')
|
||||||
|
union
|
||||||
|
select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') ";
|
||||||
|
}
|
||||||
|
if ($mask) {
|
||||||
|
$save = $this->metaTablesSQL;
|
||||||
|
$mask = $this->qstr(strtolower($mask));
|
||||||
|
if ($info['version']>=7.3)
|
||||||
|
$this->metaTablesSQL = "
|
||||||
|
select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')
|
||||||
|
union
|
||||||
|
select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') ";
|
||||||
|
else
|
||||||
|
$this->metaTablesSQL = "
|
||||||
|
select tablename,'T' from pg_tables where tablename like $mask
|
||||||
|
union
|
||||||
|
select viewname,'V' from pg_views where viewname like $mask";
|
||||||
|
}
|
||||||
|
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||||
|
|
||||||
|
if ($mask) {
|
||||||
|
$this->metaTablesSQL = $save;
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns($table,$normalize=true)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
|
||||||
|
$schema = false;
|
||||||
|
$this->_findschema($table,$schema);
|
||||||
|
|
||||||
|
if ($normalize) $table = strtolower($table);
|
||||||
|
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
|
||||||
|
if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
|
||||||
|
else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if ($rs === false) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
if (!empty($this->metaKeySQL)) {
|
||||||
|
// If we want the primary keys, we have to issue a separate query
|
||||||
|
// Of course, a modified version of the metaColumnsSQL query using a
|
||||||
|
// LEFT JOIN would have been much more elegant, but postgres does
|
||||||
|
// not support OUTER JOINS. So here is the clumsy way.
|
||||||
|
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||||
|
|
||||||
|
$rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
|
||||||
|
// fetch all result in once for performance.
|
||||||
|
$keys = $rskey->GetArray();
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
$rskey->Close();
|
||||||
|
unset($rskey);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rsdefa = array();
|
||||||
|
if (!empty($this->metaDefaultsSQL)) {
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||||
|
$sql = sprintf($this->metaDefaultsSQL, ($table));
|
||||||
|
$rsdef = $this->Execute($sql);
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if ($rsdef) {
|
||||||
|
while (!$rsdef->EOF) {
|
||||||
|
$num = $rsdef->fields['num'];
|
||||||
|
$s = $rsdef->fields['def'];
|
||||||
|
if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
|
||||||
|
$s = substr($s, 1);
|
||||||
|
$s = substr($s, 0, strlen($s) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rsdefa[$num] = $s;
|
||||||
|
$rsdef->MoveNext();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ADOConnection::outp( "==> SQL => " . $sql);
|
||||||
|
}
|
||||||
|
unset($rsdef);
|
||||||
|
}
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->fields[0];
|
||||||
|
$fld->type = $rs->fields[1];
|
||||||
|
$fld->max_length = $rs->fields[2];
|
||||||
|
if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
|
||||||
|
if ($fld->max_length <= 0) $fld->max_length = -1;
|
||||||
|
if ($fld->type == 'numeric') {
|
||||||
|
$fld->scale = $fld->max_length & 0xFFFF;
|
||||||
|
$fld->max_length >>= 16;
|
||||||
|
}
|
||||||
|
// dannym
|
||||||
|
// 5 hasdefault; 6 num-of-column
|
||||||
|
$fld->has_default = ($rs->fields[5] == 't');
|
||||||
|
if ($fld->has_default) {
|
||||||
|
$fld->default_value = $rsdefa[$rs->fields[6]];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Freek
|
||||||
|
if ($rs->fields[4] == $this->true) {
|
||||||
|
$fld->not_null = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Freek
|
||||||
|
if (is_array($keys)) {
|
||||||
|
foreach($keys as $key) {
|
||||||
|
if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true)
|
||||||
|
$fld->primary_key = true;
|
||||||
|
if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true)
|
||||||
|
$fld->unique = true; // What name is more compatible?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||||
|
else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
|
||||||
|
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
if (empty($retarr)) {
|
||||||
|
$false = false;
|
||||||
|
return $false;
|
||||||
|
} else return $retarr;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
268
includes/adodb/drivers/adodb-pdo_sqlite.inc.php
Normal file
268
includes/adodb/drivers/adodb-pdo_sqlite.inc.php
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence. See License.txt.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Thanks Diogo Toscano (diogo#scriptcase.net) for the code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class ADODB_pdo_sqlite extends ADODB_pdo {
|
||||||
|
var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table'";
|
||||||
|
var $sysDate = 'current_date';
|
||||||
|
var $sysTimeStamp = 'current_timestamp';
|
||||||
|
var $nameQuote = '`';
|
||||||
|
var $replaceQuote = "''";
|
||||||
|
var $hasTransactions = true;
|
||||||
|
var $_bndInputArray = false;
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasGenID = true;
|
||||||
|
var $_genSeqSQL = "create table %s (id integer)";
|
||||||
|
var $_genSeqCountSQL = 'select count(*) from %s';
|
||||||
|
var $_genSeq2SQL = 'insert into %s values(%s)';
|
||||||
|
var $_dropSeqSQL = 'drop table %s';
|
||||||
|
var $_stmt = false;
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
$parentDriver->_bindInputArray = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr=false) {
|
||||||
|
if(strtolower(substr($sql,0,5)) != 'alter') {
|
||||||
|
return parent::_query($sql,$inputarr);
|
||||||
|
} else {
|
||||||
|
if(!$this->sqliteDropColumn($sql))
|
||||||
|
return parent::_query($sql,$inputarr);
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false) {
|
||||||
|
return parent::_connect($argDatabasename,'','','',$persist);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sqliteDropColumn($sql) {
|
||||||
|
$queryparts = preg_split("/[\s]+/",$sql,10,PREG_SPLIT_NO_EMPTY);
|
||||||
|
if(count($queryparts) == 6) {
|
||||||
|
$table = $queryparts[2];
|
||||||
|
$temp_table = $table.'_Temp';
|
||||||
|
$removeColumn = $queryparts[5];
|
||||||
|
$removeColumn = str_replace(';','',$removeColumn);
|
||||||
|
if(strtolower($queryparts[1]) != 'table' ||
|
||||||
|
strtolower($queryparts[3]) != 'drop' ||
|
||||||
|
strtolower($queryparts[4]) != 'column') {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// RENAME TABLE to TABLE_Temp
|
||||||
|
// CREATE new table without dropped column
|
||||||
|
// INSERT RECORDS from old table to new
|
||||||
|
// DROP Temp table
|
||||||
|
$meta = $this->MetaColumns($table);
|
||||||
|
$fields = Array();
|
||||||
|
$fieldNames = Array();
|
||||||
|
foreach($meta as $col) {
|
||||||
|
if($col->name != $removeColumn) {
|
||||||
|
$colText = $col->name;
|
||||||
|
if(!empty($col->type))
|
||||||
|
$colText .= ' '.$col->type;
|
||||||
|
if($col->not_null)
|
||||||
|
$colText .= ' NOT NULL';
|
||||||
|
if(!empty($col->default_value))
|
||||||
|
$colText .= ' DEFAULT '.$col->default_value.'';
|
||||||
|
|
||||||
|
$fieldNames[] = $col->name;
|
||||||
|
$fields[] = $colText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$fieldList = implode(',',$fields);
|
||||||
|
$fieldNameList = implode(',',$fieldNames);
|
||||||
|
|
||||||
|
$this->BeginTrans();
|
||||||
|
$sql = "SELECT sql FROM sqlite_master WHERE type = 'index' AND tbl_name = '$table'";
|
||||||
|
$result = $this->Execute($sql);
|
||||||
|
while(list($index) = $result->FetchRow()) {
|
||||||
|
$indexes[] = $index;
|
||||||
|
}
|
||||||
|
|
||||||
|
$renameTempSql = 'ALTER TABLE '.$table.' RENAME TO '.$temp_table.';';
|
||||||
|
$createTableSql = 'CREATE TABLE '.$table.'('.$fieldList.');';
|
||||||
|
$copyTableContentsSql = 'INSERT INTO '.$table.' SELECT '.$fieldNameList.' FROM '.$temp_table.';';
|
||||||
|
$removeTableSql = 'DROP TABLE '.$temp_table.';';
|
||||||
|
$vacuumSql = 'VACUUM '.$table.';';
|
||||||
|
|
||||||
|
// Do the steps to drop the column by renaming and creating new table
|
||||||
|
$ok = $this->Execute($renameTempSql);
|
||||||
|
if($ok) $ok = $this->Execute($createTableSql);
|
||||||
|
if($ok) $ok = $this->Execute($copyTableContentsSql);
|
||||||
|
|
||||||
|
$this->CommitTrans($ok);
|
||||||
|
|
||||||
|
if($ok) $ok = $this->Execute($removeTableSql);
|
||||||
|
if($ok) $ok = $this->Execute($vacuumSql);
|
||||||
|
|
||||||
|
// Recreate the indexes on the new table from the old
|
||||||
|
foreach($indexes as $indexSQL) {
|
||||||
|
$listStart = strpos($indexSQL,'(')+1;
|
||||||
|
$listEnd = strpos($indexSQL,')');
|
||||||
|
$indexList = substr($indexSQL,$listStart,$listEnd-$listStart);
|
||||||
|
$indexList = explode(',',$indexList);
|
||||||
|
$newIndexList = Array();
|
||||||
|
foreach($indexList as $listItem) {
|
||||||
|
$listItem = trim($listItem);
|
||||||
|
if($listItem != $removeColumn) {
|
||||||
|
$newIndexList[] = $listItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$indexSQL = substr($indexSQL,0,$listStart-1);
|
||||||
|
$indexSQL .= '('.implode(',',$newIndexList).');';
|
||||||
|
$this->Execute($indexSQL);
|
||||||
|
}
|
||||||
|
return $ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) {
|
||||||
|
$offsetStr =($offset>=0) ? "$offset," : '';
|
||||||
|
if ($secs)
|
||||||
|
$rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||||
|
else
|
||||||
|
$rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GenID($seq='adodbseq',$start=1) {
|
||||||
|
// if you have to modify the parameter below, your database is overloaded,
|
||||||
|
// or you need to implement generation of id's yourself!
|
||||||
|
$MAXLOOPS = 100;
|
||||||
|
//$this->debug=1;
|
||||||
|
while (--$MAXLOOPS>=0) {
|
||||||
|
@($num = array_pop($this->GetCol("select id from $seq")));
|
||||||
|
if ($num === false || !is_numeric($num)) {
|
||||||
|
@$this->Execute(sprintf($this->_genSeqSQL ,$seq));
|
||||||
|
$start -= 1;
|
||||||
|
$num = '0';
|
||||||
|
$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seq));
|
||||||
|
if (!$cnt) {
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeq2SQL,$seq,$start));
|
||||||
|
}
|
||||||
|
if (!$ok) return false;
|
||||||
|
}
|
||||||
|
$this->Execute("update $seq set id=id+1");
|
||||||
|
|
||||||
|
if ($this->affected_rows() > 0) {
|
||||||
|
$num += 1;
|
||||||
|
$this->genID = intval($num);
|
||||||
|
return intval($num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if($this->transCnt < 1) {
|
||||||
|
$this->transCnt += 1;
|
||||||
|
$this->_autocommit = false;
|
||||||
|
return $this->_connectionID->beginTransaction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
|
||||||
|
if($this->transCnt == 0)
|
||||||
|
$ret = $this->_connectionID->commit();
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if (!$this->hasTransactions) return false;
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if ($this->transCnt) $this->transCnt -= 1;
|
||||||
|
$this->_autocommit = true;
|
||||||
|
|
||||||
|
$ret = $this->_connectionID->rollback();
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$start=1) {
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||||
|
if (!$ok) return false;
|
||||||
|
$start -= 1;
|
||||||
|
return $this->Execute("insert into $seqname values($start)");
|
||||||
|
}
|
||||||
|
|
||||||
|
function DropSequence($seqname) {
|
||||||
|
if (empty($this->_dropSeqSQL)) return false;
|
||||||
|
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark newnham
|
||||||
|
function &MetaColumns($tab)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$false = false;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
$rs = $this->Execute("PRAGMA table_info('$tab')");
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
if (!$rs) {
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$arr = array();
|
||||||
|
while ($r = $rs->FetchRow()) {
|
||||||
|
$type = explode('(',$r['type']);
|
||||||
|
$size = '';
|
||||||
|
if (sizeof($type)==2)
|
||||||
|
$size = trim($type[1],')');
|
||||||
|
$fn = strtoupper($r['name']);
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$fld->name = $r['name'];
|
||||||
|
$fld->type = $type[0];
|
||||||
|
$fld->max_length = $size;
|
||||||
|
$fld->not_null = $r['notnull'];
|
||||||
|
$fld->primary_key = $r['pk'];
|
||||||
|
$fld->default_value = $r['dflt_value'];
|
||||||
|
$fld->scale = 0;
|
||||||
|
if ($save == ADODB_FETCH_NUM) $arr[] = $fld;
|
||||||
|
else $arr[strtoupper($fld->name)] = $fld;
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false) {
|
||||||
|
return $this->GetCol($this->metaTablesSQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
function __sleep() {
|
||||||
|
unset($this->_connectionID);
|
||||||
|
return( array_keys( get_object_vars( $this ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
14
includes/adodb/drivers/adodb-postgres.inc.php
Normal file
14
includes/adodb/drivers/adodb-postgres.inc.php
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
NOTE: Since 3.31, this file is no longer used, and the "postgres" driver is
|
||||||
|
remapped to "postgres7". Maintaining multiple postgres drivers is no easy
|
||||||
|
job, so hopefully this will ensure greater consistency and fewer bugs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
1065
includes/adodb/drivers/adodb-postgres64.inc.php
Normal file
1065
includes/adodb/drivers/adodb-postgres64.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
313
includes/adodb/drivers/adodb-postgres7.inc.php
Normal file
313
includes/adodb/drivers/adodb-postgres7.inc.php
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
Postgres7 support.
|
||||||
|
28 Feb 2001: Currently indicate that we support LIMIT
|
||||||
|
01 Dec 2001: dannym added support for default values
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR."/drivers/adodb-postgres64.inc.php");
|
||||||
|
|
||||||
|
class ADODB_postgres7 extends ADODB_postgres64 {
|
||||||
|
var $databaseType = 'postgres7';
|
||||||
|
var $hasLimit = true; // set to true for pgsql 6.5+ only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
|
||||||
|
var $ansiOuter = true;
|
||||||
|
var $charSet = true; //set to true for Postgres 7 and above - PG client supports encodings
|
||||||
|
|
||||||
|
function ADODB_postgres7()
|
||||||
|
{
|
||||||
|
$this->ADODB_postgres64();
|
||||||
|
if (ADODB_ASSOC_CASE !== 2) {
|
||||||
|
$this->rsPrefix .= 'assoc_';
|
||||||
|
}
|
||||||
|
$this->_bindInputArray = PHP_VERSION >= 5.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// the following should be compat with postgresql 7.2,
|
||||||
|
// which makes obsolete the LIMIT limit,offset syntax
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : '';
|
||||||
|
$limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : '';
|
||||||
|
if ($secs2cache)
|
||||||
|
$rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
function Prepare($sql)
|
||||||
|
{
|
||||||
|
$info = $this->ServerInfo();
|
||||||
|
if ($info['version']>=7.3) {
|
||||||
|
return array($sql,false);
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3.
|
||||||
|
I went ahead and modified it to work for both 8.2 and 8.3.
|
||||||
|
Please feel free to include this change in your next release of adodb.
|
||||||
|
William Kolodny [William.Kolodny#gt-t.net]
|
||||||
|
*/
|
||||||
|
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||||
|
{
|
||||||
|
$sql="
|
||||||
|
SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field,
|
||||||
|
fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field
|
||||||
|
FROM (
|
||||||
|
SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf,
|
||||||
|
split_part(fee.consrc, '('::text, 3) AS rf
|
||||||
|
FROM (
|
||||||
|
SELECT foo.relname AS ltable, foo.ftblname,
|
||||||
|
pg_get_constraintdef(foo.oid) AS consrc
|
||||||
|
FROM (
|
||||||
|
SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname
|
||||||
|
FROM pg_constraint c
|
||||||
|
JOIN pg_class t ON (t.oid = c.conrelid)
|
||||||
|
JOIN pg_class ft ON (ft.oid = c.confrelid)
|
||||||
|
JOIN pg_namespace nft ON (nft.oid = ft.relnamespace)
|
||||||
|
LEFT JOIN pg_description ds ON (ds.objoid = c.oid)
|
||||||
|
JOIN pg_namespace n ON (n.oid = t.relnamespace)
|
||||||
|
WHERE c.contype = 'f'::\"char\"
|
||||||
|
ORDER BY t.relname, n.nspname, c.conname, c.oid
|
||||||
|
) foo
|
||||||
|
) fee) fum
|
||||||
|
WHERE fum.ltable='".strtolower($table)."'
|
||||||
|
ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1)
|
||||||
|
";
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
|
||||||
|
if (!$rs || $rs->EOF) return false;
|
||||||
|
|
||||||
|
$a = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
if ($upper) {
|
||||||
|
$a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(ereg_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')));
|
||||||
|
} else {
|
||||||
|
$a[$rs->Fields('lookup_table')][] = ereg_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'));
|
||||||
|
}
|
||||||
|
adodb_movenext($rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $a;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// from Edward Jaramilla, improved version - works on pg 7.4
|
||||||
|
function _old_MetaForeignKeys($table, $owner=false, $upper=false)
|
||||||
|
{
|
||||||
|
$sql = 'SELECT t.tgargs as args
|
||||||
|
FROM
|
||||||
|
pg_trigger t,pg_class c,pg_proc p
|
||||||
|
WHERE
|
||||||
|
t.tgenabled AND
|
||||||
|
t.tgrelid = c.oid AND
|
||||||
|
t.tgfoid = p.oid AND
|
||||||
|
p.proname = \'RI_FKey_check_ins\' AND
|
||||||
|
c.relname = \''.strtolower($table).'\'
|
||||||
|
ORDER BY
|
||||||
|
t.tgrelid';
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
|
||||||
|
if (!$rs || $rs->EOF) return false;
|
||||||
|
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
$a = array();
|
||||||
|
foreach($arr as $v) {
|
||||||
|
$data = explode(chr(0), $v['args']);
|
||||||
|
$size = count($data)-1; //-1 because the last node is empty
|
||||||
|
for($i = 4; $i < $size; $i++) {
|
||||||
|
if ($upper)
|
||||||
|
$a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]);
|
||||||
|
else
|
||||||
|
$a[$data[2]][] = $data[$i].'='.$data[++$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $a;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
if (! $this->_bindInputArray) {
|
||||||
|
// We don't have native support for parameterized queries, so let's emulate it at the parent
|
||||||
|
return ADODB_postgres64::_query($sql, $inputarr);
|
||||||
|
}
|
||||||
|
$this->_errorMsg = false;
|
||||||
|
// -- added Cristiano da Cunha Duarte
|
||||||
|
if ($inputarr) {
|
||||||
|
$sqlarr = explode('?',trim($sql));
|
||||||
|
$sql = '';
|
||||||
|
$i = 1;
|
||||||
|
$last = sizeof($sqlarr)-1;
|
||||||
|
foreach($sqlarr as $v) {
|
||||||
|
if ($last < $i) $sql .= $v;
|
||||||
|
else $sql .= $v.' $'.$i;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$rez = pg_query_params($this->_connectionID,$sql, $inputarr);
|
||||||
|
} else {
|
||||||
|
$rez = pg_query($this->_connectionID,$sql);
|
||||||
|
}
|
||||||
|
// check if no data returned, then no need to create real recordset
|
||||||
|
if ($rez && pg_numfields($rez) <= 0) {
|
||||||
|
if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') {
|
||||||
|
pg_freeresult($this->_resultid);
|
||||||
|
}
|
||||||
|
$this->_resultid = $rez;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return $rez;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is a set of functions for managing client encoding - very important if the encodings
|
||||||
|
// of your database and your output target (i.e. HTML) don't match
|
||||||
|
//for instance, you may have UNICODE database and server it on-site as WIN1251 etc.
|
||||||
|
// GetCharSet - get the name of the character set the client is using now
|
||||||
|
// the functions should work with Postgres 7.0 and above, the set of charsets supported
|
||||||
|
// depends on compile flags of postgres distribution - if no charsets were compiled into the server
|
||||||
|
// it will return 'SQL_ANSI' always
|
||||||
|
function GetCharSet()
|
||||||
|
{
|
||||||
|
//we will use ADO's builtin property charSet
|
||||||
|
$this->charSet = @pg_client_encoding($this->_connectionID);
|
||||||
|
if (!$this->charSet) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return $this->charSet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetCharSet - switch the client encoding
|
||||||
|
function SetCharSet($charset_name)
|
||||||
|
{
|
||||||
|
$this->GetCharSet();
|
||||||
|
if ($this->charSet !== $charset_name) {
|
||||||
|
$if = pg_set_client_encoding($this->_connectionID, $charset_name);
|
||||||
|
if ($if == "0" & $this->GetCharSet() == $charset_name) {
|
||||||
|
return true;
|
||||||
|
} else return false;
|
||||||
|
} else return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordSet_postgres7 extends ADORecordSet_postgres64{
|
||||||
|
|
||||||
|
var $databaseType = "postgres7";
|
||||||
|
|
||||||
|
|
||||||
|
function ADORecordSet_postgres7($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_postgres64($queryID,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 10% speedup to move MoveNext to child class
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow++;
|
||||||
|
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
|
||||||
|
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||||
|
|
||||||
|
if (is_array($this->fields)) {
|
||||||
|
if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fields = false;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{
|
||||||
|
|
||||||
|
var $databaseType = "postgres7";
|
||||||
|
|
||||||
|
|
||||||
|
function ADORecordSet_assoc_postgres7($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_postgres64($queryID,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch()
|
||||||
|
{
|
||||||
|
if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||||
|
|
||||||
|
if ($this->fields) {
|
||||||
|
if (isset($this->_blobArr)) $this->_fixblobs();
|
||||||
|
$this->_updatefields();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (is_array($this->fields));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create associative array
|
||||||
|
function _updatefields()
|
||||||
|
{
|
||||||
|
if (ADODB_ASSOC_CASE == 2) return; // native
|
||||||
|
|
||||||
|
$arr = array();
|
||||||
|
$lowercase = (ADODB_ASSOC_CASE == 0);
|
||||||
|
|
||||||
|
foreach($this->fields as $k => $v) {
|
||||||
|
if (is_integer($k)) $arr[$k] = $v;
|
||||||
|
else {
|
||||||
|
if ($lowercase)
|
||||||
|
$arr[strtolower($k)] = $v;
|
||||||
|
else
|
||||||
|
$arr[strtoupper($k)] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->fields = $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MoveNext()
|
||||||
|
{
|
||||||
|
if (!$this->EOF) {
|
||||||
|
$this->_currentRow++;
|
||||||
|
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
|
||||||
|
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||||
|
|
||||||
|
if (is_array($this->fields)) {
|
||||||
|
if ($this->fields) {
|
||||||
|
if (isset($this->_blobArr)) $this->_fixblobs();
|
||||||
|
|
||||||
|
$this->_updatefields();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$this->fields = false;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
12
includes/adodb/drivers/adodb-postgres8.inc.php
Normal file
12
includes/adodb/drivers/adodb-postgres8.inc.php
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
NOTE: The "postgres8" driver is remapped to "postgres7".
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
33
includes/adodb/drivers/adodb-proxy.inc.php
Normal file
33
includes/adodb/drivers/adodb-proxy.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
Synonym for csv driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (! defined("_ADODB_PROXY_LAYER")) {
|
||||||
|
define("_ADODB_PROXY_LAYER", 1 );
|
||||||
|
include(ADODB_DIR."/drivers/adodb-csv.inc.php");
|
||||||
|
|
||||||
|
class ADODB_proxy extends ADODB_csv {
|
||||||
|
var $databaseType = 'proxy';
|
||||||
|
var $databaseProvider = 'csv';
|
||||||
|
}
|
||||||
|
class ADORecordset_proxy extends ADORecordset_csv {
|
||||||
|
var $databaseType = "proxy";
|
||||||
|
|
||||||
|
function ADORecordset_proxy($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset($id,$mode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // define
|
||||||
|
|
||||||
|
?>
|
184
includes/adodb/drivers/adodb-sapdb.inc.php
Normal file
184
includes/adodb/drivers/adodb-sapdb.inc.php
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
SAPDB data driver. Requires ODBC.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
if (!defined('ADODB_SAPDB')){
|
||||||
|
define('ADODB_SAPDB',1);
|
||||||
|
|
||||||
|
class ADODB_SAPDB extends ADODB_odbc {
|
||||||
|
var $databaseType = "sapdb";
|
||||||
|
var $concat_operator = '||';
|
||||||
|
var $sysDate = 'DATE';
|
||||||
|
var $sysTimeStamp = 'TIMESTAMP';
|
||||||
|
var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'"; /// used by DBTimeStamp as the default timestamp fmt.
|
||||||
|
var $hasInsertId = true;
|
||||||
|
var $_bindInputArray = true;
|
||||||
|
|
||||||
|
function ADODB_SAPDB()
|
||||||
|
{
|
||||||
|
//if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$info = ADODB_odbc::ServerInfo();
|
||||||
|
if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) {
|
||||||
|
$info['version'] = $matches[1];
|
||||||
|
}
|
||||||
|
return $info;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
$table = $this->Quote(strtoupper($table));
|
||||||
|
|
||||||
|
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos");
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes ($table, $primary = FALSE)
|
||||||
|
{
|
||||||
|
$table = $this->Quote(strtoupper($table));
|
||||||
|
|
||||||
|
$sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ".
|
||||||
|
" WHERE TABLENAME=$table".
|
||||||
|
" ORDER BY INDEXNAME,COLUMNNO";
|
||||||
|
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
$indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE';
|
||||||
|
$indexes[$row[0]]['columns'][] = $row[2];
|
||||||
|
}
|
||||||
|
if ($primary) {
|
||||||
|
$indexes['SYSPRIMARYKEYINDEX'] = array(
|
||||||
|
'unique' => True, // by definition
|
||||||
|
'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumns ($table)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
$table = $this->Quote(strtoupper($table));
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column)
|
||||||
|
{
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $column[0];
|
||||||
|
$fld->type = $column[1];
|
||||||
|
$fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2];
|
||||||
|
$fld->scale = $column[3];
|
||||||
|
$fld->not_null = $column[4] == 'NO';
|
||||||
|
$fld->primary_key = $column[5] == 'KEY';
|
||||||
|
if ($fld->has_default = $column[7]) {
|
||||||
|
if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') {
|
||||||
|
$fld->auto_increment = true;
|
||||||
|
$fld->has_default = false;
|
||||||
|
} else {
|
||||||
|
$fld->default_value = $column[6];
|
||||||
|
switch($fld->type) {
|
||||||
|
case 'VARCHAR':
|
||||||
|
case 'CHARACTER':
|
||||||
|
case 'LONG':
|
||||||
|
$fld->default_value = $column[6];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$fld->default_value = trim($column[6]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$retarr[$fld->name] = $fld;
|
||||||
|
}
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
}
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaColumnNames($table)
|
||||||
|
{
|
||||||
|
$table = $this->Quote(strtoupper($table));
|
||||||
|
|
||||||
|
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos");
|
||||||
|
}
|
||||||
|
|
||||||
|
// unlike it seems, this depends on the db-session and works in a multiuser environment
|
||||||
|
function _insertid($table,$column)
|
||||||
|
{
|
||||||
|
return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SelectLimit implementation problems:
|
||||||
|
|
||||||
|
The following will return random 10 rows as order by performed after "WHERE rowno<10"
|
||||||
|
which is not ideal...
|
||||||
|
|
||||||
|
select * from table where rowno < 10 order by 1
|
||||||
|
|
||||||
|
This means that we have to use the adoconnection base class SelectLimit when
|
||||||
|
there is an "order by".
|
||||||
|
|
||||||
|
See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_sapdb extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = "sapdb";
|
||||||
|
|
||||||
|
function ADORecordSet_sapdb($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //define
|
||||||
|
?>
|
169
includes/adodb/drivers/adodb-sqlanywhere.inc.php
Normal file
169
includes/adodb/drivers/adodb-sqlanywhere.inc.php
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
version V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights
|
||||||
|
reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
21.02.2002 - Wade Johnson wade@wadejohnson.de
|
||||||
|
Extended ODBC class for Sybase SQLAnywhere.
|
||||||
|
1) Added support to retrieve the last row insert ID on tables with
|
||||||
|
primary key column using autoincrement function.
|
||||||
|
|
||||||
|
2) Added blob support. Usage:
|
||||||
|
a) create blob variable on db server:
|
||||||
|
|
||||||
|
$dbconn->create_blobvar($blobVarName);
|
||||||
|
|
||||||
|
b) load blob var from file. $filename must be complete path
|
||||||
|
|
||||||
|
$dbcon->load_blobvar_from_file($blobVarName, $filename);
|
||||||
|
|
||||||
|
c) Use the $blobVarName in SQL insert or update statement in the values
|
||||||
|
clause:
|
||||||
|
|
||||||
|
$recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) '
|
||||||
|
.
|
||||||
|
'VALUES (\'test\', ' . $blobVarName . ')');
|
||||||
|
|
||||||
|
instead of loading blob from a file, you can also load from
|
||||||
|
an unformatted (raw) blob variable:
|
||||||
|
$dbcon->load_blobvar_from_var($blobVarName, $varName);
|
||||||
|
|
||||||
|
d) drop blob variable on db server to free up resources:
|
||||||
|
$dbconn->drop_blobvar($blobVarName);
|
||||||
|
|
||||||
|
Sybase_SQLAnywhere data driver. Requires ODBC.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!defined('ADODB_SYBASE_SQLANYWHERE')){
|
||||||
|
|
||||||
|
define('ADODB_SYBASE_SQLANYWHERE',1);
|
||||||
|
|
||||||
|
class ADODB_sqlanywhere extends ADODB_odbc {
|
||||||
|
var $databaseType = "sqlanywhere";
|
||||||
|
var $hasInsertID = true;
|
||||||
|
|
||||||
|
function ADODB_sqlanywhere()
|
||||||
|
{
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid() {
|
||||||
|
return $this->GetOne('select @@identity');
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_blobvar($blobVarName) {
|
||||||
|
$this->Execute("create variable $blobVarName long binary");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function drop_blobvar($blobVarName) {
|
||||||
|
$this->Execute("drop variable $blobVarName");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_blobvar_from_file($blobVarName, $filename) {
|
||||||
|
$chunk_size = 1000;
|
||||||
|
|
||||||
|
$fd = fopen ($filename, "rb");
|
||||||
|
|
||||||
|
$integer_chunks = (integer)filesize($filename) / $chunk_size;
|
||||||
|
$modulus = filesize($filename) % $chunk_size;
|
||||||
|
if ($modulus != 0){
|
||||||
|
$integer_chunks += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for($loop=1;$loop<=$integer_chunks;$loop++){
|
||||||
|
$contents = fread ($fd, $chunk_size);
|
||||||
|
$contents = bin2hex($contents);
|
||||||
|
|
||||||
|
$hexstring = '';
|
||||||
|
|
||||||
|
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
|
||||||
|
$hexstring .= '\x' . substr($contents,$loop2,2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$hexstring = $this->qstr($hexstring);
|
||||||
|
|
||||||
|
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose ($fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_blobvar_from_var($blobVarName, &$varName) {
|
||||||
|
$chunk_size = 1000;
|
||||||
|
|
||||||
|
$integer_chunks = (integer)strlen($varName) / $chunk_size;
|
||||||
|
$modulus = strlen($varName) % $chunk_size;
|
||||||
|
if ($modulus != 0){
|
||||||
|
$integer_chunks += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for($loop=1;$loop<=$integer_chunks;$loop++){
|
||||||
|
$contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size);
|
||||||
|
$contents = bin2hex($contents);
|
||||||
|
|
||||||
|
$hexstring = '';
|
||||||
|
|
||||||
|
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
|
||||||
|
$hexstring .= '\x' . substr($contents,$loop2,2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$hexstring = $this->qstr($hexstring);
|
||||||
|
|
||||||
|
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Insert a null into the blob field of the table first.
|
||||||
|
Then use UpdateBlob to store the blob.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||||
|
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||||
|
*/
|
||||||
|
function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB')
|
||||||
|
{
|
||||||
|
$blobVarName = 'hold_blob';
|
||||||
|
$this->create_blobvar($blobVarName);
|
||||||
|
$this->load_blobvar_from_var($blobVarName, $val);
|
||||||
|
$this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where");
|
||||||
|
$this->drop_blobvar($blobVarName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}; //class
|
||||||
|
|
||||||
|
class ADORecordSet_sqlanywhere extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = "sqlanywhere";
|
||||||
|
|
||||||
|
function ADORecordSet_sqlanywhere($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}; //class
|
||||||
|
|
||||||
|
|
||||||
|
} //define
|
||||||
|
?>
|
398
includes/adodb/drivers/adodb-sqlite.inc.php
Normal file
398
includes/adodb/drivers/adodb-sqlite.inc.php
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
SQLite info: http://www.hwaci.com/sw/sqlite/
|
||||||
|
|
||||||
|
Install Instructions:
|
||||||
|
====================
|
||||||
|
1. Place this in adodb/drivers
|
||||||
|
2. Rename the file, remove the .txt prefix.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB_sqlite extends ADOConnection {
|
||||||
|
var $databaseType = "sqlite";
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $concat_operator='||';
|
||||||
|
var $_errorNo = 0;
|
||||||
|
var $hasLimit = true;
|
||||||
|
var $hasInsertID = true; /// supports autoincrement ID?
|
||||||
|
var $hasAffectedRows = true; /// supports affected rows for update/delete?
|
||||||
|
var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
|
||||||
|
var $sysDate = "adodb_date('Y-m-d')";
|
||||||
|
var $sysTimeStamp = "adodb_date('Y-m-d H:i:s')";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
|
||||||
|
function ADODB_sqlite()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
function __get($name)
|
||||||
|
{
|
||||||
|
switch($name) {
|
||||||
|
case 'sysDate': return "'".date($this->fmtDate)."'";
|
||||||
|
case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'";
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
function ServerInfo()
|
||||||
|
{
|
||||||
|
$arr['version'] = sqlite_libversion();
|
||||||
|
$arr['description'] = 'SQLite ';
|
||||||
|
$arr['encoding'] = sqlite_libencoding();
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$ret = $this->Execute("BEGIN TRANSACTION");
|
||||||
|
$this->transCnt += 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
$ret = $this->Execute("COMMIT");
|
||||||
|
if ($this->transCnt>0)$this->transCnt -= 1;
|
||||||
|
return !empty($ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$ret = $this->Execute("ROLLBACK");
|
||||||
|
if ($this->transCnt>0)$this->transCnt -= 1;
|
||||||
|
return !empty($ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark newnham
|
||||||
|
function MetaColumns($tab)
|
||||||
|
{
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$false = false;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||||
|
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||||
|
$rs = $this->Execute("PRAGMA table_info('$tab')");
|
||||||
|
if (isset($savem)) $this->SetFetchMode($savem);
|
||||||
|
if (!$rs) {
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$arr = array();
|
||||||
|
while ($r = $rs->FetchRow()) {
|
||||||
|
$type = explode('(',$r['type']);
|
||||||
|
$size = '';
|
||||||
|
if (sizeof($type)==2)
|
||||||
|
$size = trim($type[1],')');
|
||||||
|
$fn = strtoupper($r['name']);
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$fld->name = $r['name'];
|
||||||
|
$fld->type = $type[0];
|
||||||
|
$fld->max_length = $size;
|
||||||
|
$fld->not_null = $r['notnull'];
|
||||||
|
$fld->default_value = $r['dflt_value'];
|
||||||
|
$fld->scale = 0;
|
||||||
|
if ($save == ADODB_FETCH_NUM) $arr[] = $fld;
|
||||||
|
else $arr[strtoupper($fld->name)] = $fld;
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _init($parentDriver)
|
||||||
|
{
|
||||||
|
|
||||||
|
$parentDriver->hasTransactions = false;
|
||||||
|
$parentDriver->hasInsertID = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return sqlite_last_insert_rowid($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return sqlite_changes($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_logsql) return $this->_errorMsg;
|
||||||
|
return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorNo()
|
||||||
|
{
|
||||||
|
return $this->_errorNo;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
$fmt = $this->qstr($fmt);
|
||||||
|
return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function _createFunctions()
|
||||||
|
{
|
||||||
|
@sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1);
|
||||||
|
@sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('sqlite_open')) return null;
|
||||||
|
if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;
|
||||||
|
|
||||||
|
$this->_connectionID = sqlite_open($argHostname);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
$this->_createFunctions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('sqlite_open')) return null;
|
||||||
|
if (empty($argHostname) && $argDatabasename) $argHostname = $argDatabasename;
|
||||||
|
|
||||||
|
$this->_connectionID = sqlite_popen($argHostname);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
$this->_createFunctions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
function _query($sql,$inputarr=false)
|
||||||
|
{
|
||||||
|
$rez = sqlite_query($sql,$this->_connectionID);
|
||||||
|
if (!$rez) {
|
||||||
|
$this->_errorNo = sqlite_last_error($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rez;
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
|
||||||
|
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : '');
|
||||||
|
if ($secs2cache)
|
||||||
|
$rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
else
|
||||||
|
$rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This algorithm is not very efficient, but works even if table locking
|
||||||
|
is not available.
|
||||||
|
|
||||||
|
Will return false if unable to generate an ID after $MAXLOOPS attempts.
|
||||||
|
*/
|
||||||
|
var $_genSeqSQL = "create table %s (id integer)";
|
||||||
|
|
||||||
|
function GenID($seq='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
// if you have to modify the parameter below, your database is overloaded,
|
||||||
|
// or you need to implement generation of id's yourself!
|
||||||
|
$MAXLOOPS = 100;
|
||||||
|
//$this->debug=1;
|
||||||
|
while (--$MAXLOOPS>=0) {
|
||||||
|
@($num = $this->GetOne("select id from $seq"));
|
||||||
|
if ($num === false) {
|
||||||
|
$this->Execute(sprintf($this->_genSeqSQL ,$seq));
|
||||||
|
$start -= 1;
|
||||||
|
$num = '0';
|
||||||
|
$ok = $this->Execute("insert into $seq values($start)");
|
||||||
|
if (!$ok) return false;
|
||||||
|
}
|
||||||
|
$this->Execute("update $seq set id=id+1 where id=$num");
|
||||||
|
|
||||||
|
if ($this->affected_rows() > 0) {
|
||||||
|
$num += 1;
|
||||||
|
$this->genID = $num;
|
||||||
|
return $num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($fn = $this->raiseErrorFn) {
|
||||||
|
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CreateSequence($seqname='adodbseq',$start=1)
|
||||||
|
{
|
||||||
|
if (empty($this->_genSeqSQL)) return false;
|
||||||
|
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||||
|
if (!$ok) return false;
|
||||||
|
$start -= 1;
|
||||||
|
return $this->Execute("insert into $seqname values($start)");
|
||||||
|
}
|
||||||
|
|
||||||
|
var $_dropSeqSQL = 'drop table %s';
|
||||||
|
function DropSequence($seqname)
|
||||||
|
{
|
||||||
|
if (empty($this->_dropSeqSQL)) return false;
|
||||||
|
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @sqlite_close($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaIndexes($table, $primary = FALSE, $owner=false)
|
||||||
|
{
|
||||||
|
$false = false;
|
||||||
|
// save old fetch mode
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$save = $ADODB_FETCH_MODE;
|
||||||
|
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||||
|
if ($this->fetchMode !== FALSE) {
|
||||||
|
$savem = $this->SetFetchMode(FALSE);
|
||||||
|
}
|
||||||
|
$SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table));
|
||||||
|
$rs = $this->Execute($SQL);
|
||||||
|
if (!is_object($rs)) {
|
||||||
|
if (isset($savem))
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$indexes = array ();
|
||||||
|
while ($row = $rs->FetchRow()) {
|
||||||
|
if ($primary && preg_match("/primary/i",$row[1]) == 0) continue;
|
||||||
|
if (!isset($indexes[$row[0]])) {
|
||||||
|
|
||||||
|
$indexes[$row[0]] = array(
|
||||||
|
'unique' => preg_match("/unique/i",$row[1]),
|
||||||
|
'columns' => array());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* There must be a more elegant way of doing this,
|
||||||
|
* the index elements appear in the SQL statement
|
||||||
|
* in cols[1] between parentheses
|
||||||
|
* e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse)
|
||||||
|
*/
|
||||||
|
$cols = explode("(",$row[1]);
|
||||||
|
$cols = explode(")",$cols[1]);
|
||||||
|
array_pop($cols);
|
||||||
|
$indexes[$row[0]]['columns'] = $cols;
|
||||||
|
}
|
||||||
|
if (isset($savem)) {
|
||||||
|
$this->SetFetchMode($savem);
|
||||||
|
$ADODB_FETCH_MODE = $save;
|
||||||
|
}
|
||||||
|
return $indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_sqlite extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = "sqlite";
|
||||||
|
var $bind = false;
|
||||||
|
|
||||||
|
function ADORecordset_sqlite($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
switch($mode) {
|
||||||
|
case ADODB_FETCH_NUM: $this->fetchMode = SQLITE_NUM; break;
|
||||||
|
case ADODB_FETCH_ASSOC: $this->fetchMode = SQLITE_ASSOC; break;
|
||||||
|
default: $this->fetchMode = SQLITE_BOTH; break;
|
||||||
|
}
|
||||||
|
$this->adodbFetchMode = $mode;
|
||||||
|
|
||||||
|
$this->_queryID = $queryID;
|
||||||
|
|
||||||
|
$this->_inited = true;
|
||||||
|
$this->fields = array();
|
||||||
|
if ($queryID) {
|
||||||
|
$this->_currentRow = 0;
|
||||||
|
$this->EOF = !$this->_fetch();
|
||||||
|
@$this->_initrs();
|
||||||
|
} else {
|
||||||
|
$this->_numOfRows = 0;
|
||||||
|
$this->_numOfFields = 0;
|
||||||
|
$this->EOF = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->_queryID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
$fld = new ADOFieldObject;
|
||||||
|
$fld->name = sqlite_field_name($this->_queryID, $fieldOffset);
|
||||||
|
$fld->type = 'VARCHAR';
|
||||||
|
$fld->max_length = -1;
|
||||||
|
return $fld;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
$this->_numOfRows = @sqlite_num_rows($this->_queryID);
|
||||||
|
$this->_numOfFields = @sqlite_num_fields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Fields($colname)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode != SQLITE_NUM) return $this->fields[$colname];
|
||||||
|
if (!$this->bind) {
|
||||||
|
$this->bind = array();
|
||||||
|
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||||
|
$o = $this->FetchField($i);
|
||||||
|
$this->bind[strtoupper($o->name)] = $i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return sqlite_seek($this->_queryID, $row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
$this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
|
||||||
|
return !empty($this->fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
62
includes/adodb/drivers/adodb-sqlitepo.inc.php
Normal file
62
includes/adodb/drivers/adodb-sqlitepo.inc.php
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Portable version of sqlite driver, to make it more similar to other database drivers.
|
||||||
|
The main differences are
|
||||||
|
|
||||||
|
1. When selecting (joining) multiple tables, in assoc mode the table
|
||||||
|
names are included in the assoc keys in the "sqlite" driver.
|
||||||
|
|
||||||
|
In "sqlitepo" driver, the table names are stripped from the returned column names.
|
||||||
|
When this results in a conflict, the first field get preference.
|
||||||
|
|
||||||
|
Contributed by Herman Kuiper herman#ozuzo.net
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
include_once(ADODB_DIR.'/drivers/adodb-sqlite.inc.php');
|
||||||
|
|
||||||
|
class ADODB_sqlitepo extends ADODB_sqlite {
|
||||||
|
var $databaseType = 'sqlitepo';
|
||||||
|
|
||||||
|
function ADODB_sqlitepo()
|
||||||
|
{
|
||||||
|
$this->ADODB_sqlite();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class ADORecordset_sqlitepo extends ADORecordset_sqlite {
|
||||||
|
|
||||||
|
var $databaseType = 'sqlitepo';
|
||||||
|
|
||||||
|
function ADORecordset_sqlitepo($queryID,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordset_sqlite($queryID,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modified to strip table names from returned fields
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
$this->fields = array();
|
||||||
|
$fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
|
||||||
|
if(is_array($fields))
|
||||||
|
foreach($fields as $n => $v)
|
||||||
|
{
|
||||||
|
if(($p = strpos($n, ".")) !== false)
|
||||||
|
$n = substr($n, $p+1);
|
||||||
|
$this->fields[$n] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !empty($this->fields);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
418
includes/adodb/drivers/adodb-sybase.inc.php
Normal file
418
includes/adodb/drivers/adodb-sybase.inc.php
Normal file
@ -0,0 +1,418 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim. All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
|
||||||
|
|
||||||
|
- MSSQL date patch applied.
|
||||||
|
|
||||||
|
Date patch by Toni 15 Feb 2002
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
class ADODB_sybase extends ADOConnection {
|
||||||
|
var $databaseType = "sybase";
|
||||||
|
var $dataProvider = 'sybase';
|
||||||
|
var $replaceQuote = "''"; // string to use to replace quotes
|
||||||
|
var $fmtDate = "'Y-m-d'";
|
||||||
|
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||||
|
var $hasInsertID = true;
|
||||||
|
var $hasAffectedRows = true;
|
||||||
|
var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
|
||||||
|
// see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
|
||||||
|
var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'";
|
||||||
|
/*
|
||||||
|
"select c.name,t.name,c.length from
|
||||||
|
syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id
|
||||||
|
where o.name='%s'";
|
||||||
|
*/
|
||||||
|
var $concat_operator = '+';
|
||||||
|
var $arrayClass = 'ADORecordSet_array_sybase';
|
||||||
|
var $sysDate = 'GetDate()';
|
||||||
|
var $leftOuter = '*=';
|
||||||
|
var $rightOuter = '=*';
|
||||||
|
|
||||||
|
function ADODB_sybase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// might require begintrans -- committrans
|
||||||
|
function _insertid()
|
||||||
|
{
|
||||||
|
return $this->GetOne('select @@identity');
|
||||||
|
}
|
||||||
|
// might require begintrans -- committrans
|
||||||
|
function _affectedrows()
|
||||||
|
{
|
||||||
|
return $this->GetOne('select @@rowcount');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function BeginTrans()
|
||||||
|
{
|
||||||
|
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt += 1;
|
||||||
|
|
||||||
|
$this->Execute('BEGIN TRAN');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function CommitTrans($ok=true)
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
|
||||||
|
if (!$ok) return $this->RollbackTrans();
|
||||||
|
|
||||||
|
$this->transCnt -= 1;
|
||||||
|
$this->Execute('COMMIT TRAN');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function RollbackTrans()
|
||||||
|
{
|
||||||
|
if ($this->transOff) return true;
|
||||||
|
$this->transCnt -= 1;
|
||||||
|
$this->Execute('ROLLBACK TRAN');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
|
||||||
|
function RowLock($tables,$where,$flds='top 1 null as ignore')
|
||||||
|
{
|
||||||
|
if (!$this->_hastrans) $this->BeginTrans();
|
||||||
|
$tables = str_replace(',',' HOLDLOCK,',$tables);
|
||||||
|
return $this->GetOne("select $flds from $tables HOLDLOCK where $where");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function SelectDB($dbName)
|
||||||
|
{
|
||||||
|
$this->database = $dbName;
|
||||||
|
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||||
|
if ($this->_connectionID) {
|
||||||
|
return @sybase_select_db($dbName);
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: the last error message from previous database operation
|
||||||
|
Note: This function is NOT available for Microsoft SQL Server. */
|
||||||
|
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if ($this->_logsql) return $this->_errorMsg;
|
||||||
|
if (function_exists('sybase_get_last_message'))
|
||||||
|
$this->_errorMsg = sybase_get_last_message();
|
||||||
|
else
|
||||||
|
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
|
||||||
|
return $this->_errorMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('sybase_connect')) return null;
|
||||||
|
|
||||||
|
$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// returns true or false
|
||||||
|
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||||
|
{
|
||||||
|
if (!function_exists('sybase_connect')) return null;
|
||||||
|
|
||||||
|
$this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
|
||||||
|
if ($this->_connectionID === false) return false;
|
||||||
|
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns query ID if successful, otherwise false
|
||||||
|
function _query($sql,$inputarr)
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
|
||||||
|
if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
|
||||||
|
return sybase_unbuffered_query($sql,$this->_connectionID);
|
||||||
|
else
|
||||||
|
return sybase_query($sql,$this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
|
||||||
|
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
$nrows = (integer) $nrows;
|
||||||
|
$offset = (integer) $offset;
|
||||||
|
|
||||||
|
$cnt = ($nrows >= 0) ? $nrows : 999999999;
|
||||||
|
if ($offset > 0 && $cnt) $cnt += $offset;
|
||||||
|
|
||||||
|
$this->Execute("set rowcount $cnt");
|
||||||
|
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
|
||||||
|
$this->Execute("set rowcount 0");
|
||||||
|
|
||||||
|
return $rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns true or false
|
||||||
|
function _close()
|
||||||
|
{
|
||||||
|
return @sybase_close($this->_connectionID);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function UnixDate($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_sybase::UnixDate($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_sybase::UnixTimeStamp($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Added 2003-10-05 by Chris Phillipson
|
||||||
|
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25
|
||||||
|
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
|
||||||
|
// Format date column in sql string given an input format that understands Y M D
|
||||||
|
function SQLDate($fmt, $col=false)
|
||||||
|
{
|
||||||
|
if (!$col) $col = $this->sysTimeStamp;
|
||||||
|
$s = '';
|
||||||
|
|
||||||
|
$len = strlen($fmt);
|
||||||
|
for ($i=0; $i < $len; $i++) {
|
||||||
|
if ($s) $s .= '+';
|
||||||
|
$ch = $fmt[$i];
|
||||||
|
switch($ch) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
$s .= "datename(yy,$col)";
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
$s .= "convert(char(3),$col,0)";
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
$s .= "str_replace(str(month($col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
case 'q':
|
||||||
|
$s .= "datename(qq,$col)";
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'd':
|
||||||
|
$s .= "str_replace(str(datepart(dd,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
$s .= "str_replace(str(datepart(hh,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
$s .= "str_replace(str(datepart(mi,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
$s .= "str_replace(str(datepart(ss,$col),2),' ','0')";
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
case 'A':
|
||||||
|
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if ($ch == '\\') {
|
||||||
|
$i++;
|
||||||
|
$ch = substr($fmt,$i,1);
|
||||||
|
}
|
||||||
|
$s .= $this->qstr($ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Added 2003-10-07 by Chris Phillipson
|
||||||
|
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
|
||||||
|
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
|
||||||
|
function MetaPrimaryKeys($table)
|
||||||
|
{
|
||||||
|
$sql = "SELECT c.column_name " .
|
||||||
|
"FROM syscolumn c, systable t " .
|
||||||
|
"WHERE t.table_name='$table' AND c.table_id=t.table_id " .
|
||||||
|
"AND t.table_type='BASE' " .
|
||||||
|
"AND c.pkey = 'Y' " .
|
||||||
|
"ORDER BY c.column_id";
|
||||||
|
|
||||||
|
$a = $this->GetCol($sql);
|
||||||
|
if ($a && sizeof($a)>0) return $a;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------------
|
||||||
|
Class Name: Recordset
|
||||||
|
--------------------------------------------------------------------------------------*/
|
||||||
|
global $ADODB_sybase_mths;
|
||||||
|
$ADODB_sybase_mths = array(
|
||||||
|
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
|
||||||
|
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||||
|
|
||||||
|
class ADORecordset_sybase extends ADORecordSet {
|
||||||
|
|
||||||
|
var $databaseType = "sybase";
|
||||||
|
var $canSeek = true;
|
||||||
|
// _mths works only in non-localised system
|
||||||
|
var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||||
|
|
||||||
|
function ADORecordset_sybase($id,$mode=false)
|
||||||
|
{
|
||||||
|
if ($mode === false) {
|
||||||
|
global $ADODB_FETCH_MODE;
|
||||||
|
$mode = $ADODB_FETCH_MODE;
|
||||||
|
}
|
||||||
|
if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
|
||||||
|
else $this->fetchMode = $mode;
|
||||||
|
$this->ADORecordSet($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns: an object containing field information.
|
||||||
|
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||||
|
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||||
|
fetchField() is retrieved. */
|
||||||
|
function FetchField($fieldOffset = -1)
|
||||||
|
{
|
||||||
|
if ($fieldOffset != -1) {
|
||||||
|
$o = @sybase_fetch_field($this->_queryID, $fieldOffset);
|
||||||
|
}
|
||||||
|
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||||
|
$o = @sybase_fetch_field($this->_queryID);
|
||||||
|
}
|
||||||
|
// older versions of PHP did not support type, only numeric
|
||||||
|
if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
|
||||||
|
return $o;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _initrs()
|
||||||
|
{
|
||||||
|
global $ADODB_COUNTRECS;
|
||||||
|
$this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
|
||||||
|
$this->_numOfFields = @sybase_num_fields($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _seek($row)
|
||||||
|
{
|
||||||
|
return @sybase_data_seek($this->_queryID, $row);
|
||||||
|
}
|
||||||
|
|
||||||
|
function _fetch($ignore_fields=false)
|
||||||
|
{
|
||||||
|
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||||
|
$this->fields = @sybase_fetch_row($this->_queryID);
|
||||||
|
} else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
|
||||||
|
$this->fields = @sybase_fetch_row($this->_queryID);
|
||||||
|
if (is_array($this->fields)) {
|
||||||
|
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
$this->fields = @sybase_fetch_array($this->_queryID);
|
||||||
|
}
|
||||||
|
if ( is_array($this->fields)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||||
|
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||||
|
function _close() {
|
||||||
|
return @sybase_free_result($this->_queryID);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
|
||||||
|
static function UnixDate($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_sybase::UnixDate($v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
return ADORecordSet_array_sybase::UnixTimeStamp($v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ADORecordSet_array_sybase extends ADORecordSet_array {
|
||||||
|
function ADORecordSet_array_sybase($id=-1)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_array($id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
|
||||||
|
static function UnixDate($v)
|
||||||
|
{
|
||||||
|
global $ADODB_sybase_mths;
|
||||||
|
|
||||||
|
//Dec 30 2000 12:00AM
|
||||||
|
if (!ereg( "([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})"
|
||||||
|
,$v, $rr)) return parent::UnixDate($v);
|
||||||
|
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$themth = substr(strtoupper($rr[1]),0,3);
|
||||||
|
$themth = $ADODB_sybase_mths[$themth];
|
||||||
|
if ($themth <= 0) return false;
|
||||||
|
// h-m-s-MM-DD-YY
|
||||||
|
return mktime(0,0,0,$themth,$rr[2],$rr[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static function UnixTimeStamp($v)
|
||||||
|
{
|
||||||
|
global $ADODB_sybase_mths;
|
||||||
|
//11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
|
||||||
|
//Changed [0-9] to [0-9 ] in day conversion
|
||||||
|
if (!ereg( "([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})"
|
||||||
|
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||||
|
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||||
|
|
||||||
|
$themth = substr(strtoupper($rr[1]),0,3);
|
||||||
|
$themth = $ADODB_sybase_mths[$themth];
|
||||||
|
if ($themth <= 0) return false;
|
||||||
|
|
||||||
|
switch (strtoupper($rr[6])) {
|
||||||
|
case 'P':
|
||||||
|
if ($rr[4]<12) $rr[4] += 12;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if ($rr[4]==12) $rr[4] = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// h-m-s-MM-DD-YY
|
||||||
|
return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
119
includes/adodb/drivers/adodb-sybase_ase.inc.php
Normal file
119
includes/adodb/drivers/adodb-sybase_ase.inc.php
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
|
||||||
|
Set tabs to 4.
|
||||||
|
|
||||||
|
Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
require_once ADODB_DIR."/drivers/adodb-sybase.inc.php";
|
||||||
|
|
||||||
|
class ADODB_sybase_ase extends ADODB_sybase {
|
||||||
|
var $databaseType = "sybase_ase";
|
||||||
|
|
||||||
|
var $metaTablesSQL="SELECT sysobjects.name FROM sysobjects, sysusers WHERE sysobjects.type='U' AND sysobjects.uid = sysusers.uid";
|
||||||
|
var $metaColumnsSQL = "SELECT syscolumns.name AS field_name, systypes.name AS type, systypes.length AS width FROM sysobjects, syscolumns, systypes WHERE sysobjects.name='%s' AND syscolumns.id = sysobjects.id AND systypes.type=syscolumns.type";
|
||||||
|
var $metaDatabasesSQL ="SELECT a.name FROM master.dbo.sysdatabases a, master.dbo.syslogins b WHERE a.suid = b.suid and a.name like '%' and a.name != 'tempdb' and a.status3 != 256 order by 1";
|
||||||
|
|
||||||
|
function ADODB_sybase_ase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// split the Views, Tables and procedures.
|
||||||
|
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||||
|
{
|
||||||
|
$false = false;
|
||||||
|
if ($this->metaTablesSQL) {
|
||||||
|
// complicated state saving by the need for backward compat
|
||||||
|
|
||||||
|
if ($ttype == 'VIEWS'){
|
||||||
|
$sql = str_replace('U', 'V', $this->metaTablesSQL);
|
||||||
|
}elseif (false === $ttype){
|
||||||
|
$sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL);
|
||||||
|
}else{ // TABLES OR ANY OTHER
|
||||||
|
$sql = $this->metaTablesSQL;
|
||||||
|
}
|
||||||
|
$rs = $this->Execute($sql);
|
||||||
|
|
||||||
|
if ($rs === false || !method_exists($rs, 'GetArray')){
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
$arr = $rs->GetArray();
|
||||||
|
|
||||||
|
$arr2 = array();
|
||||||
|
foreach($arr as $key=>$value){
|
||||||
|
$arr2[] = trim($value['name']);
|
||||||
|
}
|
||||||
|
return $arr2;
|
||||||
|
}
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaDatabases()
|
||||||
|
{
|
||||||
|
$arr = array();
|
||||||
|
if ($this->metaDatabasesSQL!='') {
|
||||||
|
$rs = $this->Execute($this->metaDatabasesSQL);
|
||||||
|
if ($rs && !$rs->EOF){
|
||||||
|
while (!$rs->EOF){
|
||||||
|
$arr[] = $rs->Fields('name');
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fix a bug which prevent the metaColumns query to be executed for Sybase ASE
|
||||||
|
function MetaColumns($table,$upper=false)
|
||||||
|
{
|
||||||
|
$false = false;
|
||||||
|
if (!empty($this->metaColumnsSQL)) {
|
||||||
|
|
||||||
|
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||||
|
if ($rs === false) return $false;
|
||||||
|
|
||||||
|
$retarr = array();
|
||||||
|
while (!$rs->EOF) {
|
||||||
|
$fld = new ADOFieldObject();
|
||||||
|
$fld->name = $rs->Fields('field_name');
|
||||||
|
$fld->type = $rs->Fields('type');
|
||||||
|
$fld->max_length = $rs->Fields('width');
|
||||||
|
$retarr[strtoupper($fld->name)] = $fld;
|
||||||
|
$rs->MoveNext();
|
||||||
|
}
|
||||||
|
$rs->Close();
|
||||||
|
return $retarr;
|
||||||
|
}
|
||||||
|
return $false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getProcedureList($schema)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ErrorMsg()
|
||||||
|
{
|
||||||
|
if (!function_exists('sybase_connect')){
|
||||||
|
return 'Your PHP doesn\'t contain the Sybase connection module!';
|
||||||
|
}
|
||||||
|
return parent::ErrorMsg();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class adorecordset_sybase_ase extends ADORecordset_sybase {
|
||||||
|
var $databaseType = "sybase_ase";
|
||||||
|
function ADORecordset_sybase_ase($id,$mode=false)
|
||||||
|
{
|
||||||
|
$this->ADORecordSet_sybase($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
107
includes/adodb/drivers/adodb-vfp.inc.php
Normal file
107
includes/adodb/drivers/adodb-vfp.inc.php
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
V5.06 16 Oct 2008 (c) 2000-2008 John Lim (jlim#natsoft.com). All rights reserved.
|
||||||
|
Released under both BSD license and Lesser GPL library license.
|
||||||
|
Whenever there is any discrepancy between the two licenses,
|
||||||
|
the BSD license will take precedence.
|
||||||
|
Set tabs to 4 for best viewing.
|
||||||
|
|
||||||
|
Latest version is available at http://adodb.sourceforge.net
|
||||||
|
|
||||||
|
Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// security - hide paths
|
||||||
|
if (!defined('ADODB_DIR')) die();
|
||||||
|
|
||||||
|
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||||
|
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||||
|
}
|
||||||
|
if (!defined('ADODB_VFP')){
|
||||||
|
define('ADODB_VFP',1);
|
||||||
|
class ADODB_vfp extends ADODB_odbc {
|
||||||
|
var $databaseType = "vfp";
|
||||||
|
var $fmtDate = "{^Y-m-d}";
|
||||||
|
var $fmtTimeStamp = "{^Y-m-d, h:i:sA}";
|
||||||
|
var $replaceQuote = "'+chr(39)+'" ;
|
||||||
|
var $true = '.T.';
|
||||||
|
var $false = '.F.';
|
||||||
|
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||||
|
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
|
||||||
|
var $sysTimeStamp = 'datetime()';
|
||||||
|
var $sysDate = 'date()';
|
||||||
|
var $ansiOuter = true;
|
||||||
|
var $hasTransactions = false;
|
||||||
|
var $curmode = false ; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
|
||||||
|
|
||||||
|
function ADODB_vfp()
|
||||||
|
{
|
||||||
|
$this->ADODB_odbc();
|
||||||
|
}
|
||||||
|
|
||||||
|
function Time()
|
||||||
|
{
|
||||||
|
return time();
|
||||||
|
}
|
||||||
|
|
||||||
|
function BeginTrans() { return false;}
|
||||||
|
|
||||||
|
// quote string to be sent back to database
|
||||||
|
function qstr($s,$nofixquotes=false)
|
||||||
|
{
|
||||||
|
if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'";
|
||||||
|
return "'".$s."'";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TOP requires ORDER BY for VFP
|
||||||
|
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||||
|
{
|
||||||
|
$this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false;
|
||||||
|
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADORecordSet_vfp extends ADORecordSet_odbc {
|
||||||
|
|
||||||
|
var $databaseType = "vfp";
|
||||||
|
|
||||||
|
|
||||||
|
function ADORecordSet_vfp($id,$mode=false)
|
||||||
|
{
|
||||||
|
return $this->ADORecordSet_odbc($id,$mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function MetaType($t,$len=-1)
|
||||||
|
{
|
||||||
|
if (is_object($t)) {
|
||||||
|
$fieldobj = $t;
|
||||||
|
$t = $fieldobj->type;
|
||||||
|
$len = $fieldobj->max_length;
|
||||||
|
}
|
||||||
|
switch (strtoupper($t)) {
|
||||||
|
case 'C':
|
||||||
|
if ($len <= $this->blobSize) return 'C';
|
||||||
|
case 'M':
|
||||||
|
return 'X';
|
||||||
|
|
||||||
|
case 'D': return 'D';
|
||||||
|
|
||||||
|
case 'T': return 'T';
|
||||||
|
|
||||||
|
case 'L': return 'L';
|
||||||
|
|
||||||
|
case 'I': return 'I';
|
||||||
|
|
||||||
|
default: return 'N';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} //define
|
||||||
|
?>
|
33
includes/adodb/lang/adodb-ar.inc.php
Normal file
33
includes/adodb/lang/adodb-ar.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
// by "El-Shamaa, Khaled" <k.el-shamaa#cgiar.org>
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'ar',
|
||||||
|
DB_ERROR => 'خطأ غير محدد',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'موجود مسبقا',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'لا يمكن إنشاء',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'لا يمكن حذف',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'لا يمكن حذف',
|
||||||
|
DB_ERROR_CONSTRAINT => 'عملية إدخال ممنوعة',
|
||||||
|
DB_ERROR_DIVZERO => 'عملية التقسيم على صفر',
|
||||||
|
DB_ERROR_INVALID => 'غير صحيح',
|
||||||
|
DB_ERROR_INVALID_DATE => 'صيغة وقت أو تاريخ غير صحيحة',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'صيغة رقم غير صحيحة',
|
||||||
|
DB_ERROR_MISMATCH => 'غير متطابق',
|
||||||
|
DB_ERROR_NODBSELECTED => 'لم يتم إختيار قاعدة البيانات بعد',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'ليس هنالك حقل بهذا الاسم',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'ليس هنالك جدول بهذا الاسم',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'قاعدة البيانات المرتبط بها غير قادرة',
|
||||||
|
DB_ERROR_NOT_FOUND => 'لم يتم إيجاده',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'غير مقفول',
|
||||||
|
DB_ERROR_SYNTAX => 'خطأ في الصيغة',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'غير مدعوم',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'عدد القيم في السجل',
|
||||||
|
DB_ERROR_INVALID_DSN => 'DSN غير صحيح',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'فشل عملية الإتصال',
|
||||||
|
0 => 'ليس هنالك أخطاء', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'البيانات المزودة غير كافية',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'لم يتم إيجاد الإضافة المتعلقة',
|
||||||
|
DB_ERROR_NOSUCHDB => 'ليس هنالك قاعدة بيانات بهذا الاسم',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'سماحيات غير كافية'
|
||||||
|
);
|
||||||
|
?>
|
37
includes/adodb/lang/adodb-bg.inc.php
Normal file
37
includes/adodb/lang/adodb-bg.inc.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Bulgarian language, v1.0, 25.03.2004, encoding by Windows-1251 charset
|
||||||
|
contributed by Valentin Sheiretsky <valio#valio.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'bg',
|
||||||
|
DB_ERROR => 'неизвестна грешка',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'вече съществува',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'не може да бъде създадена',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена',
|
||||||
|
DB_ERROR_CONSTRAINT => 'нарушено условие',
|
||||||
|
DB_ERROR_DIVZERO => 'деление на нула',
|
||||||
|
DB_ERROR_INVALID => 'неправилно',
|
||||||
|
DB_ERROR_INVALID_DATE => 'некоректна дата или час',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'невалиден номер',
|
||||||
|
DB_ERROR_MISMATCH => 'погрешна употреба',
|
||||||
|
DB_ERROR_NODBSELECTED => 'не е избрана база данни',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'несъществуващо поле',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'несъществуваща таблица',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||||
|
DB_ERROR_NOT_FOUND => 'не е намерена',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'не е заключена',
|
||||||
|
DB_ERROR_SYNTAX => 'грешен синтаксис',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'не се поддържа',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда',
|
||||||
|
DB_ERROR_INVALID_DSN => 'невалиден DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде осъществена',
|
||||||
|
0 => 'няма грешки', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'предоставените данни са недостатъчни',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено',
|
||||||
|
DB_ERROR_NOSUCHDB => 'несъществуваща база данни',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'нямате достатъчно права'
|
||||||
|
);
|
||||||
|
?>
|
37
includes/adodb/lang/adodb-bgutf8.inc.php
Normal file
37
includes/adodb/lang/adodb-bgutf8.inc.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Bulgarian language, v1.0, 25.03.2004, encoding by UTF-8 charset
|
||||||
|
contributed by Valentin Sheiretsky <valio#valio.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'bgutf8',
|
||||||
|
DB_ERROR => 'неизвестна грешка',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'вече съществува',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'не може да бъде създадена',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена',
|
||||||
|
DB_ERROR_CONSTRAINT => 'нарушено условие',
|
||||||
|
DB_ERROR_DIVZERO => 'деление на нула',
|
||||||
|
DB_ERROR_INVALID => 'неправилно',
|
||||||
|
DB_ERROR_INVALID_DATE => 'некоректна дата или час',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'невалиден номер',
|
||||||
|
DB_ERROR_MISMATCH => 'погрешна употреба',
|
||||||
|
DB_ERROR_NODBSELECTED => 'не е избрана база данни',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'несъществуващо поле',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'несъществуваща таблица',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||||
|
DB_ERROR_NOT_FOUND => 'не е намерена',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'не е заключена',
|
||||||
|
DB_ERROR_SYNTAX => 'грешен синтаксис',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'не се поддържа',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда',
|
||||||
|
DB_ERROR_INVALID_DSN => 'невалиден DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде осъществена',
|
||||||
|
0 => 'няма грешки', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'предоставените данни са недостатъчни',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено',
|
||||||
|
DB_ERROR_NOSUCHDB => 'несъществуваща база данни',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'нямате достатъчно права'
|
||||||
|
);
|
||||||
|
?>
|
34
includes/adodb/lang/adodb-ca.inc.php
Normal file
34
includes/adodb/lang/adodb-ca.inc.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
// Catalan language
|
||||||
|
// contributed by "Josep Lladonosa" jlladono#pie.xtec.es
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'ca',
|
||||||
|
DB_ERROR => 'error desconegut',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'ja existeix',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'no es pot crear',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'no es pot esborrar',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'no es pot eliminar',
|
||||||
|
DB_ERROR_CONSTRAINT => 'violació de constraint',
|
||||||
|
DB_ERROR_DIVZERO => 'divisió per zero',
|
||||||
|
DB_ERROR_INVALID => 'no és vàlid',
|
||||||
|
DB_ERROR_INVALID_DATE => 'la data o l\'hora no són vàlides',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'el nombre no és vàlid',
|
||||||
|
DB_ERROR_MISMATCH => 'no hi ha coincidència',
|
||||||
|
DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'camp inexistent',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'taula inexistent',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'l\'execució secundària de DB no pot',
|
||||||
|
DB_ERROR_NOT_FOUND => 'no trobat',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'no blocat',
|
||||||
|
DB_ERROR_SYNTAX => 'error de sintaxi',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'no suportat',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila',
|
||||||
|
DB_ERROR_INVALID_DSN => 'el DSN no és vàlid',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'connexió fallida',
|
||||||
|
0 => 'cap error', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'les dades subministrades són insuficients',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensió no trobada',
|
||||||
|
DB_ERROR_NOSUCHDB => 'base de dades inexistent',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients'
|
||||||
|
);
|
||||||
|
?>
|
35
includes/adodb/lang/adodb-cn.inc.php
Normal file
35
includes/adodb/lang/adodb-cn.inc.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
// Chinese language file contributed by "Cuiyan (cysoft)" cysoft#php.net.
|
||||||
|
// Encode by GB2312
|
||||||
|
// Simplified Chinese
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'cn',
|
||||||
|
DB_ERROR => '未知错误',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => '已经存在',
|
||||||
|
DB_ERROR_CANNOT_CREATE => '不能创建',
|
||||||
|
DB_ERROR_CANNOT_DELETE => '不能删除',
|
||||||
|
DB_ERROR_CANNOT_DROP => '不能丢弃',
|
||||||
|
DB_ERROR_CONSTRAINT => '约束限制',
|
||||||
|
DB_ERROR_DIVZERO => '被0除',
|
||||||
|
DB_ERROR_INVALID => '无效',
|
||||||
|
DB_ERROR_INVALID_DATE => '无效的日期或者时间',
|
||||||
|
DB_ERROR_INVALID_NUMBER => '无效的数字',
|
||||||
|
DB_ERROR_MISMATCH => '不匹配',
|
||||||
|
DB_ERROR_NODBSELECTED => '没有数据库被选择',
|
||||||
|
DB_ERROR_NOSUCHFIELD => '没有相应的字段',
|
||||||
|
DB_ERROR_NOSUCHTABLE => '没有相应的表',
|
||||||
|
DB_ERROR_NOT_CAPABLE => '数据库后台不兼容',
|
||||||
|
DB_ERROR_NOT_FOUND => '没有发现',
|
||||||
|
DB_ERROR_NOT_LOCKED => '没有被锁定',
|
||||||
|
DB_ERROR_SYNTAX => '语法错误',
|
||||||
|
DB_ERROR_UNSUPPORTED => '不支持',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => '在行上累计值',
|
||||||
|
DB_ERROR_INVALID_DSN => '无效的数据源 (DSN)',
|
||||||
|
DB_ERROR_CONNECT_FAILED => '连接失败',
|
||||||
|
0 => '没有错误', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => '提供的数据不能符合要求',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> '扩展没有被发现',
|
||||||
|
DB_ERROR_NOSUCHDB => '没有相应的数据库',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => '没有合适的权限'
|
||||||
|
);
|
||||||
|
?>
|
40
includes/adodb/lang/adodb-cz.inc.php
Normal file
40
includes/adodb/lang/adodb-cz.inc.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
# Czech language, encoding by ISO 8859-2 charset (Iso Latin-2)
|
||||||
|
# For convert to MS Windows use shell command:
|
||||||
|
# iconv -f ISO_8859-2 -t CP1250 < adodb-cz.inc.php
|
||||||
|
# For convert to ASCII use shell command:
|
||||||
|
# unaccent ISO_8859-2 < adodb-cz.inc.php
|
||||||
|
# v1.0, 19.06.2003 Kamil Jakubovic <jake@host.sk>
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'cz',
|
||||||
|
DB_ERROR => 'neznámá chyba',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'ji? existuje',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'nelze smazat',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'nelze odstranit',
|
||||||
|
DB_ERROR_CONSTRAINT => 'poru?ení omezující podmínky',
|
||||||
|
DB_ERROR_DIVZERO => 'd?lení nulou',
|
||||||
|
DB_ERROR_INVALID => 'neplatné',
|
||||||
|
DB_ERROR_INVALID_DATE => 'neplatné datum nebo ?as',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'neplatné ?íslo',
|
||||||
|
DB_ERROR_MISMATCH => 'nesouhlasí',
|
||||||
|
DB_ERROR_NODBSELECTED => '?ádná databáze není vybrána',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'nepodporováno',
|
||||||
|
DB_ERROR_NOT_FOUND => 'nenalezeno',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'nezam?eno',
|
||||||
|
DB_ERROR_SYNTAX => 'syntaktická chyba',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'nepodporováno',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => '',
|
||||||
|
DB_ERROR_INVALID_DSN => 'neplatné DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'p?ipojení selhalo',
|
||||||
|
0 => 'bez chyb', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'málo zdrojových dat',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?í?ení nenalezeno',
|
||||||
|
DB_ERROR_NOSUCHDB => 'databáze neexistuje',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'nedostate?ná práva'
|
||||||
|
);
|
||||||
|
?>
|
33
includes/adodb/lang/adodb-da.inc.php
Normal file
33
includes/adodb/lang/adodb-da.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
// Arne Eckmann bananstat#users.sourceforge.net
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'da',
|
||||||
|
DB_ERROR => 'ukendt fejl',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'kan ikke oprette',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'kan ikke slette',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'kan ikke droppe',
|
||||||
|
DB_ERROR_CONSTRAINT => 'begrænsning krænket',
|
||||||
|
DB_ERROR_DIVZERO => 'division med nul',
|
||||||
|
DB_ERROR_INVALID => 'ugyldig',
|
||||||
|
DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'ugyldigt tal',
|
||||||
|
DB_ERROR_MISMATCH => 'mismatch',
|
||||||
|
DB_ERROR_NODBSELECTED => 'ingen database valgt',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'felt findes ikke',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'tabel findes ikke',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DB backend opgav',
|
||||||
|
DB_ERROR_NOT_FOUND => 'ikke fundet',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'ikke låst',
|
||||||
|
DB_ERROR_SYNTAX => 'syntaksfejl',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'ikke understøttet',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til forespørgslens antal felter',
|
||||||
|
DB_ERROR_INVALID_DSN => 'ugyldig DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes',
|
||||||
|
0 => 'ingen fejl', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'utilstrækkelige data angivet',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet',
|
||||||
|
DB_ERROR_NOSUCHDB => 'database ikke fundet',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'utilstrækkelige rettigheder'
|
||||||
|
);
|
||||||
|
?>
|
33
includes/adodb/lang/adodb-de.inc.php
Normal file
33
includes/adodb/lang/adodb-de.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
// contributed by "Heinz Hombergs" <opn@hhombergs.de>
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'de',
|
||||||
|
DB_ERROR => 'Unbekannter Fehler',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'existiert bereits',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'kann nicht löschen',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden',
|
||||||
|
DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
|
||||||
|
DB_ERROR_DIVZERO => 'Division durch Null',
|
||||||
|
DB_ERROR_INVALID => 'ung¨ltig',
|
||||||
|
DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl',
|
||||||
|
DB_ERROR_MISMATCH => 'Unverträglichkeit',
|
||||||
|
DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert',
|
||||||
|
DB_ERROR_NOT_FOUND => 'nicht gefunden',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'nicht gesperrt',
|
||||||
|
DB_ERROR_SYNTAX => 'Syntaxfehler',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
|
||||||
|
DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
|
||||||
|
0 => 'kein Fehler', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
|
||||||
|
DB_ERROR_NOSUCHDB => 'keine Datenbank',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte'
|
||||||
|
);
|
||||||
|
?>
|
33
includes/adodb/lang/adodb-en.inc.php
Normal file
33
includes/adodb/lang/adodb-en.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'en',
|
||||||
|
DB_ERROR => 'unknown error',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'already exists',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'can not create',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'can not delete',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'can not drop',
|
||||||
|
DB_ERROR_CONSTRAINT => 'constraint violation',
|
||||||
|
DB_ERROR_DIVZERO => 'division by zero',
|
||||||
|
DB_ERROR_INVALID => 'invalid',
|
||||||
|
DB_ERROR_INVALID_DATE => 'invalid date or time',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'invalid number',
|
||||||
|
DB_ERROR_MISMATCH => 'mismatch',
|
||||||
|
DB_ERROR_NODBSELECTED => 'no database selected',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'no such field',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'no such table',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||||
|
DB_ERROR_NOT_FOUND => 'not found',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'not locked',
|
||||||
|
DB_ERROR_SYNTAX => 'syntax error',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'not supported',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
|
||||||
|
DB_ERROR_INVALID_DSN => 'invalid DSN',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'connect failed',
|
||||||
|
0 => 'no error', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
|
||||||
|
DB_ERROR_NOSUCHDB => 'no such database',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions'
|
||||||
|
);
|
||||||
|
?>
|
33
includes/adodb/lang/adodb-es.inc.php
Normal file
33
includes/adodb/lang/adodb-es.inc.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
// contributed by "Horacio Degiorgi" <horaciod@codigophp.com>
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'es',
|
||||||
|
DB_ERROR => 'error desconocido',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'ya existe',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'imposible crear',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'imposible borrar',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'imposible hacer drop',
|
||||||
|
DB_ERROR_CONSTRAINT => 'violacion de constraint',
|
||||||
|
DB_ERROR_DIVZERO => 'division por cero',
|
||||||
|
DB_ERROR_INVALID => 'invalido',
|
||||||
|
DB_ERROR_INVALID_DATE => 'fecha u hora invalida',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'numero invalido',
|
||||||
|
DB_ERROR_MISMATCH => 'error',
|
||||||
|
DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'campo invalido',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'tabla no existe',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB',
|
||||||
|
DB_ERROR_NOT_FOUND => 'no encontrado',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'no bloqueado',
|
||||||
|
DB_ERROR_SYNTAX => 'error de sintaxis',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'no soportado',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores',
|
||||||
|
DB_ERROR_INVALID_DSN => 'DSN invalido',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'fallo la conexion',
|
||||||
|
0 => 'sin error', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'insuficientes datos',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada',
|
||||||
|
DB_ERROR_NOSUCHDB => 'base de datos no encontrada',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes'
|
||||||
|
);
|
||||||
|
?>
|
35
includes/adodb/lang/adodb-esperanto.inc.php
Normal file
35
includes/adodb/lang/adodb-esperanto.inc.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
// Vivu Esperanto cxiam!
|
||||||
|
// Traduko fare de Antono Vasiljev (anders[#]brainactive.org)
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'eo',
|
||||||
|
DB_ERROR => 'nekonata eraro',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'jam ekzistas',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'maleblas krei',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'maleblas elimini',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)',
|
||||||
|
DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo',
|
||||||
|
DB_ERROR_DIVZERO => 'divido per 0 (nul)',
|
||||||
|
DB_ERROR_INVALID => 'malregule',
|
||||||
|
DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'malregula nombro',
|
||||||
|
DB_ERROR_MISMATCH => 'eraro',
|
||||||
|
DB_ERROR_NODBSELECTED => 'datumbazo ne elektita',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DBMS ne povas',
|
||||||
|
DB_ERROR_NOT_FOUND => 'ne trovita',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'ne blokita',
|
||||||
|
DB_ERROR_SYNTAX => 'sintaksa eraro',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'ne apogata',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio',
|
||||||
|
DB_ERROR_INVALID_DSN => 'malregula DSN-o',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa',
|
||||||
|
0 => 'cxio bone', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita',
|
||||||
|
DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo'
|
||||||
|
);
|
||||||
|
?>
|
35
includes/adodb/lang/adodb-fa.inc.php
Normal file
35
includes/adodb/lang/adodb-fa.inc.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/* Farsi - by "Peyman Hooshmandi Raad" <phooshmand#gmail.com> */
|
||||||
|
|
||||||
|
$ADODB_LANG_ARRAY = array (
|
||||||
|
'LANG' => 'fa',
|
||||||
|
DB_ERROR => 'خطای ناشناخته',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'وجود دارد',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد',
|
||||||
|
DB_ERROR_CANNOT_DELETE => 'امکان حذف وجود ندارد',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد',
|
||||||
|
DB_ERROR_CONSTRAINT => 'نقض شرط',
|
||||||
|
DB_ERROR_DIVZERO => 'تقسیم بر صفر',
|
||||||
|
DB_ERROR_INVALID => 'نامعتبر',
|
||||||
|
DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر',
|
||||||
|
DB_ERROR_MISMATCH => 'عدم مطابقت',
|
||||||
|
DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست',
|
||||||
|
DB_ERROR_NOT_FOUND => 'پیدا نشد',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'قفل نشده',
|
||||||
|
DB_ERROR_SYNTAX => 'خطای دستوری',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیف',
|
||||||
|
DB_ERROR_INVALID_DSN => 'DSN نامعتبر',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد',
|
||||||
|
0 => 'بدون خطا', // DB_OK
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'داده ناکافی است',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد',
|
||||||
|
DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکافی'
|
||||||
|
);
|
||||||
|
?>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user