Changeset 628

Show
Ignore:
Timestamp:
10/31/07 22:47:15 (1 year ago)
Author:
laurentj
Message:

fixed bug #11: autoincremented fields and calculated field other than primary keys where not updated in the record object, when it is inserted into the database

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lib/jelix-modules/junittests/classes/junittestcasedb.class.php

    r462 r628  
    125125            $ok=false; 
    126126            foreach($results as $k=>$res){ 
    127                 if($res ==  $rec){ 
     127                $sameValues = true; 
     128                foreach($rec as $name=>$value){ 
     129                    if($res[$name] != $value) { 
     130                        $sameValues = false; 
     131                        break; 
     132                    } 
     133                } 
     134 
     135                if($sameValues){ 
    128136                    unset($results[$k]); 
    129137                    $ok = true; 
  • trunk/lib/jelix-modules/junittests/classes/junittestcasedb.class.php

    r462 r628  
    125125            $ok=false; 
    126126            foreach($results as $k=>$res){ 
    127                 if($res ==  $rec){ 
     127                $sameValues = true; 
     128                foreach($rec as $name=>$value){ 
     129                    if($res[$name] != $value) { 
     130                        $sameValues = false; 
     131                        break; 
     132                    } 
     133                } 
     134 
     135                if($sameValues){ 
    128136                    unset($results[$k]); 
    129137                    $ok = true; 
  • trunk/lib/jelix/dao/jDaoGenerator.class.php

    r622 r628  
    174174 
    175175      if($pkai !== null){ 
    176          $src[] = '   if($result){'; 
    177          $src[] = '      if($record->'.$pkai->name.' < 1 ) '; 
     176         $src[] = '   if(!$result)'; 
     177         $src[] = '       return false;'; 
     178 
     179         $src[] = '   if($record->'.$pkai->name.' < 1 ) '; 
    178180         $src[] = $this->genUpdateAutoIncrementPK($pkai, $pTableRealName); 
    179          $src[] = '      return $result;'; 
    180          $src[] = '   }else return false;'; 
    181       }else{ 
    182          $src[] = '    return $result;'; 
    183       } 
     181      } 
     182 
     183      // we generate a SELECT query to update field on the record object, which are autoincrement or calculated 
     184      $fields = $this->_getPropertiesBy('FieldToUpdate'); 
     185      if (count($fields)) { 
     186        $result = array(); 
     187        foreach ($fields as $id=>$prop){ 
     188            $result[]= $this->genSelectPattern($prop->selectPattern, '', $prop->fieldName, $prop->name); 
     189        } 
     190 
     191        $sql = 'SELECT '.(implode (', ',$result)). ' FROM '.$pTableRealNameEsc.' WHERE '; 
     192        $sql.= $this->_buildSimpleConditions($pkFields, 'record->', false); 
     193 
     194        $src[] = '  $query =\''.$sql.'\';'; 
     195        $src[] = '  $rs  =  $this->_conn->query ($query);'; 
     196        $src[] = '  $newrecord =  $rs->fetch ();'; 
     197        foreach ($fields as $id=>$prop){ 
     198            $src[] = '  $record->'.$prop->name.' = $newrecord->'.$prop->name.';'; 
     199        } 
     200      } 
     201      $src[] = '    return $result;'; 
    184202      $src[] = '}'; 
    185  
    186  
    187203 
    188204      //-----  update method 
     
    503519        return ($field->table == $this->_datasParser->getPrimaryTable()); 
    504520    } 
     521 
    505522    protected function _captureAll(&$field){ 
    506523        return true; 
    507524    } 
     525 
     526    protected function _captureFieldToUpdate(&$field){ 
     527        return ($field->table == $this->_datasParser->getPrimaryTable() 
     528                && !$field->isPK 
     529                && !$field->isFK 
     530                && ( $field->datatype == 'autoincrement' || $field->datatype == 'bigautoincrement' 
     531                    || ($field->insertPattern != '%s' && $field->selectPattern != ''))); 
     532    } 
     533 
    508534 
    509535 
     
    813839 
    814840    protected function genUpdateAutoIncrementPK($pkai, $pTableRealName) { 
    815         return '      if($record->'.$pkai->name.' < 1  ) $record->'.$pkai->name.'= $this->_conn->lastInsertId();'; 
     841        return '      $record->'.$pkai->name.'= $this->_conn->lastInsertId();'; 
    816842    } 
    817843 
  • trunk/lib/jelix/dao/jDaoGenerator.class.php

    r622 r628  
    174174 
    175175      if($pkai !== null){ 
    176          $src[] = '   if($result){'; 
    177          $src[] = '      if($record->'.$pkai->name.' < 1 ) '; 
     176         $src[] = '   if(!$result)'; 
     177         $src[] = '       return false;'; 
     178 
     179         $src[] = '   if($record->'.$pkai->name.' < 1 ) '; 
    178180         $src[] = $this->genUpdateAutoIncrementPK($pkai, $pTableRealName); 
    179          $src[] = '      return $result;'; 
    180          $src[] = '   }else return false;'; 
    181       }else{ 
    182          $src[] = '    return $result;'; 
    183       } 
     181      } 
     182 
     183      // we generate a SELECT query to update field on the record object, which are autoincrement or calculated 
     184      $fields = $this->_getPropertiesBy('FieldToUpdate'); 
     185      if (count($fields)) { 
     186        $result = array(); 
     187        foreach ($fields as $id=>$prop){ 
     188            $result[]= $this->genSelectPattern($prop->selectPattern, '', $prop->fieldName, $prop->name); 
     189        } 
     190 
     191        $sql = 'SELECT '.(implode (', ',$result)). ' FROM '.$pTableRealNameEsc.' WHERE '; 
     192        $sql.= $this->_buildSimpleConditions($pkFields, 'record->', false); 
     193 
     194        $src[] = '  $query =\''.$sql.'\';'; 
     195        $src[] = '  $rs  =  $this->_conn->query ($query);'; 
     196        $src[] = '  $newrecord =  $rs->fetch ();'; 
     197        foreach ($fields as $id=>$prop){ 
     198            $src[] = '  $record->'.$prop->name.' = $newrecord->'.$prop->name.';'; 
     199        } 
     200      } 
     201      $src[] = '    return $result;'; 
    184202      $src[] = '}'; 
    185  
    186  
    187203 
    188204      //-----  update method 
     
    503519        return ($field->table == $this->_datasParser->getPrimaryTable()); 
    504520    } 
     521 
    505522    protected function _captureAll(&$field){ 
    506523        return true; 
    507524    } 
     525 
     526    protected function _captureFieldToUpdate(&$field){ 
     527        return ($field->table == $this->_datasParser->getPrimaryTable() 
     528                && !$field->isPK 
     529                && !$field->isFK 
     530                && ( $field->datatype == 'autoincrement' || $field->datatype == 'bigautoincrement' 
     531                    || ($field->insertPattern != '%s' && $field->selectPattern != ''))); 
     532    } 
     533 
    508534 
    509535 
     
    813839 
    814840    protected function genUpdateAutoIncrementPK($pkai, $pTableRealName) { 
    815         return '      if($record->'.$pkai->name.' < 1  ) $record->'.$pkai->name.'= $this->_conn->lastInsertId();'; 
     841        return '      $record->'.$pkai->name.'= $this->_conn->lastInsertId();'; 
    816842    } 
    817843 
  • trunk/testapp/modules/jelix_tests/daos/products.dao.xml

    r576 r628  
    88      <property name="name" fieldname="name" datatype="string"  required="true"/> 
    99      <property name="price" fieldname="price" datatype="float"/> 
     10      <property name="create_date" fieldname="create_date" datatype="datetime" insertpattern="NOW()"/> 
    1011   </record> 
    1112</dao> 
  • trunk/testapp/modules/jelix_tests/daos/products.dao.xml

    r576 r628  
    88      <property name="name" fieldname="name" datatype="string"  required="true"/> 
    99      <property name="price" fieldname="price" datatype="float"/> 
     10      <property name="create_date" fieldname="create_date" datatype="datetime" insertpattern="NOW()"/> 
    1011   </record> 
    1112</dao> 
  • trunk/testapp/modules/jelix_tests/tests/jdao.main_api.html.php

    r483 r628  
    8282        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    8383        $this->assertNotEqual($this->prod1->id, '', 'jDaoBase::insert : id not set'); 
     84        $this->assertNotEqual($this->prod1->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    8485 
    8586        $this->prod2 = jDao::createRecord ('products'); 
     
    9091        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    9192        $this->assertNotEqual($this->prod2->id, '', 'jDaoBase::insert : id not set'); 
     93        $this->assertNotEqual($this->prod2->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    9294 
    9395        $this->prod3 = jDao::createRecord ('products'); 
     
    98100        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    99101        $this->assertNotEqual($this->prod3->id, '', 'jDaoBase::insert : id not set'); 
    100  
     102        $this->assertNotEqual($this->prod3->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    101103 
    102104        $this->records = array( 
  • trunk/testapp/modules/jelix_tests/tests/jdao.main_api.html.php

    r483 r628  
    8282        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    8383        $this->assertNotEqual($this->prod1->id, '', 'jDaoBase::insert : id not set'); 
     84        $this->assertNotEqual($this->prod1->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    8485 
    8586        $this->prod2 = jDao::createRecord ('products'); 
     
    9091        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    9192        $this->assertNotEqual($this->prod2->id, '', 'jDaoBase::insert : id not set'); 
     93        $this->assertNotEqual($this->prod2->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    9294 
    9395        $this->prod3 = jDao::createRecord ('products'); 
     
    98100        $this->assertEqual($res, 1, 'jDaoBase::insert does not return 1'); 
    99101        $this->assertNotEqual($this->prod3->id, '', 'jDaoBase::insert : id not set'); 
    100  
     102        $this->assertNotEqual($this->prod3->create_date, '', 'jDaoBase::insert : create_date not updated'); 
    101103 
    102104        $this->records = array( 
Download in other formats: Unified Diff Zip Archive