7d8e199a3f
Now there's definitely no PHP4 support whatsoever, if there even was little of it before this commit.
566 lines
15 KiB
PHP
Executable File
566 lines
15 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Prototype Castable Object.. for DataObject queries
|
|
*
|
|
* Storage for Data that may be cast into a variety of formats.
|
|
*
|
|
* PHP versions 4 and 5
|
|
*
|
|
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
|
* that is available through the world-wide-web at the following URI:
|
|
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
|
* the PHP License and are unable to obtain it through the web, please
|
|
* send a note to license@php.net so we can mail you a copy immediately.
|
|
*
|
|
* @category Database
|
|
* @package DB_DataObject
|
|
* @author Alan Knowles <alan@akbkhome.com>
|
|
* @copyright 1997-2008 The PHP Group
|
|
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
|
* @version CVS: $Id: Cast.php 326604 2012-07-12 03:02:00Z alan_k $
|
|
* @link http://pear.php.net/package/DB_DataObject
|
|
*/
|
|
|
|
/**
|
|
*
|
|
* Common usages:
|
|
* // blobs
|
|
* $data = DB_DataObject_Cast::blob($somefile);
|
|
* $data = DB_DataObject_Cast::string($somefile);
|
|
* $dataObject->someblobfield = $data
|
|
*
|
|
* // dates?
|
|
* $d1 = new DB_DataObject_Cast::date('12/12/2000');
|
|
* $d2 = new DB_DataObject_Cast::date(2000,12,30);
|
|
* $d3 = new DB_DataObject_Cast::date($d1->year, $d1->month+30, $d1->day+30);
|
|
*
|
|
* // time, datetime.. ?????????
|
|
*
|
|
* // raw sql????
|
|
* $data = DB_DataObject_Cast::sql('cast("123123",datetime)');
|
|
* $data = DB_DataObject_Cast::sql('NULL');
|
|
*
|
|
* // int's/string etc. are proably pretty pointless..!!!!
|
|
*
|
|
*
|
|
* inside DB_DataObject,
|
|
* if (is_a($v,'db_dataobject_class')) {
|
|
* $value .= $v->toString(DB_DATAOBJECT_INT,'mysql');
|
|
* }
|
|
*
|
|
*
|
|
*
|
|
*
|
|
|
|
*/
|
|
class DB_DataObject_Cast {
|
|
|
|
/**
|
|
* Type of data Stored in the object..
|
|
*
|
|
* @var string (date|blob|.....?)
|
|
* @access public
|
|
*/
|
|
var $type;
|
|
|
|
/**
|
|
* Data For date representation
|
|
*
|
|
* @var int day/month/year
|
|
* @access public
|
|
*/
|
|
var $day;
|
|
var $month;
|
|
var $year;
|
|
|
|
|
|
/**
|
|
* Generic Data..
|
|
*
|
|
* @var string
|
|
* @access public
|
|
*/
|
|
|
|
var $value;
|
|
|
|
|
|
|
|
/**
|
|
* Blob consructor
|
|
*
|
|
* create a Cast object from some raw data.. (binary)
|
|
*
|
|
*
|
|
* @param string (with binary data!)
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
*/
|
|
|
|
function blob($value) {
|
|
$r = new DB_DataObject_Cast;
|
|
$r->type = 'blob';
|
|
$r->value = $value;
|
|
return $r;
|
|
}
|
|
|
|
|
|
/**
|
|
* String consructor (actually use if for ints and everything else!!!
|
|
*
|
|
* create a Cast object from some string (not binary)
|
|
*
|
|
*
|
|
* @param string (with binary data!)
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
*/
|
|
|
|
function string($value) {
|
|
$r = new DB_DataObject_Cast;
|
|
$r->type = 'string';
|
|
$r->value = $value;
|
|
return $r;
|
|
}
|
|
|
|
/**
|
|
* SQL constructor (for raw SQL insert)
|
|
*
|
|
* create a Cast object from some sql
|
|
*
|
|
* @param string (with binary data!)
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
*/
|
|
|
|
function sql($value)
|
|
{
|
|
$r = new DB_DataObject_Cast;
|
|
$r->type = 'sql';
|
|
$r->value = $value;
|
|
return $r;
|
|
}
|
|
|
|
|
|
/**
|
|
* Date Constructor
|
|
*
|
|
* create a Cast object from some string (not binary)
|
|
* NO VALIDATION DONE, although some crappy re-calcing done!
|
|
*
|
|
* @param vargs... accepts
|
|
* dd/mm
|
|
* dd/mm/yyyy
|
|
* yyyy-mm
|
|
* yyyy-mm-dd
|
|
* array(yyyy,dd)
|
|
* array(yyyy,dd,mm)
|
|
*
|
|
*
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
*/
|
|
|
|
function date()
|
|
{
|
|
$args = func_get_args();
|
|
switch(count($args)) {
|
|
case 0: // no args = today!
|
|
$bits = explode('-',date('Y-m-d'));
|
|
break;
|
|
case 1: // one arg = a string
|
|
|
|
if (strpos($args[0],'/') !== false) {
|
|
$bits = array_reverse(explode('/',$args[0]));
|
|
} else {
|
|
$bits = explode('-',$args[0]);
|
|
}
|
|
break;
|
|
default: // 2 or more..
|
|
$bits = $args;
|
|
}
|
|
if (count($bits) == 1) { // if YYYY set day = 1st..
|
|
$bits[] = 1;
|
|
}
|
|
|
|
if (count($bits) == 2) { // if YYYY-DD set day = 1st..
|
|
$bits[] = 1;
|
|
}
|
|
|
|
// if year < 1970 we cant use system tools to check it...
|
|
// so we make a few best gueses....
|
|
// basically do date calculations for the year 2000!!!
|
|
// fix me if anyone has more time...
|
|
if (($bits[0] < 1975) || ($bits[0] > 2030)) {
|
|
$oldyear = $bits[0];
|
|
$bits = explode('-',date('Y-m-d',mktime(1,1,1,$bits[1],$bits[2],2000)));
|
|
$bits[0] = ($bits[0] - 2000) + $oldyear;
|
|
} else {
|
|
// now mktime
|
|
$bits = explode('-',date('Y-m-d',mktime(1,1,1,$bits[1],$bits[2],$bits[0])));
|
|
}
|
|
$r = new DB_DataObject_Cast;
|
|
$r->type = 'date';
|
|
list($r->year,$r->month,$r->day) = $bits;
|
|
return $r;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Data For time representation ** does not handle timezones!!
|
|
*
|
|
* @var int hour/minute/second
|
|
* @access public
|
|
*/
|
|
var $hour;
|
|
var $minute;
|
|
var $second;
|
|
|
|
|
|
/**
|
|
* DateTime Constructor
|
|
*
|
|
* create a Cast object from a Date/Time
|
|
* Maybe should accept a Date object.!
|
|
* NO VALIDATION DONE, although some crappy re-calcing done!
|
|
*
|
|
* @param vargs... accepts
|
|
* noargs (now)
|
|
* yyyy-mm-dd HH:MM:SS (Iso)
|
|
* array(yyyy,mm,dd,HH,MM,SS)
|
|
*
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
* @author therion 5 at hotmail
|
|
*/
|
|
|
|
function dateTime()
|
|
{
|
|
$args = func_get_args();
|
|
switch(count($args)) {
|
|
case 0: // no args = now!
|
|
$datetime = date('Y-m-d G:i:s', mktime());
|
|
|
|
case 1:
|
|
// continue on from 0 args.
|
|
if (!isset($datetime)) {
|
|
$datetime = $args[0];
|
|
}
|
|
|
|
$parts = explode(' ', $datetime);
|
|
$bits = explode('-', $parts[0]);
|
|
$bits = array_merge($bits, explode(':', $parts[1]));
|
|
break;
|
|
|
|
default: // 2 or more..
|
|
$bits = $args;
|
|
|
|
}
|
|
|
|
if (count($bits) != 6) {
|
|
// PEAR ERROR?
|
|
return false;
|
|
}
|
|
|
|
$r = DB_DataObject_Cast::date($bits[0], $bits[1], $bits[2]);
|
|
if (!$r) {
|
|
return $r; // pass thru error (False) - doesnt happen at present!
|
|
}
|
|
// change the type!
|
|
$r->type = 'datetime';
|
|
|
|
// should we mathematically sort this out..
|
|
// (or just assume that no-one's dumb enough to enter 26:90:90 as a time!
|
|
$r->hour = $bits[3];
|
|
$r->minute = $bits[4];
|
|
$r->second = $bits[5];
|
|
return $r;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* time Constructor
|
|
*
|
|
* create a Cast object from a Date/Time
|
|
* Maybe should accept a Date object.!
|
|
* NO VALIDATION DONE, and no-recalcing done!
|
|
*
|
|
* @param vargs... accepts
|
|
* noargs (now)
|
|
* HH:MM:SS (Iso)
|
|
* array(HH,MM,SS)
|
|
*
|
|
*
|
|
* @return object DB_DataObject_Cast
|
|
* @access public
|
|
* @author therion 5 at hotmail
|
|
*/
|
|
function time()
|
|
{
|
|
$args = func_get_args();
|
|
switch (count($args)) {
|
|
case 0: // no args = now!
|
|
$time = date('G:i:s', mktime());
|
|
|
|
case 1:
|
|
// continue on from 0 args.
|
|
if (!isset($time)) {
|
|
$time = $args[0];
|
|
}
|
|
$bits = explode(':', $time);
|
|
break;
|
|
|
|
default: // 2 or more..
|
|
$bits = $args;
|
|
|
|
}
|
|
|
|
if (count($bits) != 3) {
|
|
return false;
|
|
}
|
|
|
|
// now take data from bits into object fields
|
|
$r = new DB_DataObject_Cast;
|
|
$r->type = 'time';
|
|
$r->hour = $bits[0];
|
|
$r->minute = $bits[1];
|
|
$r->second = $bits[2];
|
|
return $r;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for this...
|
|
*
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
*/
|
|
|
|
function toString($to=false,$db)
|
|
{
|
|
// if $this->type is not set, we are in serious trouble!!!!
|
|
// values for to:
|
|
$method = 'toStringFrom'.$this->type;
|
|
return $this->$method($to,$db);
|
|
}
|
|
|
|
/**
|
|
* get the string to use in the SQL statement from a blob of binary data
|
|
* ** Suppots only blob->postgres::bytea
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
*/
|
|
function toStringFromBlob($to,$db)
|
|
{
|
|
// first weed out invalid casts..
|
|
// in blobs can only be cast to blobs.!
|
|
|
|
// perhaps we should support TEXT fields???
|
|
|
|
if (!($to & DB_DATAOBJECT_BLOB)) {
|
|
return PEAR::raiseError('Invalid Cast from a DB_DataObject_Cast::blob to something other than a blob!');
|
|
}
|
|
|
|
switch ($db->dsn["phptype"]) {
|
|
case 'pgsql':
|
|
return "'".pg_escape_bytea($this->value)."'::bytea";
|
|
|
|
case 'mysql':
|
|
return "'".mysql_real_escape_string($this->value,$db->connection)."'";
|
|
|
|
case 'mysqli':
|
|
// this is funny - the parameter order is reversed ;)
|
|
return "'".mysqli_real_escape_string($db->connection, $this->value)."'";
|
|
|
|
case 'sqlite':
|
|
// this is funny - the parameter order is reversed ;)
|
|
return "'".sqlite_escape_string($this->value)."'";
|
|
|
|
case 'mssql':
|
|
|
|
if(is_numeric($this->value)) {
|
|
return $this->value;
|
|
}
|
|
$unpacked = unpack('H*hex', $this->value);
|
|
return '0x' . $unpacked['hex'];
|
|
|
|
|
|
|
|
default:
|
|
return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:{$db->dsn['phptype']} Yet");
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for a blob from a string!
|
|
* ** Suppots only string->postgres::bytea
|
|
*
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
*/
|
|
function toStringFromString($to,$db)
|
|
{
|
|
// first weed out invalid casts..
|
|
// in blobs can only be cast to blobs.!
|
|
|
|
// perhaps we should support TEXT fields???
|
|
//
|
|
|
|
// $to == a string field which is the default type (0)
|
|
// so we do not test it here. - we assume that number fields
|
|
// will accept a string?? - which is stretching it a bit ...
|
|
// should probaly add that test as some point.
|
|
|
|
switch ($db->dsn['phptype']) {
|
|
case 'pgsql':
|
|
return "'".pg_escape_string($this->value)."'::bytea";
|
|
|
|
case 'mysql':
|
|
return "'".mysql_real_escape_string($this->value,$db->connection)."'";
|
|
|
|
|
|
case 'mysqli':
|
|
return "'".mysqli_real_escape_string($db->connection, $this->value)."'";
|
|
|
|
case 'mssql':
|
|
// copied from the old DB mssql code...?? not sure how safe this is.
|
|
return "'" . str_replace(
|
|
array("'", "\\\r\n", "\\\n"),
|
|
array("''", "\\\\\r\n\r\n", "\\\\\n\n"),
|
|
$this->value
|
|
) . "'";
|
|
|
|
|
|
default:
|
|
return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:{$db->dsn['phptype']} Yet");
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for a date
|
|
*
|
|
*
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
*/
|
|
function toStringFromDate($to,$db)
|
|
{
|
|
// first weed out invalid casts..
|
|
// in blobs can only be cast to blobs.!
|
|
// perhaps we should support TEXT fields???
|
|
//
|
|
|
|
if (($to !== false) && !($to & DB_DATAOBJECT_DATE)) {
|
|
return PEAR::raiseError('Invalid Cast from a DB_DataObject_Cast::string to something other than a date!'.
|
|
' (why not just use native features)');
|
|
}
|
|
return "'{$this->year}-{$this->month}-{$this->day}'";
|
|
}
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for a datetime
|
|
*
|
|
*
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
* @author therion 5 at hotmail
|
|
*/
|
|
|
|
function toStringFromDateTime($to,$db)
|
|
{
|
|
// first weed out invalid casts..
|
|
// in blobs can only be cast to blobs.!
|
|
// perhaps we should support TEXT fields???
|
|
if (($to !== false) &&
|
|
!($to & (DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME))) {
|
|
return PEAR::raiseError('Invalid Cast from a ' .
|
|
' DB_DataObject_Cast::dateTime to something other than a datetime!' .
|
|
' (try using native features)');
|
|
}
|
|
return "'{$this->year}-{$this->month}-{$this->day} {$this->hour}:{$this->minute}:{$this->second}'";
|
|
}
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for a time
|
|
*
|
|
*
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
* @author therion 5 at hotmail
|
|
*/
|
|
|
|
function toStringFromTime($to,$db)
|
|
{
|
|
// first weed out invalid casts..
|
|
// in blobs can only be cast to blobs.!
|
|
// perhaps we should support TEXT fields???
|
|
if (($to !== false) && !($to & DB_DATAOBJECT_TIME)) {
|
|
return PEAR::raiseError('Invalid Cast from a' .
|
|
' DB_DataObject_Cast::time to something other than a time!'.
|
|
' (try using native features)');
|
|
}
|
|
return "'{$this->hour}:{$this->minute}:{$this->second}'";
|
|
}
|
|
|
|
/**
|
|
* get the string to use in the SQL statement for a raw sql statement.
|
|
*
|
|
* @param int $to Type (DB_DATAOBJECT_*
|
|
* @param object $db DB Connection Object
|
|
*
|
|
*
|
|
* @return string
|
|
* @access public
|
|
*/
|
|
function toStringFromSql($to,$db)
|
|
{
|
|
return $this->value;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|