You are here

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

Create the data type from a field specification.

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

File

drivers/lib/Drupal/Driver/Database/sqlsrv/Schema.php, line 1447

Class

Schema

Namespace

Drupal\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;
  }
}