Example #1
0
 /**
  * _authenticateValidateResult() - This method attempts to validate that
  * the record in the resultset is indeed a record that matched the
  * identity provided to this adapter.
  *
  * @param array $resultIdentity
  * @return Zend_Auth_Result
  */
 protected function _authenticateValidateResult($resultIdentity)
 {
     $zendAuthCredentialMatchColumn = $this->_zendDb->foldCase('zend_auth_credential_match');
     if ($resultIdentity[$zendAuthCredentialMatchColumn] != '1') {
         $this->_authenticateResultInfo['code'] = Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID;
         $this->_authenticateResultInfo['messages'][] = 'Supplied credential is invalid.';
         return $this->_authenticateCreateAuthResult();
     }
     unset($resultIdentity[$zendAuthCredentialMatchColumn]);
     $this->_resultRow = $resultIdentity;
     $this->_authenticateResultInfo['code'] = Zend_Auth_Result::SUCCESS;
     $this->_authenticateResultInfo['messages'][] = 'Authentication successful.';
     return $this->_authenticateCreateAuthResult();
 }
Example #2
0
 /**
  * DB2 catalog lookup for describe table
  *
  * @param string $tableName
  * @param string $schemaName OPTIONAL
  * @return array
  */
 public function describeTable($tableName, $schemaName = null)
 {
     $sql = "SELECT DISTINCT c.tabschema, c.tabname, c.colname, c.colno,\n                c.typename, c.default, c.nulls, c.length, c.scale,\n                c.identity, tc.type AS tabconsttype, k.colseq\n                FROM syscat.columns c\n                LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc\n                 ON (k.tabschema = tc.tabschema\n                   AND k.tabname = tc.tabname\n                   AND tc.type = 'P'))\n                 ON (c.tabschema = k.tabschema\n                 AND c.tabname = k.tabname\n                 AND c.colname = k.colname)\n            WHERE " . $this->_adapter->quoteInto('UPPER(c.tabname) = UPPER(?)', $tableName);
     if ($schemaName) {
         $sql .= $this->_adapter->quoteInto(' AND UPPER(c.tabschema) = UPPER(?)', $schemaName);
     }
     $sql .= " ORDER BY c.colno";
     $desc = array();
     $stmt = $this->_adapter->query($sql);
     /**
      * To avoid case issues, fetch using FETCH_NUM
      */
     $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
     /**
      * The ordering of columns is defined by the query so we can map
      * to variables to improve readability
      */
     $tabschema = 0;
     $tabname = 1;
     $colname = 2;
     $colno = 3;
     $typename = 4;
     $default = 5;
     $nulls = 6;
     $length = 7;
     $scale = 8;
     $identityCol = 9;
     $tabconstype = 10;
     $colseq = 11;
     foreach ($result as $key => $row) {
         list($primary, $primaryPosition, $identity) = array(false, null, false);
         if ($row[$tabconstype] == 'P') {
             $primary = true;
             $primaryPosition = $row[$colseq];
         }
         /**
          * In IBM DB2, an column can be IDENTITY
          * even if it is not part of the PRIMARY KEY.
          */
         if ($row[$identityCol] == 'Y') {
             $identity = true;
         }
         $desc[$this->_adapter->foldCase($row[$colname])] = array('SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), 'COLUMN_POSITION' => $row[$colno] + 1, 'DATA_TYPE' => $row[$typename], 'DEFAULT' => $row[$default], 'NULLABLE' => (bool) ($row[$nulls] == 'Y'), 'LENGTH' => $row[$length], 'SCALE' => $row[$scale], 'PRECISION' => $row[$typename] == 'DECIMAL' ? $row[$length] : 0, 'UNSIGNED' => false, 'PRIMARY' => $primary, 'PRIMARY_POSITION' => $primaryPosition, 'IDENTITY' => $identity);
     }
     return $desc;
 }
Example #3
0
 /**
  * IDS catalog lookup for describe table
  *
  * @param string $tableName
  * @param string $schemaName OPTIONAL
  * @return array
  */
 public function describeTable($tableName, $schemaName = null)
 {
     // this is still a work in progress
     $sql = "SELECT DISTINCT t.owner, t.tabname, c.colname, c.colno, c.coltype,\n               d.default, c.collength, t.tabid\n               FROM syscolumns c\n               JOIN systables t ON c.tabid = t.tabid\n               LEFT JOIN sysdefaults d ON c.tabid = d.tabid AND c.colno = d.colno\n               WHERE " . $this->_adapter->quoteInto('UPPER(t.tabname) = UPPER(?)', $tableName);
     if ($schemaName) {
         $sql .= $this->_adapter->quoteInto(' AND UPPER(t.owner) = UPPER(?)', $schemaName);
     }
     $sql .= " ORDER BY c.colno";
     $desc = array();
     $stmt = $this->_adapter->query($sql);
     $result = $stmt->fetchAll(Zend_Db::FETCH_NUM);
     /**
      * The ordering of columns is defined by the query so we can map
      * to variables to improve readability
      */
     $tabschema = 0;
     $tabname = 1;
     $colname = 2;
     $colno = 3;
     $typename = 4;
     $default = 5;
     $length = 6;
     $tabid = 7;
     $primaryCols = null;
     foreach ($result as $key => $row) {
         $primary = false;
         $primaryPosition = null;
         if (!$primaryCols) {
             $primaryCols = $this->_getPrimaryInfo($row[$tabid]);
         }
         if (array_key_exists($row[$colno], $primaryCols)) {
             $primary = true;
             $primaryPosition = $primaryCols[$row[$colno]];
         }
         $identity = false;
         if ($row[$typename] == 6 + 256 || $row[$typename] == 18 + 256) {
             $identity = true;
         }
         $desc[$this->_adapter->foldCase($row[$colname])] = array('SCHEMA_NAME' => $this->_adapter->foldCase($row[$tabschema]), 'TABLE_NAME' => $this->_adapter->foldCase($row[$tabname]), 'COLUMN_NAME' => $this->_adapter->foldCase($row[$colname]), 'COLUMN_POSITION' => $row[$colno], 'DATA_TYPE' => $this->_getDataType($row[$typename]), 'DEFAULT' => $row[$default], 'NULLABLE' => (bool) (!($row[$typename] - 256 >= 0)), 'LENGTH' => $row[$length], 'SCALE' => $row[$typename] == 5 ? $row[$length] & 255 : 0, 'PRECISION' => $row[$typename] == 5 ? (int) ($row[$length] / 256) : 0, 'UNSIGNED' => false, 'PRIMARY' => $primary, 'PRIMARY_POSITION' => $primaryPosition, 'IDENTITY' => $identity);
     }
     return $desc;
 }
Example #4
0
 public function authenticate()
 {
     $this->_authenticateSetup();
     $dbSelect = $this->_authenticateCreateSelect();
     $resultIdentities = $this->_authenticateQuerySelect($dbSelect);
     if (($authResult = $this->_authenticateValidateResultSet($resultIdentities)) instanceof Zend_Auth_Result) {
         return $authResult;
     }
     if (true === $this->getAmbiguityIdentity()) {
         $validIdentities = array();
         $zendAuthCredentialMatchColumn = $this->_zendDb->foldCase('zend_auth_credential_match');
         foreach ($resultIdentities as $identity) {
             if (1 === (int) $identity[$zendAuthCredentialMatchColumn]) {
                 $validIdentities[] = $identity;
             }
         }
         $resultIdentities = $validIdentities;
     }
     $authResult = $this->_authenticateValidateResult(array_shift($resultIdentities));
     return $authResult;
 }
Example #5
0
 /**
  * Called by parent table's class during delete() method.
  *
  * @param  string $parentTableClassname
  * @param  array  $primaryKey
  * @return int    Number of affected rows
  */
 public function _cascadeDelete($parentTableClassname, array $primaryKey)
 {
     $rowsAffected = 0;
     foreach ($this->_getReferenceMapNormalized() as $rule => $map) {
         if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) {
             switch ($map[self::ON_DELETE]) {
                 case self::CASCADE:
                     for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
                         $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
                         $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
                         $where[] = $this->_db->quoteInto($this->_db->quoteIdentifier($col, true) . ' = ?', $primaryKey[$refCol]);
                     }
                     $rowsAffected += $this->delete($where);
                     break;
                 default:
                     // no action
                     break;
             }
         }
     }
     return $rowsAffected;
 }
Example #6
0
 /**
  * Called by parent table's class during delete() method.
  *
  * @param  string $parentTableClassname
  * @param  array  $primaryKey
  * @return int    Number of affected rows
  */
 public function _cascadeDelete($parentTableClassname, array $primaryKey)
 {
     // setup metadata
     $this->_setupMetadata();
     // get this class name
     $thisClass = get_class($this);
     if ($thisClass === 'Zend_Db_Table') {
         $thisClass = $this->_definitionConfigName;
     }
     $rowsAffected = 0;
     foreach ($this->_getReferenceMapNormalized() as $map) {
         if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) {
             $where = array();
             // CASCADE or CASCADE_RECURSE
             if (in_array($map[self::ON_DELETE], array(self::CASCADE, self::CASCADE_RECURSE))) {
                 for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) {
                     $col = $this->_db->foldCase($map[self::COLUMNS][$i]);
                     $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]);
                     $type = $this->_metadata[$col]['DATA_TYPE'];
                     $where[] = $this->_db->quoteInto($this->_db->quoteIdentifier($col, true) . ' = ?', $primaryKey[$refCol], $type);
                 }
             }
             // CASCADE_RECURSE
             if ($map[self::ON_DELETE] == self::CASCADE_RECURSE) {
                 /**
                  * Execute cascading deletes against dependent tables
                  */
                 $depTables = $this->getDependentTables();
                 if (!empty($depTables)) {
                     foreach ($depTables as $tableClass) {
                         $t = self::getTableFromString($tableClass, $this);
                         foreach ($this->fetchAll($where) as $depRow) {
                             $rowsAffected += $t->_cascadeDelete($thisClass, $depRow->getPrimaryKey());
                         }
                     }
                 }
             }
             // CASCADE or CASCADE_RECURSE
             if (in_array($map[self::ON_DELETE], array(self::CASCADE, self::CASCADE_RECURSE))) {
                 $rowsAffected += $this->delete($where);
             }
         }
     }
     return $rowsAffected;
 }
Example #7
0
 /**
  * Helper method to change the case of the strings used
  * when returning result sets in FETCH_ASSOC and FETCH_BOTH
  * modes.
  *
  * This is not intended to be used by application code,
  * but the method must be public so the Statement class
  * can invoke it.
  *
  * @param string $key key string
  * @return string
  */
 public function foldCase($key)
 {
     return $this->_adapter->foldCase($key);
 }