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

          Hide
          Benjamin Eberlei added a comment -

          Schema-Tool support is also missing.

          Show
          Benjamin Eberlei added a comment - Schema-Tool support is also missing.
          Hide
          Benjamin Eberlei added a comment -

          But it is not enabled yet Plus we need tests to verify this works in high concurrency enviroments and does not pass the same id twice.

          Furthermore the DAtabase Platform Methods are completly missing. No implementations yet.

          Show
          Benjamin Eberlei added a comment - But it is not enabled yet Plus we need tests to verify this works in high concurrency enviroments and does not pass the same id twice. Furthermore the DAtabase Platform Methods are completly missing. No implementations yet.
          Hide
          Guilherme Blanco added a comment -

          Already merged into core.

          Show
          Guilherme Blanco added a comment - Already merged into core.

            People

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

              Dates

              • Created:
                Updated: