1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445:
<?php
namespace MvcCore\Ext\Models\Db\Readers\Streams;
class Iterator
implements \MvcCore\Ext\Models\Db\Readers\Streams\IIterator,
\Iterator,
\Countable {
protected $reader;
protected $providerStatement;
protected $executeMethod;
protected $completerMethod;
protected $completerProps;
protected $index = NULL;
protected $valid = FALSE;
protected $resultKey = NULL;
protected $resultValue = NULL;
public function __construct (\MvcCore\Ext\Models\Db\Readers\IStream $reader, $completerName, $completerArguments) {
$this->providerStatement = $reader->GetStatement()->GetProviderStatement();
$this->reader = $reader;
$this->executeMethod = new \ReflectionMethod($reader, 'providerInvokeExecute');
$this->executeMethod->setAccessible(TRUE);
$this->completerMethod = 'to' . ucfirst($completerName);
$propsPreparingHandler = 'prepare' . ucfirst($completerName);
$this->{$propsPreparingHandler}($completerArguments);
}
public function GetReader () {
return $this->reader;
}
public function GetStatement () {
return $this->reader->GetStatement();
}
public function GetConnection () {
return $this->reader->GetStatement()->GetConnection();
}
public function Close () {
$this->GetStatement()->Close();
$this->valid = FALSE;
$this->resultKey = NULL;
$this->resultValue = NULL;
}
protected function prepareInstances (& $completerArguments) {
list(
$fullClassName, $readingFlags, $keyColumnName, $keyType
) = $completerArguments;
$type = new \ReflectionClass($fullClassName);
if (!$type->hasMethod('SetValues'))
throw new \InvalidArgumentException(
"[".get_class()."] Class `{$fullClassName}` has no public method ".
"`SetValues (\$data = [], \$propsFlags = 0): \MvcCore\Model`."
);
$this->completerProps = (object) [
'type' => $type,
'readingFlags' => $readingFlags,
'keyColumnName' => $keyColumnName,
'keyType' => $keyType,
'retypeKey' => $keyType !== NULL,
'useRawKey' => $keyColumnName === NULL,
];
}
protected function prepareArrays (& $completerArguments) {
$this->prepareArraysAndObjects($completerArguments);
}
protected function prepareObjects (& $completerArguments) {
$this->prepareArraysAndObjects($completerArguments);
}
protected function prepareArraysAndObjects (& $completerArguments) {
list(
$keyColumnName, $keyType
) = $completerArguments;
$this->completerProps = (object) [
'keyColumnName' => $keyColumnName,
'keyType' => $keyType,
'retypeKey' => $keyType !== NULL,
'useRawKey' => $keyColumnName === NULL,
];
}
protected function prepareScalars (& $completerArguments) {
list(
$valueColumnName, $valueType, $keyColumnName, $keyType
) = $completerArguments;
$this->completerProps = (object) [
'valueColumnName' => $valueColumnName,
'valueType' => $valueType,
'keyColumnName' => $keyColumnName,
'keyType' => $keyType,
'retypeKey' => $keyType !== NULL,
'retypeValue' => $valueType !== NULL,
'useRawKey' => $keyColumnName === NULL,
];
}
protected function prepareAny (& $completerArguments) {
list(
$valueCompleter, $keyColumnName, $keyType
) = $completerArguments;
$this->completerProps = (object) [
'valueCompleter' => $valueCompleter,
'keyColumnName' => $keyColumnName,
'keyType' => $keyType,
'retypeKey' => $keyType !== NULL,
'useRawKey' => $keyColumnName === NULL,
];
}
protected function toInstances ($rawKey, & $rawRow) {
$props = $this->completerProps;
$itemKey = $props->useRawKey
? $rawKey
: $rawRow[$props->keyColumnName];
if ($props->retypeKey)
settype($itemKey, $props->keyType);
$item = $props->type->newInstanceWithoutConstructor();
$item->SetValues($rawRow, $props->readingFlags);
$this->resultKey = $itemKey;
$this->resultValue = $item;
}
protected function toArrays ($rawKey, & $rawRow) {
$props = $this->completerProps;
$itemKey = $props->useRawKey
? $rawKey
: $rawRow[$props->keyColumnName];
if ($props->retypeKey)
settype($itemKey, $props->keyType);
$this->resultKey = $itemKey;
$this->resultValue = & $rawRow;
}
protected function toObjects ($rawKey, & $rawRow) {
$props = $this->completerProps;
$itemKey = $props->useRawKey
? $rawKey
: $rawRow[$props->keyColumnName];
if ($props->retypeKey)
settype($itemKey, $props->keyType);
$this->resultKey = $itemKey;
$this->resultValue = (object) $rawRow;
}
protected function toScalars ($rawKey, & $rawRow) {
$props = $this->completerProps;
$itemKey = $props->useRawKey
? $rawKey
: $rawRow[$props->keyColumnName];
if ($props->retypeKey)
settype($itemKey, $props->keyType);
$itemValue = array_key_exists($props->valueColumnName, $rawRow)
? $rawRow[$props->valueColumnName]
: NULL;
if ($props->retypeValue)
settype($itemValue, $props->valueType);
$this->resultKey = $itemKey;
$this->resultValue = $itemValue;
}
protected function toAny ($rawKey, & $rawRow) {
$props = $this->completerProps;
$valueCompleter = $props->valueCompleter;
$itemKey = $props->useRawKey
? $rawKey
: $rawRow[$props->keyColumnName];
if ($props->retypeKey)
settype($itemKey, $props->keyType);
$this->resultKey = $itemKey;
$this->resultValue = $valueCompleter($rawRow, $rawKey);
}
public function rewind () {
$statementIsOpened = $this->GetStatement()->IsOpened();
if ($statementIsOpened === NULL && $this->index === NULL) {
$this->executeMethod->invoke($this->reader);
} else if ($this->index !== NULL) {
$this->GetStatement()->Close();
$this->executeMethod->invoke($this->reader);
}
$fetchResult = $this->providerStatement->fetch(\PDO::FETCH_ASSOC);
if ($fetchResult === FALSE) {
$this->Close();
} else {
$this->valid = TRUE;
$this->index = 0;
$this->{$this->completerMethod}($this->index, $fetchResult);
}
}
public function current () {
return $this->resultValue;
}
public function key () {
return $this->resultKey;
}
public function next () {
$fetchResult = $this->providerStatement->fetch(\PDO::FETCH_ASSOC);
if ($fetchResult === FALSE) {
$this->Close();
} else {
$this->index++;
$this->{$this->completerMethod}($this->index, $fetchResult);
}
}
public function valid () {
return $this->valid;
}
public function count () {
if ($this->index !== NULL && $this->valid === FALSE)
return $this->index + 1;
throw new \RuntimeException(
"The number of all items in the stream iterator is not ".
"available before all items are iterated. The number ".
"of iterator items is only available after the first ".
"iterator loop is executed."
);
}
}