Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
db_extras.inc
1 <?php
53 function db_extras_subquery(&$db, $sql, $subs, $default_value=null)
54 {
55 
56  switch ($db->phptype) {
57  // Sub-query compatible DB's
58  case 'pgsql':
59  case 'oci8':
60 
61  $find = Array();
62  for ($i = 0; $i < count($subs); $i++) {
63  $find[] = '~SQ'.$i.'~';
64  }
65 
66  $sql = str_replace($find, $subs, $sql);
67  return $sql;
68 
69  break;
70 
71  // Non-compatible DB's (...none now MySQL is not supported)
72  default:
73 
74  $find = Array();
75  $replace = Array();
76  for ($i = 0; $i < count($subs); $i++) {
77  $find[$i] = '~SQ'.$i.'~';
78 
79  $result = MatrixDAL::executeSqlAssoc($subs[$i], 0);
80 
81  $replace[$i] = '';
82  for ($j = 0, $total= count($result); $j < $total; $j++) {
83  $replace[$i] .= (($replace[$i]) ? ',' : '').MatrixDAL::quote($result[$j]);
84  }
85 
86  if ($replace[$i] == '') $replace[$i] = MatrixDAL::quote($default_value);
87 
88  }//end for
89 
90  $sql = str_replace($find, $replace, $sql);
91  return $sql;
92 
93  }//end switch
94 
95 }//end db_extras_subquery()
96 
97 
112 function db_extras_insert_select(&$db, $insert, $select)
113 {
114 
115  switch ($db->phptype) {
116  // INSERT INTO ... SELECT FROM Compatible DB's
117  case 'pgsql' :
118  case 'oci8' :
119 
120  $result = MatrixDAL::executeSql($insert.' '.$select);
121  if (DB::isError($result)) return $result;
122  return TRUE;
123 
124  break;
125 
126  // Non Compatible DB's
127  default :
128  // ??? A bit difficult with
129  $select_result = $db->query($select);
130  if (DB::isError($select_result)) return $select_result;
131 
132  $row = Array();
133  while (DB_OK === $select_result->fetchInto($row, DB_FETCHMODE_ORDERED)) {
134  $field_total = count($row);
135  if (!$field_total) continue;
136  $sql = $insert.' VALUES (';
137  for ($j = 0; $j < $field_total; $j++) {
138  $sql .= (($j) ? ',' : '').MatrixDAL::quote($row[$j]);
139  }
140  $sql .= ')';
141 
142  $insert_result = $db->query($sql);
143  if (DB::isError($insert_result)) {
144  $select_result->free();
145  return $insert_result;
146  }
147  }
148  $select_result->free();
149 
150  return TRUE;
151 
152  }//end switch
153 
154 }//end db_extras_insert_select()
155 
156 
174 function db_extras_bitand($db_type, $val1, $val2)
175 {
176  if ((int) $val1 != $val1) $val1 = MatrixDAL::quote($val1);
177  if ((int) $val2 != $val2) $val2 = MatrixDAL::quote($val2);
178 
179  if ($db_type == 'oci') {
180  $bit_op = 'BITAND('.$val1.', '.$val2.')';
181  } else {
182  $bit_op = '('.$val1.' & '.$val2.')';
183  }
184 
185  return $bit_op;
186 
187 }//end db_extras_bitand()
188 
189 
202 function db_extras_todate($db_type, $iso8601_date, $add_quotes=TRUE)
203 {
204  // TODO:
205  if ($add_quotes === TRUE) {
206  $iso8601_date = '\''.$iso8601_date.'\'';
207  }
208 
209  if ($db_type == 'pgsql') {
210  return 'TO_TIMESTAMP('.$iso8601_date.', \'YYYY-MM-DD HH24:MI:SS\')';
211  } else if ($db_type == 'oci') {
212  return 'TO_DATE('.$iso8601_date.',\'YYYY-MM-DD HH24:MI:SS\')';
213  }
214 
215 }//end db_extras_todate()
216 
217 
226 function db_extras_prepare_todate($db_type)
227 {
228  if ($db_type == 'pgsql') {
229  return 'TO_TIMESTAMP(?, ?)';
230  } else if ($db_type == 'oci8') {
231  return 'TO_DATE(?, ?)';
232  }
233 
234 }//end db_extras_prepare_todate()
235 
236 
248 function db_get_function_result($db_type, $sql, $bind_vars=Array())
249 {
250  $db = MatrixDAL::getDb();
251  $result = NULL;
252 
253  if ($db_type == 'pgsql') {
254  $sql = 'SELECT '.$sql;
255  $query = MatrixDAL::preparePdoQuery($sql);
256  foreach ($bind_vars as $key => $value) {
257  MatrixDAL::bindValueToPdo($query, $key, $value);
258  }
259  $result = MatrixDAL::executePdoOne($query);
260 
261  } else if ($db_type == 'oci') {
262  // the reason that we don't do 'SELECT function() from DUAL' here is that
263  // if the function peforms any DML operations, we will get an error that
264  // you cannot perform DML operations from within a select query.
265  $sql = 'BEGIN :res := '.$sql.'; END;';
266 
267  try {
268  $query = MatrixDAL::preparePdoQuery($sql);
269  MatrixDAL::bindValueToPdoByRef($query, 'res', $result, PDO::PARAM_INPUT_OUTPUT, 4000);
270 
271  // Bind the other variables for input only
272  foreach ($bind_vars as $key => $value) {
273  MatrixDAL::bindValueToPdo($query, $key, $value);
274  }
275 
276  MatrixDAL::execPdoQuery($query);
277  } catch (Exception $e) {
278  throw new Exception('Could not run function due to database error: '.$e->getMessage());
279  }
280 
281  }
282  return $result;
283 
284 }//end db_get_function_result()
285 
286 
299 function db_extras_modify_limit_clause($sql, $db_type, $limit, $offset=0)
300 {
301  if ($db_type == 'oci') {
302  if ($offset > 0) {
303  $inner_sql = 'SELECT original_query.*, rownum rnum FROM (' . $sql . ') original_query WHERE rownum <= ' . ($offset + $limit);
304  $sql = 'SELECT * FROM (' . $inner_sql . ') WHERE rnum > ' . $offset;
305  } else {
306  $sql = 'SELECT * FROM ('.$sql.')';
307  $sql .= ' WHERE ROWNUM BETWEEN 0 AND '.$limit;
308  }
309  } else { // psql, db2, mysql
310  $sql = $sql.' LIMIT '.$limit.' OFFSET '.$offset;
311  }
312 
313  return $sql;
314 
315 }//end db_modify_limit_clause()
316 
317 
318 ?>