original_string: public function addKey($key, $after=null) {
  
          // Detect duplicates first
          if ($this->getKey($key->getName())) {
              throw new coding_exception('Duplicate key '.$key->getName().' specified in table '.$this->getName());
          }
  
          // Make sure there are no indexes with the key column specs because they would collide.
          $newfields = $key->getFields();
          $allindexes = $this->getIndexes();
          foreach ($allindexes as $index) {
              $fields = $index->getFields();
              if ($fields === $newfields) {
                  throw new coding_exception('Index '.$index->getName().' collides with key'.$key->getName().' specified in table '.$this->getName());
              }
          }
  
          // Calculate the previous and next keys
          $prevkey = null;
          $nextkey = null;
  
          if (!$after) {
              $allkeys = $this->getKeys();
              if (!empty($allkeys)) {
                  end($allkeys);
                  $prevkey = $allkeys[key($allkeys)];
              }
          } else {
              $prevkey = $this->getKey($after);
          }
          if ($prevkey && $prevkey->getNext()) {
              $nextkey = $this->getKey($prevkey->getNext());
          }
  
          // Set current key previous and next attributes
          if ($prevkey) {
              $key->setPrevious($prevkey->getName());
              $prevkey->setNext($key->getName());
          }
          if ($nextkey) {
              $key->setNext($nextkey->getName());
              $nextkey->setPrevious($key->getName());
          }
          // Some more attributes
          $key->setLoaded(true);
          $key->setChanged(true);
          // Add the new key
          $this->keys[] = $key;
          // Reorder the keys
          $this->orderKeys($this->keys);
          // Recalculate the hash
          $this->calculateHash(true);
          // We have one new field, so the table has changed
          $this->setChanged(true);
      }
code: public function addKey($key, $after=null) {
  
          // Detect duplicates first
          if ($this->getKey($key->getName())) {
              throw new coding_exception('Duplicate key '.$key->getName().' specified in table '.$this->getName());
          }
  
          // Make sure there are no indexes with the key column specs because they would collide.
          $newfields = $key->getFields();
          $allindexes = $this->getIndexes();
          foreach ($allindexes as $index) {
              $fields = $index->getFields();
              if ($fields === $newfields) {
                  throw new coding_exception('Index '.$index->getName().' collides with key'.$key->getName().' specified in table '.$this->getName());
              }
          }
  
          // Calculate the previous and next keys
          $prevkey = null;
          $nextkey = null;
  
          if (!$after) {
              $allkeys = $this->getKeys();
              if (!empty($allkeys)) {
                  end($allkeys);
                  $prevkey = $allkeys[key($allkeys)];
              }
          } else {
              $prevkey = $this->getKey($after);
          }
          if ($prevkey && $prevkey->getNext()) {
              $nextkey = $this->getKey($prevkey->getNext());
          }
  
          // Set current key previous and next attributes
          if ($prevkey) {
              $key->setPrevious($prevkey->getName());
              $prevkey->setNext($key->getName());
          }
          if ($nextkey) {
              $key->setNext($nextkey->getName());
              $nextkey->setPrevious($key->getName());
          }
          // Some more attributes
          $key->setLoaded(true);
          $key->setChanged(true);
          // Add the new key
          $this->keys[] = $key;
          // Reorder the keys
          $this->orderKeys($this->keys);
          // Recalculate the hash
          $this->calculateHash(true);
          // We have one new field, so the table has changed
          $this->setChanged(true);
      }
code_tokens: public function addKey ( $ key , $ after = null ) { // Detect duplicates first if ( $ this -> getKey ( $ key -> getName ( ) ) ) { throw new coding_exception ( 'Duplicate key ' . $ key -> getName ( ) . ' specified in table ' . $ this -> getName ( ) ) ; } // Make sure there are no indexes with the key column specs because they would collide. $ newfields = $ key -> getFields ( ) ; $ allindexes = $ this -> getIndexes ( ) ; foreach ( $ allindexes as $ index ) { $ fields = $ index -> getFields ( ) ; if ( $ fields === $ newfields ) { throw new coding_exception ( 'Index ' . $ index -> getName ( ) . ' collides with key' . $ key -> getName ( ) . ' specified in table ' . $ this -> getName ( ) ) ; } } // Calculate the previous and next keys $ prevkey = null ; $ nextkey = null ; if ( ! $ after ) { $ allkeys = $ this -> getKeys ( ) ; if ( ! empty ( $ allkeys ) ) { end ( $ allkeys ) ; $ prevkey = $ allkeys [ key ( $ allkeys ) ] ; } } else { $ prevkey = $ this -> getKey ( $ after ) ; } if ( $ prevkey && $ prevkey -> getNext ( ) ) { $ nextkey = $ this -> getKey ( $ prevkey -> getNext ( ) ) ; } // Set current key previous and next attributes if ( $ prevkey ) { $ key -> setPrevious ( $ prevkey -> getName ( ) ) ; $ prevkey -> setNext ( $ key -> getName ( ) ) ; } if ( $ nextkey ) { $ key -> setNext ( $ nextkey -> getName ( ) ) ; $ nextkey -> setPrevious ( $ key -> getName ( ) ) ; } // Some more attributes $ key -> setLoaded ( true ) ; $ key -> setChanged ( true ) ; // Add the new key $ this -> keys [ ] = $ key ; // Reorder the keys $ this -> orderKeys ( $ this -> keys ) ; // Recalculate the hash $ this -> calculateHash ( true ) ; // We have one new field, so the table has changed $ this -> setChanged ( true ) ; }
docstring: Add one key to the table, allowing to specify the desired  order
  If it's not specified, then the key is added at the end
  @param xmldb_key $key
  @param xmldb_object $after
docstring_tokens: Add one key to the table allowing to specify the desired order If it s not specified then the key is added at the end