You are here

protected function Schema::createDataType in Drupal driver for SQL Server and SQL Azure 4.0.x

Same name and namespace in other branches
  1. 4.2.x src/Driver/Database/sqlsrv/Schema.php \Drupal\sqlsrv\Driver\Database\sqlsrv\Schema::createDataType()
  2. 3.1.x src/Driver/Database/sqlsrv/Schema.php \Drupal\sqlsrv\Driver\Database\sqlsrv\Schema::createDataType()
  3. 4.1.x src/Driver/Database/sqlsrv/Schema.php \Drupal\sqlsrv\Driver\Database\sqlsrv\Schema::createDataType()

Create the data type from a field specification.

2 calls to Schema::createDataType()
Schema::changeField in src/Driver/Database/sqlsrv/Schema.php
Change a field definition.
Schema::createFieldSql in src/Driver/Database/sqlsrv/Schema.php
Create Field SQL.

File

src/Driver/Database/sqlsrv/Schema.php, line 1407

Class

Schema

Namespace

Drupal\sqlsrv\Driver\Database\sqlsrv

Code

protected function createDataType($table, $name, $spec) {
  $sqlsrv_type = $spec['sqlsrv_type'];
  $sqlsrv_type_native = $spec['sqlsrv_type_native'];
  $lengthable = in_array($sqlsrv_type_native, [
    'char',
    'varchar',
    'nchar',
    'nvarchar',
  ]);
  if (!empty($spec['length']) && $lengthable) {
    $length = $spec['length'];
    if (is_int($length) && $this
      ->isUtf8()) {

      // Do we need to check if this exceeds the max length?
      // If so, use varchar(max).
      $length *= 3;
    }
    return $sqlsrv_type_native . '(' . $length . ')';
  }
  elseif (in_array($sqlsrv_type_native, [
    'numeric',
    'decimal',
  ]) && isset($spec['precision']) && isset($spec['scale'])) {

    // Maximum precision for SQL Server 2008 or greater is 38.
    // For previous versions it's 28.
    if ($spec['precision'] > 38) {

      // Logs an error.
      \Drupal::logger('sqlsrv')
        ->warning("Field '@field' in table '@table' has had it's precision dropped from @precision to 38", [
        '@field' => $name,
        '@table' => $table,
        '@precision' => $spec['precision'],
      ]);
      $spec['precision'] = 38;
    }
    return $sqlsrv_type_native . '(' . $spec['precision'] . ', ' . $spec['scale'] . ')';
  }
  else {
    return $sqlsrv_type;
  }
}