Details

    • Type: Improvement Improvement
    • Status: Reopened
    • Priority: Minor Minor
    • Resolution: Unresolved
    • Affects Version/s: 2.0-ALPHA4
    • Fix Version/s: None
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None

      Description

      The TableGenerator Id Generator is not yet implemented, here is some code i came up with:

      class TableGenerator extends AbstractIdGenerator
      {
          private $_tableName;
          private $_sequenceName;
          private $_allocationSize;
          private $_nextValue;
          private $_maxValue;
      
          public function __construct($tableName, $sequenceName = 'default', $allocationSize = 10)
          {
              $this->_tableName = $tableName;
              $this->_sequenceName = $sequenceName;
              $this->_allocationSize = $allocationSize;
          }
      
          public function generate(EntityManager $em, $entity)
          {
              if ($this->_maxValue === null || $this->_nextValue == $this->_maxValue) {
                  // Allocate new values
                  $conn = $em->getConnection();
                  if ($conn->getTransactionNestingLevel() == 0) {
      
                      // use select for update
                      $sql = $conn->getDatabasePlatform()->getTableHiLoCurrentValSql($this->_tableName, $this->_sequenceName);
                      $currentLevel = $conn->fetchColumn($sql);
                      if ($currentLevel != null) {
                          $this->_nextValue = $currentLevel;
                          $this->_maxValue = $this->_nextValue + $this->_allocationSize;
      
                          $updateSql = $conn->getDatabasePlatform()->getTableHiLoUpdateNextValSql(
                              $this->_tableName, $this->_sequenceName, $this->_allocationSize
                          );
                          
                          if ($conn->executeUpdate($updateSql, array(1 => $currentLevel, 2 => $currentLevel+1)) !== 1) {
                              // no affected rows, concurrency issue, throw exception
                          }
                      } else {
                          // no current level returned, TableGenerator seems to be broken, throw exception
                      }
                  } else {
                      // only table locks help here, implement this or throw exception?
                      // or do we want to work with table locks exclusively?
                  }
              }
              return $this->_nextValue++;
          }
      }
      

        Issue Links

          Activity

            People

            • Assignee:
              Roman S. Borschel
              Reporter:
              Benjamin Eberlei
            • Votes:
              2 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: