/** * Actualiza todos los atributos de la entidad * $Clientes->update_all("estado='A', fecha='2005-02-02'", "id>100"); * $Clientes->update_all("estado='A', fecha='2005-02-02'", "id>100", "limit: 10"); * * @param string $values */ public function update_all($values) { $params = array(); if ($this->schema) { $table = $this->schema . "." . $this->source; } else { $table = $this->source; } if (func_num_args() > 1) { $params = Util::getParams(func_get_args()); } if (!isset($params['conditions']) || !$params['conditions']) { if (isset($params[1])) { $params['conditions'] = $params[1]; } else { $params['conditions'] = ''; } } if ($params['conditions']) { $params['conditions'] = " WHERE " . $params['conditions']; } $sql = "UPDATE {$table} SET {$values} {$params['conditions']}"; $limit_args = array($sql); if (isset($params['limit'])) { array_push($limit_args, "limit: {$params['limit']}"); } if (isset($params['offset'])) { array_push($limit_args, "offset: {$params['offset']}"); } if (count($limit_args) > 1) { $sql = call_user_func_array(array($this, 'limit'), $limit_args); } $environment = Config::read('databases'); $config = $environment[$this->get_database()]; if (!isset($config->pdo) || !$config->pdo) { if ($config['type'] == "informix") { $this->db->set_return_rows(false); } } return $this->db->query($sql); }
/** * Generate specified table migration * * @param string $version * @param string $table * @param string $exportData * @return string */ public static function generate($version, $table, $exportData = null) { $oldColumn = null; $allFields = array(); $numericFields = array(); $tableDefinition = array(); $defaultSchema = self::$_connection->getDefaultSchema(); $description = self::$_connection->describeTable($table, $defaultSchema); foreach ($description as $field) { $fieldDefinition = array(); if (preg_match('/([a-z]+)(\\(([0-9]+)(,([0-9]+))*\\)){0,1}/', $field['Type'], $matches)) { switch ($matches[1]) { case 'int': case 'smallint': case 'double': $fieldDefinition[] = "'type' => DbColumn::TYPE_INTEGER"; $numericFields[$field['Field']] = true; break; case 'varchar': $fieldDefinition[] = "'type' => DbColumn::TYPE_VARCHAR"; break; case 'char': $fieldDefinition[] = "'type' => DbColumn::TYPE_CHAR"; break; case 'date': $fieldDefinition[] = "'type' => DbColumn::TYPE_DATE"; break; case 'datetime': $fieldDefinition[] = "'type' => DbColumn::TYPE_DATETIME"; break; case 'decimal': $fieldDefinition[] = "'type' => DbColumn::TYPE_DECIMAL"; $numericFields[$field['Field']] = true; break; case 'mediumblob': case 'text': $fieldDefinition[] = "'type' => DbColumn::TYPE_TEXT"; break; case 'enum': $fieldDefinition[] = "'type' => DbColumn::TYPE_CHAR"; $fieldDefinition[] = "'size' => 1"; break; default: throw new ActiveRecordMigrationException('Tipo de dato no reconocido ' . $matches[1] . ' en la columna ' . $field['Field']); } if (isset($matches[3])) { $fieldDefinition[] = "'size' => " . $matches[3]; } if (isset($matches[5])) { $fieldDefinition[] = "'scale' => " . $matches[5]; } if (strpos($field['Type'], 'unsigned')) { $fieldDefinition[] = "'unsigned' => true"; } } else { throw new ActiveRecordMigrationException('Tipo de dato no reconocido ' . $field['Type']); } if ($field['Key'] == 'PRI') { $fieldDefinition[] = "'primary' => true"; } if ($field['Null'] == 'NO') { $fieldDefinition[] = "'notNull' => true"; } if ($field['Extra'] == 'auto_increment') { $fieldDefinition[] = "'autoIncrement' => true"; } if ($oldColumn != null) { $fieldDefinition[] = "'after' => '" . $oldColumn . "'"; } else { $fieldDefinition[] = "'first' => true"; } $oldColumn = $field['Field']; $tableDefinition[] = "\t\t\t\tnew DbColumn('" . $field['Field'] . "', array(\n\t\t\t\t\t" . join(",\n\t\t\t\t\t", $fieldDefinition) . "\n\t\t\t\t))"; $allFields[] = "'" . $field['Field'] . "'"; } $indexesDefinition = array(); $indexes = self::$_connection->describeIndexes($table, $defaultSchema); foreach ($indexes as $indexName => $indexColumns) { $indexDefinition = array(); foreach ($indexColumns as $indexColumn) { $indexDefinition[] = "'" . $indexColumn . "'"; } $indexesDefinition[] = "\t\t\t\tnew DbIndex('" . $indexName . "', array(\n\t\t\t\t\t" . join(",\n\t\t\t\t\t", $indexDefinition) . "\n\t\t\t\t))"; } $referencesDefinition = array(); $references = self::$_connection->describeReferences($table, $defaultSchema); foreach ($references as $constraintName => $reference) { $columns = array(); foreach ($reference['columns'] as $column) { $columns[] = "'" . $column . "'"; } $referencedColumns = array(); foreach ($reference['referencedColumns'] as $referencedColumn) { $referencedColumns[] = "'" . $referencedColumn . "'"; } $referenceDefinition = array(); $referenceDefinition[] = "'referencedSchema' => '" . $reference['referencedSchema'] . "'"; $referenceDefinition[] = "'referencedTable' => '" . $reference['referencedTable'] . "'"; $referenceDefinition[] = "'columns' => array(" . join(",", $columns) . ")"; $referenceDefinition[] = "'referencedColumns' => array(" . join(",", $referencedColumns) . ")"; $referencesDefinition[] = "\t\t\t\tnew DbReference('" . $constraintName . "', array(\n\t\t\t\t\t" . join(",\n\t\t\t\t\t", $referenceDefinition) . "\n\t\t\t\t))"; } $optionsDefinition = array(); $tableOptions = self::$_connection->tableOptions($table, $defaultSchema); foreach ($tableOptions as $optionName => $optionValue) { $optionsDefinition[] = "\t\t\t\t'{$optionName}' => '" . $optionValue . "'"; } $classVersion = preg_replace('/[^0-9A-Za-z]/', '', $version); $className = Utils::camelize($table) . 'Migration_' . $classVersion; $classData = "class " . $className . " extends ActiveRecordMigration {\n\n" . "\tpublic function up(){\n\t\t\$this->morphTable('" . $table . "', array(" . "\n\t\t\t'columns' => array(\n" . join(",\n", $tableDefinition) . "\n\t\t\t)," . "\n\t\t\t'indexes' => array(\n" . join(",\n", $indexesDefinition) . "\n\t\t\t)," . "\n\t\t\t'references' => array(\n" . join(",\n", $referencesDefinition) . "\n\t\t\t)," . "\n\t\t\t'options' => array(\n" . join(",\n", $optionsDefinition) . "\n\t\t\t)\n" . "\t\t));\n\t}"; if ($exportData == 'always' || $exportData == 'oncreate') { if ($exportData == 'oncreate') { $classData .= "\n\n\tpublic function afterCreateTable(){\n"; } else { $classData .= "\n\n\tpublic function afterUp(){\n"; } $classData .= "\t\t\$this->batchInsert('{$table}', array(\n\t\t\t" . join(",\n\t\t\t", $allFields) . "\n\t\t));"; $fileHandler = fopen(self::$_migrationPath . '/' . $table . '.dat', 'w'); $cursor = self::$_connection->query('SELECT * FROM ' . $table); self::$_connection->setFetchMode(DbBase::DB_ASSOC); while ($row = self::$_connection->fetchArray($cursor)) { $data = array(); foreach ($row as $key => $value) { if (isset($numericFields[$key])) { if ($value === '' || is_null($value)) { $data[] = 'NULL'; } else { $data[] = addslashes($value); } } else { $data[] = "'" . addslashes($value) . "'"; } unset($value); } fputs($fileHandler, join('|', $data) . PHP_EOL); unset($row); unset($data); } fclose($fileHandler); $classData .= "\n\t}"; } $classData .= "\n\n}"; return $classData; }
/** * Ejecuta la consulta * * @return ActiveRecordResultset */ public function execute() { $sqlStatement = $this->getSQLString(); if ($this->_connection == null) { $this->_connection = DbPool::getConnection(); } $resultResource = $this->_connection->query($sqlStatement); $count = $this->_connection->numRows($resultResource); if ($count > 0) { $rowObject = new ActiveRecordRow(); $rowObject->setConnection($this->_connection); return new ActiveRecordResultset($rowObject, $resultResource, $sqlStatement); } else { return new ActiveRecordResultset(new stdClass(), false, $sqlStatement); } }