update for installations with PGSQL < 9.1 fails
authorLars Kneschke <l.kneschke@metaways.de>
Tue, 3 Feb 2015 08:33:09 +0000 (09:33 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Tue, 3 Feb 2015 14:23:19 +0000 (15:23 +0100)
- left function is not evailable for PGSQL < 9.1
- do the length calculation in PHP
- create the needed SQL query with Zend_Db_Select

Change-Id: I8de7ded086b7674d87da072da2424ee2bce35f16
Reviewed-on: http://gerrit.tine20.com/customers/1600
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Setup/Update/Abstract.php

index 0b453cc..90d93d6 100644 (file)
@@ -280,19 +280,22 @@ class Setup_Update_Abstract
      */
     public function shortenTextValues($table, $field, $length)
     {
-        $results = $this->_db->query(
-            "SELECT " . $this->_db->quoteIdentifier($field) .
-            ", LEFT(" . $this->_db->quoteIdentifier($field) . "," . $length . ") AS short" .
-            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . $table) .
-            " WHERE CHAR_LENGTH(" . $this->_db->quoteIdentifier($field) . ") > " . $length
-            )->fetchAll();
+        $select = $this->_db->select()
+            ->from(array($table => SQL_TABLE_PREFIX . $table), array($field))
+            ->where("CHAR_LENGTH(" . $this->_db->quoteIdentifier($field) . ") > ?", $length);
+        
+        $stmt = $this->_db->query($select);
+        $results = $stmt->fetchAll();
+        $stmt->closeCursor();
         
         foreach ($results as $result) {
-            $where  = array(
-                $this->_db->quoteInto($this->_db->quoteIdentifier($field) . ' = ?', $result[$field]),
+            $where = array(
+                array($this->_db->quoteIdentifier($field) . ' = ?' => $result[$field])
             );
             
-            $newContent = array($field => $result['short']);
+            $newContent = array(
+                $field => iconv_substr($result[$field], 0 , $length, 'UTF-8')
+            );
             
             try {
                 $this->_db->update(SQL_TABLE_PREFIX . $table, $newContent, $where);