mirror of https://github.com/AMT-Cheif/drift.git
Add BigInt support
This commit is contained in:
parent
5e3de2fb7c
commit
2b4bcc9864
|
@ -45,6 +45,9 @@ abstract class Column<T> extends Expression<T> {
|
||||||
/// A column that stores int values.
|
/// A column that stores int values.
|
||||||
typedef IntColumn = Column<int?>;
|
typedef IntColumn = Column<int?>;
|
||||||
|
|
||||||
|
/// A column that stores BigInt values.
|
||||||
|
typedef BigIntColumn = Column<BigInt?>;
|
||||||
|
|
||||||
/// A column that stores boolean values. Booleans will be stored as an integer
|
/// A column that stores boolean values. Booleans will be stored as an integer
|
||||||
/// that can either be 0 (false) or 1 (true).
|
/// that can either be 0 (false) or 1 (true).
|
||||||
typedef BoolColumn = Column<bool?>;
|
typedef BoolColumn = Column<bool?>;
|
||||||
|
|
|
@ -105,6 +105,14 @@ abstract class Table extends HasResultSet {
|
||||||
@protected
|
@protected
|
||||||
ColumnBuilder<int> integer() => _isGenerated();
|
ColumnBuilder<int> integer() => _isGenerated();
|
||||||
|
|
||||||
|
/// Use this as the body of a getter to declare a column that holds BigInts.
|
||||||
|
/// Example (inside the body of a table class):
|
||||||
|
/// ```
|
||||||
|
/// BigIntColumn get bigNumber => bigInt()();
|
||||||
|
/// ```
|
||||||
|
@protected
|
||||||
|
ColumnBuilder<BigInt> bigInt() => _isGenerated();
|
||||||
|
|
||||||
/// Creates a column to store an `enum` class [T].
|
/// Creates a column to store an `enum` class [T].
|
||||||
///
|
///
|
||||||
/// In the database, the column will be represented as an integer
|
/// In the database, the column will be represented as an integer
|
||||||
|
|
|
@ -31,6 +31,11 @@ class Variable<T> extends Expression<T> {
|
||||||
return Variable(value);
|
return Variable(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a variable that holds the specified BigInt.
|
||||||
|
static Variable<BigInt> withBigInt(BigInt value) {
|
||||||
|
return Variable(value);
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a variable that holds the specified string.
|
/// Creates a variable that holds the specified string.
|
||||||
static Variable<String> withString(String value) {
|
static Variable<String> withString(String value) {
|
||||||
return Variable(value);
|
return Variable(value);
|
||||||
|
|
|
@ -121,6 +121,32 @@ class IntType extends SqlType<int> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Maps [BigInt] values from and to sql
|
||||||
|
@_deprecated
|
||||||
|
class BigIntType extends SqlType<BigInt> {
|
||||||
|
/// Constant constructor used by the type system
|
||||||
|
const BigIntType();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sqlName(SqlDialect dialect) =>
|
||||||
|
dialect == SqlDialect.sqlite ? 'INTEGER' : 'bigint';
|
||||||
|
|
||||||
|
@override
|
||||||
|
BigInt? mapFromDatabaseResponse(dynamic response) {
|
||||||
|
if (response == null || response is BigInt?) return response as BigInt?;
|
||||||
|
if (response is int) return BigInt.from(response);
|
||||||
|
return BigInt.parse(response.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String mapToSqlConstant(BigInt? content) => content?.toString() ?? 'NULL';
|
||||||
|
|
||||||
|
@override
|
||||||
|
BigInt? mapToSqlVariable(BigInt? content) {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Maps [DateTime] values from and to sql
|
/// Maps [DateTime] values from and to sql
|
||||||
@_deprecated
|
@_deprecated
|
||||||
class DateTimeType extends SqlType<DateTime> {
|
class DateTimeType extends SqlType<DateTime> {
|
||||||
|
|
|
@ -158,6 +158,9 @@ extension on TypeProvider {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ColumnType.integer:
|
case ColumnType.integer:
|
||||||
return intType;
|
return intType;
|
||||||
|
case ColumnType.bigInt:
|
||||||
|
return intElement.library.getType('BigInt')!.instantiate(
|
||||||
|
typeArguments: const [], nullabilitySuffix: NullabilitySuffix.none);
|
||||||
case ColumnType.text:
|
case ColumnType.text:
|
||||||
return stringType;
|
return stringType;
|
||||||
case ColumnType.boolean:
|
case ColumnType.boolean:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
part of 'parser.dart';
|
part of 'parser.dart';
|
||||||
|
|
||||||
const String startInt = 'integer';
|
const String startInt = 'integer';
|
||||||
|
const String startBigInt = 'bigInt';
|
||||||
const String startEnum = 'intEnum';
|
const String startEnum = 'intEnum';
|
||||||
const String startString = 'text';
|
const String startString = 'text';
|
||||||
const String startBool = 'boolean';
|
const String startBool = 'boolean';
|
||||||
|
@ -10,6 +11,7 @@ const String startReal = 'real';
|
||||||
|
|
||||||
const Set<String> starters = {
|
const Set<String> starters = {
|
||||||
startInt,
|
startInt,
|
||||||
|
startBigInt,
|
||||||
startEnum,
|
startEnum,
|
||||||
startString,
|
startString,
|
||||||
startBool,
|
startBool,
|
||||||
|
@ -442,6 +444,7 @@ class ColumnParser {
|
||||||
startBool: ColumnType.boolean,
|
startBool: ColumnType.boolean,
|
||||||
startString: ColumnType.text,
|
startString: ColumnType.text,
|
||||||
startInt: ColumnType.integer,
|
startInt: ColumnType.integer,
|
||||||
|
startBigInt: ColumnType.bigInt,
|
||||||
startEnum: ColumnType.integer,
|
startEnum: ColumnType.integer,
|
||||||
startDateTime: ColumnType.datetime,
|
startDateTime: ColumnType.datetime,
|
||||||
startBlob: ColumnType.blob,
|
startBlob: ColumnType.blob,
|
||||||
|
|
|
@ -170,6 +170,7 @@ class ViewParser {
|
||||||
'bool': ColumnType.boolean,
|
'bool': ColumnType.boolean,
|
||||||
'String': ColumnType.text,
|
'String': ColumnType.text,
|
||||||
'int': ColumnType.integer,
|
'int': ColumnType.integer,
|
||||||
|
'BigInt': ColumnType.bigInt,
|
||||||
'DateTime': ColumnType.datetime,
|
'DateTime': ColumnType.datetime,
|
||||||
'Uint8List': ColumnType.blob,
|
'Uint8List': ColumnType.blob,
|
||||||
'double': ColumnType.real,
|
'double': ColumnType.real,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:drift/drift.dart' as m;
|
import 'package:drift/drift.dart' as m;
|
||||||
import 'package:drift_dev/moor_generator.dart';
|
import 'package:drift_dev/moor_generator.dart';
|
||||||
|
import 'package:drift_dev/src/model/column.dart';
|
||||||
import 'package:drift_dev/src/utils/type_converter_hint.dart';
|
import 'package:drift_dev/src/utils/type_converter_hint.dart';
|
||||||
import 'package:sqlparser/sqlparser.dart';
|
import 'package:sqlparser/sqlparser.dart';
|
||||||
import 'package:sqlparser/utils/find_referenced_tables.dart' as s;
|
import 'package:sqlparser/utils/find_referenced_tables.dart' as s;
|
||||||
|
@ -53,6 +54,9 @@ class TypeMapper {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ColumnType.integer:
|
case ColumnType.integer:
|
||||||
return ResolvedType(type: BasicType.int, hint: overrideHint);
|
return ResolvedType(type: BasicType.int, hint: overrideHint);
|
||||||
|
case ColumnType.bigInt:
|
||||||
|
return ResolvedType(
|
||||||
|
type: BasicType.int, hint: overrideHint ?? const IsBigInt());
|
||||||
case ColumnType.text:
|
case ColumnType.text:
|
||||||
return ResolvedType(type: BasicType.text, hint: overrideHint);
|
return ResolvedType(type: BasicType.text, hint: overrideHint);
|
||||||
case ColumnType.boolean:
|
case ColumnType.boolean:
|
||||||
|
@ -82,6 +86,8 @@ class TypeMapper {
|
||||||
return ColumnType.boolean;
|
return ColumnType.boolean;
|
||||||
} else if (type.hint is IsDateTime) {
|
} else if (type.hint is IsDateTime) {
|
||||||
return ColumnType.datetime;
|
return ColumnType.datetime;
|
||||||
|
} else if (type.hint is IsBigInt) {
|
||||||
|
return ColumnType.bigInt;
|
||||||
}
|
}
|
||||||
return ColumnType.integer;
|
return ColumnType.integer;
|
||||||
case BasicType.real:
|
case BasicType.real:
|
||||||
|
|
|
@ -11,7 +11,7 @@ import 'types.dart';
|
||||||
import 'used_type_converter.dart';
|
import 'used_type_converter.dart';
|
||||||
|
|
||||||
/// The column types in sql.
|
/// The column types in sql.
|
||||||
enum ColumnType { integer, text, boolean, datetime, blob, real }
|
enum ColumnType { integer, bigInt, text, boolean, datetime, blob, real }
|
||||||
|
|
||||||
/// Name of a column. Contains additional info on whether the name was chosen
|
/// Name of a column. Contains additional info on whether the name was chosen
|
||||||
/// implicitly (based on the dart getter name) or explicitly (via an named())
|
/// implicitly (based on the dart getter name) or explicitly (via an named())
|
||||||
|
@ -122,6 +122,7 @@ class MoorColumn implements HasDeclaration, HasType {
|
||||||
ColumnType.boolean: 'BoolColumn',
|
ColumnType.boolean: 'BoolColumn',
|
||||||
ColumnType.text: 'TextColumn',
|
ColumnType.text: 'TextColumn',
|
||||||
ColumnType.integer: 'IntColumn',
|
ColumnType.integer: 'IntColumn',
|
||||||
|
ColumnType.bigInt: 'BigIntColumn',
|
||||||
ColumnType.datetime: 'DateTimeColumn',
|
ColumnType.datetime: 'DateTimeColumn',
|
||||||
ColumnType.blob: 'BlobColumn',
|
ColumnType.blob: 'BlobColumn',
|
||||||
ColumnType.real: 'RealColumn',
|
ColumnType.real: 'RealColumn',
|
||||||
|
@ -135,6 +136,9 @@ class MoorColumn implements HasDeclaration, HasType {
|
||||||
case ColumnType.integer:
|
case ColumnType.integer:
|
||||||
code = 'int';
|
code = 'int';
|
||||||
break;
|
break;
|
||||||
|
case ColumnType.bigInt:
|
||||||
|
code = 'BigInt';
|
||||||
|
break;
|
||||||
case ColumnType.text:
|
case ColumnType.text:
|
||||||
code = 'String';
|
code = 'String';
|
||||||
break;
|
break;
|
||||||
|
@ -161,6 +165,8 @@ class MoorColumn implements HasDeclaration, HasType {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ColumnType.integer:
|
case ColumnType.integer:
|
||||||
return const IntType();
|
return const IntType();
|
||||||
|
case ColumnType.bigInt:
|
||||||
|
return const BigIntType();
|
||||||
case ColumnType.boolean:
|
case ColumnType.boolean:
|
||||||
return const BoolType();
|
return const BoolType();
|
||||||
case ColumnType.datetime:
|
case ColumnType.datetime:
|
||||||
|
|
|
@ -128,6 +128,7 @@ const Map<ColumnType, String> dartTypeNames = {
|
||||||
ColumnType.boolean: 'bool',
|
ColumnType.boolean: 'bool',
|
||||||
ColumnType.text: 'String',
|
ColumnType.text: 'String',
|
||||||
ColumnType.integer: 'int',
|
ColumnType.integer: 'int',
|
||||||
|
ColumnType.bigInt: 'BigInt',
|
||||||
ColumnType.datetime: 'DateTime',
|
ColumnType.datetime: 'DateTime',
|
||||||
ColumnType.blob: 'Uint8List',
|
ColumnType.blob: 'Uint8List',
|
||||||
ColumnType.real: 'double',
|
ColumnType.real: 'double',
|
||||||
|
@ -139,6 +140,7 @@ const Map<ColumnType, String> createVariable = {
|
||||||
ColumnType.boolean: 'Variable.withBool',
|
ColumnType.boolean: 'Variable.withBool',
|
||||||
ColumnType.text: 'Variable.withString',
|
ColumnType.text: 'Variable.withString',
|
||||||
ColumnType.integer: 'Variable.withInt',
|
ColumnType.integer: 'Variable.withInt',
|
||||||
|
ColumnType.bigInt: 'Variable.withBigInt',
|
||||||
ColumnType.datetime: 'Variable.withDateTime',
|
ColumnType.datetime: 'Variable.withDateTime',
|
||||||
ColumnType.blob: 'Variable.withBlob',
|
ColumnType.blob: 'Variable.withBlob',
|
||||||
ColumnType.real: 'Variable.withReal',
|
ColumnType.real: 'Variable.withReal',
|
||||||
|
@ -148,6 +150,7 @@ const Map<ColumnType, String> sqlTypes = {
|
||||||
ColumnType.boolean: 'BoolType',
|
ColumnType.boolean: 'BoolType',
|
||||||
ColumnType.text: 'StringType',
|
ColumnType.text: 'StringType',
|
||||||
ColumnType.integer: 'IntType',
|
ColumnType.integer: 'IntType',
|
||||||
|
ColumnType.bigInt: 'BigIntType',
|
||||||
ColumnType.datetime: 'DateTimeType',
|
ColumnType.datetime: 'DateTimeType',
|
||||||
ColumnType.blob: 'BlobType',
|
ColumnType.blob: 'BlobType',
|
||||||
ColumnType.real: 'RealType',
|
ColumnType.real: 'RealType',
|
||||||
|
|
|
@ -101,6 +101,11 @@ class IsDateTime extends TypeHint {
|
||||||
const IsDateTime();
|
const IsDateTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Type hint to mark that this type will contain a date time value.
|
||||||
|
class IsBigInt extends TypeHint {
|
||||||
|
const IsBigInt();
|
||||||
|
}
|
||||||
|
|
||||||
/// Result of resolving a type. This can either have the resolved [type] set,
|
/// Result of resolving a type. This can either have the resolved [type] set,
|
||||||
/// or it can inform the called that it [needsContext] to resolve the type
|
/// or it can inform the called that it [needsContext] to resolve the type
|
||||||
/// properly. Failure to resolve the type will have the [unknown] flag set.
|
/// properly. Failure to resolve the type will have the [unknown] flag set.
|
||||||
|
|
Loading…
Reference in New Issue