11<?php
22namespace Kir \MySQL \Builder ;
33
4+ use Generator ;
5+ use Kir \MySQL \Builder \Helpers \FieldTypeProvider ;
6+ use Kir \MySQL \Builder \Helpers \FieldValueConverter ;
7+ use Kir \MySQL \Builder \Helpers \LazyRowGenerator ;
8+
49/**
510 */
611class RunnableSelect extends Select {
@@ -55,9 +60,9 @@ public function fetchRows(\Closure $callback = null) {
5560 $ statement = $ this ->createStatement ();
5661 $ data = $ statement ->fetchAll (\PDO ::FETCH_ASSOC );
5762 if ($ this ->preserveTypes ) {
58- $ columnDefinitions = $ this -> getFieldTypes ($ statement );
63+ $ columnDefinitions = FieldTypeProvider:: getFieldTypes ($ statement );
5964 foreach ($ data as &$ row ) {
60- $ row = $ this -> convertValues ($ row , $ columnDefinitions );
65+ $ row = FieldValueConverter:: convertValues ($ row , $ columnDefinitions );
6166 }
6267 }
6368 if ($ callback !== null ) {
@@ -67,6 +72,19 @@ public function fetchRows(\Closure $callback = null) {
6772 return $ data ;
6873 }
6974
75+ /**
76+ * @param \Closure $callback
77+ * @return array[]|Generator
78+ */
79+ public function fetchRowsLazy (\Closure $ callback = null ) {
80+ if (version_compare (PHP_VERSION , '5.5 ' , '<= ' )) {
81+ return $ this ->fetchRows ($ callback );
82+ }
83+ $ statement = $ this ->createStatement ();
84+ $ generator = new LazyRowGenerator ($ this ->preserveTypes );
85+ return $ generator ->generate ($ statement , $ callback );
86+ }
87+
7088 /**
7189 * @return string[]
7290 */
@@ -78,8 +96,8 @@ public function fetchRow() {
7896 return array ();
7997 }
8098 if ($ this ->preserveTypes ) {
81- $ columnDefinitions = $ this -> getFieldTypes ($ statement );
82- $ row = $ this -> convertValues ($ row , $ columnDefinitions );
99+ $ columnDefinitions = FieldTypeProvider:: getFieldTypes ($ statement );
100+ $ row = FieldValueConverter:: convertValues ($ row , $ columnDefinitions );
83101 }
84102 $ statement ->closeCursor ();
85103 return $ row ;
@@ -174,68 +192,4 @@ private function createStatement() {
174192 }
175193 return $ statement ;
176194 }
177-
178- /**
179- * @param QueryStatement $statement
180- * @return array
181- */
182- private function getFieldTypes ($ statement ) {
183- $ c = $ statement ->columnCount ();
184- $ fieldTypes = array ();
185- for ($ i =0 ; $ i <$ c +20 ; $ i ++) {
186- $ column = $ statement ->getColumnMeta ($ i );
187- $ fieldTypes [$ column ['name ' ]] = $ this ->getTypeFromNativeType ($ column ['native_type ' ]);
188- }
189- return $ fieldTypes ;
190- }
191-
192- /**
193- * @param string $type
194- * @return string
195- */
196- private function getTypeFromNativeType ($ type ) {
197- switch ($ type ) {
198- case 'NEWDECIMAL ' :
199- case 'DECIMAL ' :
200- case 'FLOAT ' :
201- case 'DOUBLE ' :
202- return 'f ' ;
203- case 'TINY ' :
204- case 'SHORT ' :
205- case 'LONG ' :
206- case 'LONGLONG ' :
207- case 'INT24 ' :
208- return 'i ' ;
209- }
210- return $ type ;
211- }
212-
213- /**
214- * @param array $row
215- * @param array $columnDefinitions
216- * @return mixed
217- */
218- private function convertValues (array $ row , array $ columnDefinitions ) {
219- foreach ($ row as $ key => &$ value ) {
220- if ($ value !== null ) {
221- $ value = $ this ->convertValue ($ value , $ columnDefinitions [$ key ]);
222- }
223- }
224- return $ row ;
225- }
226-
227- /**
228- * @param mixed $value
229- * @param string $type
230- * @return mixed
231- */
232- private function convertValue ($ value , $ type ) {
233- switch ($ type ) {
234- case 'i ' :
235- return (int ) $ value ;
236- case 'f ' :
237- return (float ) $ value ;
238- }
239- return $ value ;
240- }
241195}
0 commit comments