Browse Source

Merge branch 'master' of https://github.com/yiisoft/yii2 into jui-tabs

tags/2.0.0-beta
Alexander Kochetov 12 years ago
parent
commit
17a316cd94
  1. 2
      apps/bootstrap/commands/HelloController.php
  2. 4
      apps/bootstrap/composer.json
  3. 2
      extensions/composer/composer.json
  4. 52
      extensions/composer/yii/composer/InstallHandler.php
  5. 24
      framework/yii/db/mssql/Schema.php
  6. 2
      framework/yii/helpers/base/Html.php
  7. 9
      framework/yii/web/Application.php
  8. 2
      tests/unit/data/mssql.sql
  9. 55
      tests/unit/framework/db/mssql/MssqlCommandTest.php

2
apps/bootstrap/commands/HelloController.php

@ -24,6 +24,6 @@ class HelloController extends Controller
*/
public function actionIndex($message = 'hello world')
{
echo $message;
echo $message."\n";
}
}

4
apps/bootstrap/composer.json

@ -27,11 +27,11 @@
]
},
"extra": {
"writable": [
"yii-install-writable": [
"runtime",
"www/assets"
],
"executable": [
"yii-install-executable": [
"yii"
]
}

2
extensions/composer/composer.json

@ -19,7 +19,7 @@
],
"minimum-stability": "dev",
"require": {
"yiisoft/yii2": "dev-master"
"yiisoft/yii2": "*"
},
"autoload": {
"psr-0": { "yii\\composer": "" }

52
extensions/composer/yii/composer/InstallHandler.php

@ -8,15 +8,28 @@
namespace yii\composer;
use Composer\Script\CommandEvent;
use yii\console\Application;
use yii\console\Exception;
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi doesn't have STDIN defined by default
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
/**
* InstallHandler is called by Composer after it installs/updates the current package.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Tobias Munk <schmunk@usrbin.de>
* @since 2.0
*/
class InstallHandler
{
const PARAM_WRITABLE = 'yii-install-writable';
const PARAM_EXECUTABLE = 'yii-install-executable';
const PARAM_CONFIG = 'yii-install-config';
const PARAM_COMMANDS = 'yii-install-commands';
/**
* Sets the correct permissions of files and directories.
* @param CommandEvent $event
@ -24,11 +37,11 @@ class InstallHandler
public static function setPermissions($event)
{
$options = array_merge(array(
'writable' => array(),
'executable' => array(),
self::PARAM_WRITABLE => array(),
self::PARAM_EXECUTABLE => array(),
), $event->getComposer()->getPackage()->getExtra());
foreach ((array)$options['writable'] as $path) {
foreach ((array)$options[self::PARAM_WRITABLE] as $path) {
echo "Setting writable: $path ...";
if (is_dir($path)) {
chmod($path, 0777);
@ -39,7 +52,7 @@ class InstallHandler
}
}
foreach ((array)$options['executable'] as $path) {
foreach ((array)$options[self::PARAM_EXECUTABLE] as $path) {
echo "Setting executable: $path ...";
if (is_file($path)) {
chmod($path, 0755);
@ -50,4 +63,35 @@ class InstallHandler
}
}
}
/**
* Executes a yii command.
* @param CommandEvent $event
*/
public static function run($event)
{
$options = array_merge(array(
self::PARAM_COMMANDS => array(),
), $event->getComposer()->getPackage()->getExtra());
if (!isset($options[self::PARAM_CONFIG])) {
throw new Exception('Please specify the "' . self::PARAM_CONFIG . '" parameter in composer.json.');
}
$configFile = getcwd() . '/' . $options[self::PARAM_CONFIG];
if (!is_file($configFile)) {
throw new Exception("Config file does not exist: $configFile");
}
require(__DIR__ . '/../../../yii2/yii/Yii.php');
$application = new Application(require($configFile));
$request = $application->getRequest();
foreach ((array)$options[self::PARAM_COMMANDS] as $command) {
$params = str_getcsv($command, ' '); // see http://stackoverflow.com/a/6609509/291573
$request->setParams($params);
list($route, $params) = $request->resolve();
echo "Running command: yii {$command}\n";
$application->runAction($route, $params);
}
}
}

24
framework/yii/db/mssql/Schema.php

@ -156,14 +156,14 @@ class Schema extends \yii\db\Schema
{
$column = new ColumnSchema();
$column->name = $info['COLUMN_NAME'];
$column->allowNull = $info['IS_NULLABLE'] == 'YES';
$column->dbType = $info['DATA_TYPE'];
$column->name = $info['column_name'];
$column->allowNull = $info['is_nullable'] == 'YES';
$column->dbType = $info['data_type'];
$column->enumValues = array(); // mssql has only vague equivalents to enum
$column->isPrimaryKey = null; // primary key will be determined in findColumns() method
$column->autoIncrement = $info['IsIdentity'] == 1;
$column->autoIncrement = $info['is_identity'] == 1;
$column->unsigned = stripos($column->dbType, 'unsigned') !== false;
$column->comment = $info['Comment'] === null ? '' : $column['Comment'];
$column->comment = $info['comment'] === null ? '' : $info['comment'];
$column->type = self::TYPE_STRING;
if (preg_match('/^(\w+)(?:\(([^\)]+)\))?/', $column->dbType, $matches)) {
@ -191,11 +191,11 @@ class Schema extends \yii\db\Schema
$column->phpType = $this->getColumnPhpType($column);
if ($info['COLUMN_DEFAULT'] == '(NULL)') {
$info['COLUMN_DEFAULT'] = null;
if ($info['column_default'] == '(NULL)') {
$info['column_default'] = null;
}
if ($column->type !== 'timestamp' || $info['COLUMN_DEFAULT'] !== 'CURRENT_TIMESTAMP') {
$column->defaultValue = $column->typecast($info['COLUMN_DEFAULT']);
if ($column->type !== 'timestamp' || $info['column_default'] !== 'CURRENT_TIMESTAMP') {
$column->defaultValue = $column->typecast($info['column_default']);
}
return $column;
@ -221,9 +221,9 @@ class Schema extends \yii\db\Schema
$sql = <<<SQL
SELECT
[t1].*,
COLUMNPROPERTY(OBJECT_ID([t1].[table_schema] + '.' + [t1].[table_name]), [t1].[column_name], 'IsIdentity') AS IsIdentity,
CONVERT(VARCHAR, [t2].[value]) AS Comment
[t1].[column_name], [t1].[is_nullable], [t1].[data_type], [t1].[column_default],
COLUMNPROPERTY(OBJECT_ID([t1].[table_schema] + '.' + [t1].[table_name]), [t1].[column_name], 'IsIdentity') AS is_identity,
CONVERT(VARCHAR, [t2].[value]) AS comment
FROM {$columnsTableName} AS [t1]
LEFT OUTER JOIN [sys].[extended_properties] AS [t2] ON
[t1].[ordinal_position] = [t2].[minor_id] AND

2
framework/yii/helpers/base/Html.php

@ -1364,7 +1364,7 @@ class Html
return Yii::$app->getRequest()->getUrl();
} else {
$url = Yii::getAlias($url);
if ($url[0] === '/' || strpos($url, '://')) {
if ($url[0] === '/' || $url[0] === '#' || strpos($url, '://')) {
return $url;
} else {
return Yii::$app->getRequest()->getBaseUrl() . '/' . $url;

9
framework/yii/web/Application.php

@ -8,6 +8,8 @@
namespace yii\web;
use Yii;
use yii\base\HttpException;
use yii\base\InvalidRouteException;
/**
* Application is the base class for all application classes.
@ -25,6 +27,7 @@ class Application extends \yii\base\Application
/**
* Processes the request.
* @return integer the exit status of the controller action (0 means normal, non-zero values mean abnormal)
* @throws HttpException if the request cannot be resolved.
*/
public function processRequest()
{
@ -32,7 +35,11 @@ class Application extends \yii\base\Application
Yii::setAlias('@wwwroot', dirname($request->getScriptFile()));
Yii::setAlias('@www', $request->getBaseUrl());
list ($route, $params) = $request->resolve();
return $this->runAction($route, $params);
try {
return $this->runAction($route, $params);
} catch (InvalidRouteException $e) {
throw new HttpException(404, $e->getMessage(), $e->getCode(), $e);
}
}
private $_homeUrl;

2
tests/unit/data/mssql.sql

@ -62,7 +62,7 @@ CREATE TABLE [dbo].[tbl_type] (
[char_col3] [text],
[float_col] [decimal](4,3) NOT NULL,
[float_col2] [float] DEFAULT '1.23',
[blob_col] [binary],
[blob_col] [varbinary](MAX),
[numeric_col] [decimal](5,2) DEFAULT '33.22',
[time] [datetime] NOT NULL DEFAULT '2002-01-01 00:00:00',
[bool_col] [tinyint] NOT NULL,

55
tests/unit/framework/db/mssql/MssqlCommandTest.php

@ -21,11 +21,62 @@ class MssqlCommandTest extends \yiiunit\framework\db\CommandTest
function testPrepareCancel()
{
$this->markTestIncomplete();
$this->markTestSkipped('MSSQL driver does not support this feature.');
}
function testBindParamValue()
{
$this->markTestIncomplete();
$db = $this->getConnection();
// bindParam
$sql = 'INSERT INTO tbl_customer(email, name, address) VALUES (:email, :name, :address)';
$command = $db->createCommand($sql);
$email = 'user4@example.com';
$name = 'user4';
$address = 'address4';
$command->bindParam(':email', $email);
$command->bindParam(':name', $name);
$command->bindParam(':address', $address);
$command->execute();
$sql = 'SELECT name FROM tbl_customer WHERE email=:email';
$command = $db->createCommand($sql);
$command->bindParam(':email', $email);
$this->assertEquals($name, $command->queryScalar());
$sql = 'INSERT INTO tbl_type (int_col, char_col, float_col, blob_col, numeric_col, bool_col) VALUES (:int_col, :char_col, :float_col, CONVERT([varbinary], :blob_col), :numeric_col, :bool_col)';
$command = $db->createCommand($sql);
$intCol = 123;
$charCol = 'abc';
$floatCol = 1.23;
$blobCol = "\x10\x11\x12";
$numericCol = '1.23';
$boolCol = false;
$command->bindParam(':int_col', $intCol);
$command->bindParam(':char_col', $charCol);
$command->bindParam(':float_col', $floatCol);
$command->bindParam(':blob_col', $blobCol);
$command->bindParam(':numeric_col', $numericCol);
$command->bindParam(':bool_col', $boolCol);
$this->assertEquals(1, $command->execute());
$sql = 'SELECT int_col, char_col, float_col, CONVERT([nvarchar], blob_col) AS blob_col, numeric_col FROM tbl_type';
$row = $db->createCommand($sql)->queryRow();
$this->assertEquals($intCol, $row['int_col']);
$this->assertEquals($charCol, trim($row['char_col']));
$this->assertEquals($floatCol, $row['float_col']);
$this->assertEquals($blobCol, $row['blob_col']);
$this->assertEquals($numericCol, $row['numeric_col']);
// bindValue
$sql = 'INSERT INTO tbl_customer(email, name, address) VALUES (:email, \'user5\', \'address5\')';
$command = $db->createCommand($sql);
$command->bindValue(':email', 'user5@example.com');
$command->execute();
$sql = 'SELECT email FROM tbl_customer WHERE name=:name';
$command = $db->createCommand($sql);
$command->bindValue(':name', 'user5');
$this->assertEquals('user5@example.com', $command->queryScalar());
}
}

Loading…
Cancel
Save