1<?php
2/**
3 * Netezza Driver
4 *
5 * @link https://www.ibm.com/products/netezza
6 * Based on the previous postgres drivers. Major Additions/Changes:
7 * - MetaDatabasesSQL, MetaTablesSQL, MetaColumnsSQL
8 *   Note: You have to have admin privileges to access the system tables
9 * - Removed non-working keys code (Netezza has no concept of keys)
10 * - Fixed the way data types and lengths are returned in MetaColumns()
11 *   as well as added the default lengths for certain types
12 * - Updated public variables for Netezza
13 * TODO: Still need to remove blob functions, as Netezza doesn't support blob
14 *
15 * This file is part of ADOdb, a Database Abstraction Layer library for PHP.
16 *
17 * @package ADOdb
18 * @link https://adodb.org Project's web site and documentation
19 * @link https://github.com/ADOdb/ADOdb Source code and issue tracker
20 *
21 * The ADOdb Library is dual-licensed, released under both the BSD 3-Clause
22 * and the GNU Lesser General Public Licence (LGPL) v2.1 or, at your option,
23 * any later version. This means you can use it in proprietary products.
24 * See the LICENSE.md file distributed with this source code for details.
25 * @license BSD-3-Clause
26 * @license LGPL-2.1-or-later
27 *
28 * @copyright 2000-2013 John Lim
29 * @copyright 2014 Damien Regad, Mark Newnham and the ADOdb community
30 * @author Josh Eldridge <joshuae74@hotmail.com>
31 */
32
33// security - hide paths
34if (!defined('ADODB_DIR')) die();
35
36include_once(ADODB_DIR.'/drivers/adodb-postgres64.inc.php');
37
38class ADODB_netezza extends ADODB_postgres64 {
39    var $databaseType = 'netezza';
40	var $dataProvider = 'netezza';
41	var $hasInsertID = false;
42	var $_resultid = false;
43  	var $concat_operator='||';
44  	var $random = 'random';
45	var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1";
46    var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1";
47	var $isoDates = true; // accepts dates in ISO format
48	var $sysDate = "CURRENT_DATE";
49	var $sysTimeStamp = "CURRENT_TIMESTAMP";
50	var $blobEncodeType = 'C';
51	var $metaColumnsSQL = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
52	var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
53	// netezza doesn't have keys. it does have distributions, so maybe this is
54	// something that can be pulled from the system tables
55	var $metaKeySQL = "";
56	var $hasAffectedRows = true;
57	var $hasLimit = true;
58	var $true = 't';		// string that represents TRUE for a database
59	var $false = 'f';		// string that represents FALSE for a database
60	var $fmtDate = "'Y-m-d'";	// used by DBDate() as the default date format used by the database
61	var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
62	var $ansiOuter = true;
63	var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4
64							// http://bugs.php.net/bug.php?id=25404
65
66
67	function MetaColumns($table,$upper=true)
68	{
69
70	// Changed this function to support Netezza which has no concept of keys
71	// could posisbly work on other things from the system table later.
72
73	global $ADODB_FETCH_MODE;
74
75		$table = strtolower($table);
76
77		$save = $ADODB_FETCH_MODE;
78		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
79		if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
80
81		$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
82		if (isset($savem)) $this->SetFetchMode($savem);
83		$ADODB_FETCH_MODE = $save;
84
85		if ($rs === false) return false;
86
87		$retarr = array();
88		while (!$rs->EOF) {
89			$fld = new ADOFieldObject();
90			$fld->name = $rs->fields[0];
91
92			// since we're returning type and length as one string,
93			// split them out here.
94
95			if ($first = strstr($rs->fields[1], "(")) {
96			 $fld->max_length = trim($first, "()");
97			} else {
98			 $fld->max_length = -1;
99			}
100
101			if ($first = strpos($rs->fields[1], "(")) {
102			 $fld->type = substr($rs->fields[1], 0, $first);
103			} else {
104			 $fld->type = $rs->fields[1];
105			}
106
107			switch ($fld->type) {
108			 case "byteint":
109			 case "boolean":
110			 $fld->max_length = 1;
111			 break;
112			 case "smallint":
113			 $fld->max_length = 2;
114			 break;
115			 case "integer":
116			 case "numeric":
117			 case "date":
118			 $fld->max_length = 4;
119			 break;
120			 case "bigint":
121			 case "time":
122			 case "timestamp":
123			 $fld->max_length = 8;
124			 break;
125			 case "timetz":
126			 case "time with time zone":
127			 $fld->max_length = 12;
128			 break;
129			}
130
131			if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
132			else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld;
133
134			$rs->MoveNext();
135		}
136		$rs->Close();
137		return $retarr;
138
139	}
140
141
142}
143
144/*--------------------------------------------------------------------------------------
145	 Class Name: Recordset
146--------------------------------------------------------------------------------------*/
147
148class ADORecordSet_netezza extends ADORecordSet_postgres64
149{
150	var $databaseType = "netezza";
151	var $canSeek = true;
152
153	// _initrs modified to disable blob handling
154	function _initrs()
155	{
156	global $ADODB_COUNTRECS;
157		$this->_numOfRows = ($ADODB_COUNTRECS)? @pg_num_rows($this->_queryID):-1;
158		$this->_numOfFields = @pg_num_fields($this->_queryID);
159	}
160
161}
162