@@ -56,19 +56,19 @@ public function setPreserveTypes($preserveTypes = true) {
56
56
* @return array[]
57
57
*/
58
58
public function fetchRows (\Closure $ callback = null ) {
59
- $ statement = $ this ->createStatement ();
60
- $ data = $ statement ->fetchAll (\PDO ::FETCH_ASSOC );
61
- if ($ this ->preserveTypes ) {
62
- $ columnDefinitions = FieldTypeProvider::getFieldTypes ($ statement );
63
- foreach ($ data as &$ row ) {
64
- $ row = FieldValueConverter::convertValues ($ row , $ columnDefinitions );
59
+ return $ this ->createTempStatement (function (QueryStatement $ statement ) use ($ callback ) {
60
+ $ data = $ statement ->fetchAll (\PDO ::FETCH_ASSOC );
61
+ if ($ this ->preserveTypes ) {
62
+ $ columnDefinitions = FieldTypeProvider::getFieldTypes ($ statement );
63
+ foreach ($ data as &$ row ) {
64
+ $ row = FieldValueConverter::convertValues ($ row , $ columnDefinitions );
65
+ }
65
66
}
66
- }
67
- if ($ callback !== null ) {
68
- $ data = array_map ($ callback , $ data );
69
- }
70
- $ statement ->closeCursor ();
71
- return $ data ;
67
+ if ($ callback !== null ) {
68
+ $ data = array_map ($ callback , $ data );
69
+ }
70
+ return $ data ;
71
+ });
72
72
}
73
73
74
74
/**
@@ -88,39 +88,36 @@ public function fetchRowsLazy(\Closure $callback = null) {
88
88
* @return string[]
89
89
*/
90
90
public function fetchRow () {
91
- $ statement = $ this ->createStatement ();
92
- $ row = $ statement ->fetch (\PDO ::FETCH_ASSOC );
93
- if (!is_array ($ row )) {
94
- $ statement ->closeCursor ();
95
- return array ();
96
- }
97
- if ($ this ->preserveTypes ) {
98
- $ columnDefinitions = FieldTypeProvider::getFieldTypes ($ statement );
99
- $ row = FieldValueConverter::convertValues ($ row , $ columnDefinitions );
100
- }
101
- $ statement ->closeCursor ();
102
- return $ row ;
91
+ return $ this ->createTempStatement (function (QueryStatement $ statement ) {
92
+ $ row = $ statement ->fetch (\PDO ::FETCH_ASSOC );
93
+ if (!is_array ($ row )) {
94
+ return array ();
95
+ }
96
+ if ($ this ->preserveTypes ) {
97
+ $ columnDefinitions = FieldTypeProvider::getFieldTypes ($ statement );
98
+ $ row = FieldValueConverter::convertValues ($ row , $ columnDefinitions );
99
+ }
100
+ return $ row ;
101
+ });
103
102
}
104
103
105
104
/**
106
105
* @param bool $treatValueAsArray
107
106
* @return mixed[]
108
107
*/
109
108
public function fetchKeyValue ($ treatValueAsArray = false ) {
110
- $ rows = $ this ->fetchRows ();
111
- $ result = array ();
112
- if (!$ treatValueAsArray ) {
113
- foreach ($ rows as $ row ) {
114
- list ($ key , $ value ) = array_values ($ row );
115
- $ result [$ key ] = $ value ;
116
- }
117
- } else {
118
- foreach ($ rows as $ row ) {
119
- list ($ key ) = array_values ($ row );
120
- $ result [$ key ] = $ row ;
109
+ return $ this ->createTempStatement (function (QueryStatement $ statement ) use ($ treatValueAsArray ) {
110
+ if ($ treatValueAsArray ) {
111
+ $ rows = $ statement ->fetchAll (\PDO ::FETCH_ASSOC );
112
+ $ result = array ();
113
+ foreach ($ rows as $ row ) {
114
+ list ($ key ) = array_values ($ row );
115
+ $ result [$ key ] = $ row ;
116
+ }
117
+ return $ result ;
121
118
}
122
- }
123
- return $ result ;
119
+ return $ statement -> fetchAll (\ PDO :: FETCH_KEY_PAIR );
120
+ }) ;
124
121
}
125
122
126
123
/**
@@ -148,9 +145,8 @@ public function fetchGroups(array $fields) {
148
145
* @return string[]
149
146
*/
150
147
public function fetchArray () {
151
- return $ this ->fetchRows (function ($ row ) {
152
- reset ($ row );
153
- return current ($ row );
148
+ return $ this ->createTempStatement (function (QueryStatement $ stmt ) {
149
+ return $ stmt ->fetchAll (\PDO ::FETCH_COLUMN );
154
150
});
155
151
}
156
152
@@ -159,16 +155,13 @@ public function fetchArray() {
159
155
* @return null|bool|string|int|float
160
156
*/
161
157
public function fetchValue ($ default = null ) {
162
- $ statement = $ this ->createStatement ();
163
- $ row = $ statement ->fetch (\PDO ::FETCH_ASSOC );
164
- $ statement ->closeCursor ();
165
- if (!is_array ($ row )) {
158
+ return $ this ->createTempStatement (function (QueryStatement $ stmt ) use ($ default ) {
159
+ $ result = $ stmt ->fetch (\PDO ::FETCH_NUM );
160
+ if ($ result !== false ) {
161
+ return $ result [0 ];
162
+ }
166
163
return $ default ;
167
- }
168
- if (!count ($ row )) {
169
- return null ;
170
- }
171
- return array_shift ($ row );
164
+ });
172
165
}
173
166
174
167
/**
@@ -178,6 +171,24 @@ public function getFoundRows() {
178
171
return $ this ->foundRows ;
179
172
}
180
173
174
+ /**
175
+ * @param callback $fn
176
+ * @return mixed
177
+ * @throws \Exception
178
+ */
179
+ private function createTempStatement ($ fn ) {
180
+ $ stmt = $ this ->createStatement ();
181
+ $ res = null ;
182
+ try {
183
+ $ res = call_user_func ($ fn , $ stmt );
184
+ } catch (\Exception $ e ) { // PHP 5.4 compatibility
185
+ $ stmt ->closeCursor ();
186
+ throw $ e ;
187
+ }
188
+ $ stmt ->closeCursor ();
189
+ return $ res ;
190
+ }
191
+
181
192
/**
182
193
* @return QueryStatement
183
194
*/
0 commit comments