Annotation of embedaddon/php/ext/pdo/tests/pdo_018.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: PDO Common: serializing
! 3: --SKIPIF--
! 4: <?php # vim:ft=php
! 5: if (!extension_loaded('pdo')) die('skip');
! 6: if (!interface_exists('Serializable')) die('skip no Serializable interface');
! 7: $dir = getenv('REDIR_TEST_DIR');
! 8: if (false == $dir) die('skip no driver');
! 9: require_once $dir . 'pdo_test.inc';
! 10: PDOTest::skip();
! 11: ?>
! 12: --FILE--
! 13: <?php
! 14: if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
! 15: require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
! 16: $db = PDOTest::factory();
! 17:
! 18: class TestBase implements Serializable
! 19: {
! 20: public $BasePub = 'Public';
! 21: protected $BasePro = 'Protected';
! 22: private $BasePri = 'Private';
! 23:
! 24: function serialize()
! 25: {
! 26: $serialized = array();
! 27: foreach($this as $prop => $val) {
! 28: $serialized[$prop] = $val;
! 29: }
! 30: $serialized = serialize($serialized);
! 31: echo __METHOD__ . "() = '$serialized'\n";
! 32: return $serialized;
! 33: }
! 34:
! 35: function unserialize($serialized)
! 36: {
! 37: echo __METHOD__ . "($serialized)\n";
! 38: foreach(unserialize($serialized) as $prop => $val) {
! 39: $this->$prop = '#'.$val;
! 40: }
! 41: return true;
! 42: }
! 43: }
! 44:
! 45: class TestDerived extends TestBase
! 46: {
! 47: public $BasePub = 'DerivedPublic';
! 48: protected $BasePro = 'DerivdeProtected';
! 49: public $DerivedPub = 'Public';
! 50: protected $DerivedPro = 'Protected';
! 51: private $DerivedPri = 'Private';
! 52:
! 53: function serialize()
! 54: {
! 55: echo __METHOD__ . "()\n";
! 56: return TestBase::serialize();
! 57: }
! 58:
! 59: function unserialize($serialized)
! 60: {
! 61: echo __METHOD__ . "()\n";
! 62: return TestBase::unserialize($serialized);
! 63: }
! 64: }
! 65:
! 66: class TestLeaf extends TestDerived
! 67: {
! 68: }
! 69:
! 70: $db->exec('CREATE TABLE classtypes(id int NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL UNIQUE)');
! 71: $db->exec('INSERT INTO classtypes VALUES(0, \'stdClass\')');
! 72: $db->exec('INSERT INTO classtypes VALUES(1, \'TestBase\')');
! 73: $db->exec('INSERT INTO classtypes VALUES(2, \'TestDerived\')');
! 74: $db->exec('CREATE TABLE test(id int NOT NULL PRIMARY KEY, classtype int, val VARCHAR(255))');
! 75:
! 76: $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
! 77:
! 78: var_dump($db->query('SELECT COUNT(*) FROM classtypes')->fetchColumn());
! 79: var_dump($db->query('SELECT id, name FROM classtypes ORDER by id')->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_UNIQUE));
! 80:
! 81: $objs = array();
! 82: $objs[0] = new stdClass;
! 83: $objs[1] = new TestBase;
! 84: $objs[2] = new TestDerived;
! 85: $objs[3] = new TestLeaf;
! 86:
! 87: $stmt = $db->prepare('SELECT id FROM classtypes WHERE name=:cname');
! 88: $stmt->bindParam(':cname', $cname);
! 89:
! 90: $ctypes = array();
! 91:
! 92: foreach($objs as $obj)
! 93: {
! 94: $cname = get_class($obj);
! 95: $ctype = NULL; /* set default for non stored class name */
! 96: $stmt->execute();
! 97: $stmt->bindColumn('id', $ctype);
! 98: $stmt->fetch(PDO::FETCH_BOUND);
! 99: $ctypes[$cname] = $ctype;
! 100: }
! 101:
! 102: echo "===TYPES===\n";
! 103: var_dump($ctypes);
! 104:
! 105: unset($stmt);
! 106:
! 107: echo "===INSERT===\n";
! 108: $stmt = $db->prepare('INSERT INTO test VALUES(:id, :classtype, :val)');
! 109: $stmt->bindParam(':id', $idx);
! 110: $stmt->bindParam(':classtype', $ctype);
! 111: $stmt->bindParam(':val', $val);
! 112:
! 113: foreach($objs as $idx => $obj)
! 114: {
! 115: $ctype = $ctypes[get_class($obj)];
! 116: if (method_exists($obj, 'serialize'))
! 117: {
! 118: $val = $obj->serialize();
! 119: }
! 120: else
! 121: {
! 122: $val = '';
! 123: }
! 124: $stmt->execute();
! 125: }
! 126:
! 127: unset($stmt);
! 128:
! 129: echo "===DATA===\n";
! 130: $res = $db->query('SELECT test.val FROM test')->fetchAll(PDO::FETCH_COLUMN);
! 131:
! 132: // For Oracle map NULL to empty string so the test doesn't diff
! 133: if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'oci' && $res[0] === null) {
! 134: $res[0] = "";
! 135: }
! 136: var_dump($res);
! 137:
! 138: echo "===FAILURE===\n";
! 139: try
! 140: {
! 141: $db->query('SELECT classtypes.name AS name, test.val AS val FROM test LEFT JOIN classtypes ON test.classtype=classtypes.id')->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE|PDO::FETCH_SERIALIZE, 'TestLeaf', array());
! 142: }
! 143: catch (PDOException $e)
! 144: {
! 145: echo 'Exception:';
! 146: echo $e->getMessage()."\n";
! 147: }
! 148:
! 149: echo "===COUNT===\n";
! 150: var_dump($db->query('SELECT COUNT(*) FROM test LEFT JOIN classtypes ON test.classtype=classtypes.id WHERE (classtypes.id IS NULL OR classtypes.id > 0)')->fetchColumn());
! 151:
! 152: echo "===DATABASE===\n";
! 153: $stmt = $db->prepare('SELECT classtypes.name AS name, test.val AS val FROM test LEFT JOIN classtypes ON test.classtype=classtypes.id WHERE (classtypes.id IS NULL OR classtypes.id > 0)');
! 154:
! 155: $stmt->execute();
! 156: var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
! 157:
! 158: echo "===FETCHCLASS===\n";
! 159: $stmt->execute();
! 160: var_dump($stmt->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE|PDO::FETCH_SERIALIZE, 'TestLeaf'));
! 161:
! 162:
! 163: ?>
! 164: --EXPECTF--
! 165: string(1) "3"
! 166: array(3) {
! 167: [0]=>
! 168: string(8) "stdClass"
! 169: [1]=>
! 170: string(8) "TestBase"
! 171: [2]=>
! 172: string(11) "TestDerived"
! 173: }
! 174: ===TYPES===
! 175: array(4) {
! 176: ["stdClass"]=>
! 177: string(1) "0"
! 178: ["TestBase"]=>
! 179: string(1) "1"
! 180: ["TestDerived"]=>
! 181: string(1) "2"
! 182: ["TestLeaf"]=>
! 183: NULL
! 184: }
! 185: ===INSERT===
! 186: TestBase::serialize() = 'a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
! 187: TestDerived::serialize()
! 188: TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
! 189: TestDerived::serialize()
! 190: TestBase::serialize() = 'a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}'
! 191: ===DATA===
! 192: array(4) {
! 193: [0]=>
! 194: string(0) ""
! 195: [1]=>
! 196: string(91) "a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 197: [2]=>
! 198: string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 199: [3]=>
! 200: string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 201: }
! 202: ===FAILURE===
! 203: Exception:SQLSTATE[HY000]: General error: cannot unserialize class
! 204: ===COUNT===
! 205: string(1) "3"
! 206: ===DATABASE===
! 207: array(3) {
! 208: [0]=>
! 209: array(2) {
! 210: ["name"]=>
! 211: string(8) "TestBase"
! 212: ["val"]=>
! 213: string(91) "a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 214: }
! 215: [1]=>
! 216: array(2) {
! 217: ["name"]=>
! 218: string(11) "TestDerived"
! 219: ["val"]=>
! 220: string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 221: }
! 222: [2]=>
! 223: array(2) {
! 224: ["name"]=>
! 225: NULL
! 226: ["val"]=>
! 227: string(172) "a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";}"
! 228: }
! 229: }
! 230: ===FETCHCLASS===
! 231: TestBase::unserialize(a:3:{s:7:"BasePub";s:6:"Public";s:7:"BasePro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
! 232: TestDerived::unserialize()
! 233: TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
! 234: TestDerived::unserialize()
! 235: TestBase::unserialize(a:5:{s:7:"BasePub";s:13:"DerivedPublic";s:7:"BasePro";s:16:"DerivdeProtected";s:10:"DerivedPub";s:6:"Public";s:10:"DerivedPro";s:9:"Protected";s:7:"BasePri";s:7:"Private";})
! 236: array(3) {
! 237: [0]=>
! 238: object(TestBase)#%d (3) {
! 239: ["BasePub"]=>
! 240: string(7) "#Public"
! 241: ["BasePro":protected]=>
! 242: string(10) "#Protected"
! 243: ["BasePri":"TestBase":private]=>
! 244: string(8) "#Private"
! 245: }
! 246: [1]=>
! 247: object(TestDerived)#%d (6) {
! 248: ["BasePub"]=>
! 249: string(14) "#DerivedPublic"
! 250: ["BasePro":protected]=>
! 251: string(17) "#DerivdeProtected"
! 252: ["DerivedPub"]=>
! 253: string(7) "#Public"
! 254: ["DerivedPro":protected]=>
! 255: string(10) "#Protected"
! 256: ["DerivedPri":"TestDerived":private]=>
! 257: string(7) "Private"
! 258: ["BasePri":"TestBase":private]=>
! 259: string(8) "#Private"
! 260: }
! 261: [2]=>
! 262: object(TestLeaf)#%d (6) {
! 263: ["BasePub"]=>
! 264: string(14) "#DerivedPublic"
! 265: ["BasePro":protected]=>
! 266: string(17) "#DerivdeProtected"
! 267: ["DerivedPub"]=>
! 268: string(7) "#Public"
! 269: ["DerivedPro":protected]=>
! 270: string(10) "#Protected"
! 271: ["DerivedPri":"TestDerived":private]=>
! 272: string(7) "Private"
! 273: ["BasePri":"TestBase":private]=>
! 274: string(8) "#Private"
! 275: }
! 276: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>