Start phasing out SqlTypeSystem

This commit is contained in:
Simon Binder 2021-04-25 16:14:33 +02:00
parent eb5196e9e8
commit adb27d056b
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
11 changed files with 123 additions and 2212 deletions

View File

@ -14,11 +14,10 @@ class User extends DataClass implements Insertable<User> {
factory User.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return User(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']),
name: stringType.mapFromDatabaseResponse(data['${effectivePrefix}name']),
id: const IntType().mapFromDatabaseResponse(data['${effectivePrefix}id']),
name: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}name']),
);
}
@override

View File

@ -14,11 +14,10 @@ class Category extends DataClass implements Insertable<Category> {
factory Category.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return Category(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
description: stringType
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
description: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}description']),
);
}
@ -215,16 +214,15 @@ class Recipe extends DataClass implements Insertable<Recipe> {
factory Recipe.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return Recipe(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
title:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}title'])!,
instructions: stringType
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
title: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}title'])!,
instructions: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}instructions'])!,
category:
intType.mapFromDatabaseResponse(data['${effectivePrefix}category']),
category: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}category']),
);
}
@override
@ -487,13 +485,13 @@ class Ingredient extends DataClass implements Insertable<Ingredient> {
factory Ingredient.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return Ingredient(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
name: stringType.mapFromDatabaseResponse(data['${effectivePrefix}name'])!,
caloriesPer100g:
intType.mapFromDatabaseResponse(data['${effectivePrefix}calories'])!,
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
name: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}name'])!,
caloriesPer100g: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}calories'])!,
);
}
@override
@ -723,14 +721,13 @@ class IngredientInRecipe extends DataClass
Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
return IngredientInRecipe(
recipe:
intType.mapFromDatabaseResponse(data['${effectivePrefix}recipe'])!,
ingredient: intType
recipe: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}recipe'])!,
ingredient: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}ingredient'])!,
amountInGrams:
intType.mapFromDatabaseResponse(data['${effectivePrefix}amount'])!,
amountInGrams: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}amount'])!,
);
}
@override

View File

@ -9,6 +9,7 @@ part of 'runtime_api.dart';
class DatabaseConnection {
/// The type system to use with this database. The type system is responsible
/// for mapping Dart objects into sql expressions and vice-versa.
@Deprecated('Only the default type system is supported')
final SqlTypeSystem typeSystem;
/// The executor to use when queries are executed.

View File

@ -95,8 +95,7 @@ class Constant<T> extends Expression<T> {
@override
void writeInto(GenerationContext context) {
final type = context.typeSystem.forDartType<T>();
context.buffer.write(type.mapToSqlConstant(value));
context.buffer.write(SqlTypeSystem.mapToSqlConstant(value));
}
@override

View File

@ -1,14 +1,18 @@
import 'dart:typed_data';
// ignore: import_of_legacy_library_into_null_safe
import 'package:convert/convert.dart';
import 'package:moor/moor.dart';
part 'custom_type.dart';
part 'type_system.dart';
const _deprecated =
Deprecated('Types will be removed in moor 5, use the methods on '
'SqlTypeSystem instead.');
/// A type that can be mapped from Dart to sql. The generic type parameter [T]
/// denotes the resolved dart type.
@_deprecated
abstract class SqlType<T> {
/// Constant constructor so that subclasses can be constant
const SqlType();
@ -30,6 +34,7 @@ abstract class SqlType<T> {
/// A mapper for boolean values in sql. Booleans are represented as integers,
/// where 0 means false and any other value means true.
@_deprecated
class BoolType extends SqlType<bool> {
/// Constant constructor used by the type system
const BoolType();
@ -63,6 +68,7 @@ class BoolType extends SqlType<bool> {
}
/// Mapper for string values in sql.
@_deprecated
class StringType extends SqlType<String> {
/// Constant constructor used by the type system
const StringType();
@ -91,6 +97,7 @@ class StringType extends SqlType<String> {
}
/// Maps [int] values from and to sql
@_deprecated
class IntType extends SqlType<int> {
/// Constant constructor used by the type system
const IntType();
@ -114,6 +121,7 @@ class IntType extends SqlType<int> {
}
/// Maps [DateTime] values from and to sql
@_deprecated
class DateTimeType extends SqlType<DateTime> {
/// Constant constructor used by the type system
const DateTimeType();
@ -147,6 +155,7 @@ class DateTimeType extends SqlType<DateTime> {
}
/// Maps [Uint8List] values from and to sql
@_deprecated
class BlobType extends SqlType<Uint8List> {
/// Constant constructor used by the type system
const BlobType();
@ -172,6 +181,7 @@ class BlobType extends SqlType<Uint8List> {
}
/// Maps [double] values from and to sql
@_deprecated
class RealType extends SqlType<double> {
/// Constant constructor used by the type system
const RealType();

View File

@ -31,6 +31,7 @@ class SqlTypeSystem {
/// Returns the appropriate sql type for the dart type provided as the
/// generic parameter.
@Deprecated('Use mapToVariable or a mapFromSql method instead')
SqlType<T> forDartType<T>() {
return types.singleWhere((t) => t is SqlType<T>) as SqlType<T>;
}
@ -46,4 +47,27 @@ class SqlTypeSystem {
return dart;
}
/// Maps a Dart object to a SQL constant representing the same value.
static String mapToSqlConstant(Object? dart) {
if (dart == null) return 'NULL';
// todo: Inline and remove types in the next major moor version
if (dart is bool) {
return const BoolType().mapToSqlConstant(dart);
} else if (dart is String) {
return const StringType().mapToSqlConstant(dart);
} else if (dart is int) {
return const IntType().mapToSqlConstant(dart);
} else if (dart is DateTime) {
return const DateTimeType().mapToSqlConstant(dart);
} else if (dart is Uint8List) {
return const BlobType().mapToSqlConstant(dart);
} else if (dart is double) {
return const RealType().mapToSqlConstant(dart);
}
throw ArgumentError.value(dart, 'dart',
'Must be null, bool, String, int, DateTime, Uint8List or double');
}
}

View File

@ -20,17 +20,15 @@ class Config extends DataClass implements Insertable<Config> {
factory Config.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final stringType = db.typeSystem.forDartType<String>();
final intType = db.typeSystem.forDartType<int>();
return Config(
configKey: stringType
configKey: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}config_key'])!,
configValue: stringType
configValue: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}config_value']),
syncState: ConfigTable.$converter0.mapToDart(intType
syncState: ConfigTable.$converter0.mapToDart(const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}sync_state'])),
syncStateImplicit: ConfigTable.$converter1.mapToDart(
intType.mapFromDatabaseResponse(
syncStateImplicit: ConfigTable.$converter1.mapToDart(const IntType()
.mapFromDatabaseResponse(
data['${effectivePrefix}sync_state_implicit'])),
);
}
@ -303,11 +301,10 @@ class WithDefault extends DataClass implements Insertable<WithDefault> {
factory WithDefault.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final stringType = db.typeSystem.forDartType<String>();
final intType = db.typeSystem.forDartType<int>();
return WithDefault(
a: stringType.mapFromDatabaseResponse(data['${effectivePrefix}a']),
b: intType.mapFromDatabaseResponse(data['${effectivePrefix}b']),
a: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}a']),
b: const IntType().mapFromDatabaseResponse(data['${effectivePrefix}b']),
);
}
@override
@ -489,9 +486,8 @@ class NoId extends DataClass implements Insertable<NoId> {
factory NoId.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final uint8ListType = db.typeSystem.forDartType<Uint8List>();
return NoId(
payload: uint8ListType
payload: const BlobType()
.mapFromDatabaseResponse(data['${effectivePrefix}payload'])!,
);
}
@ -645,13 +641,11 @@ class WithConstraint extends DataClass implements Insertable<WithConstraint> {
Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final stringType = db.typeSystem.forDartType<String>();
final intType = db.typeSystem.forDartType<int>();
final doubleType = db.typeSystem.forDartType<double>();
return WithConstraint(
a: stringType.mapFromDatabaseResponse(data['${effectivePrefix}a']),
b: intType.mapFromDatabaseResponse(data['${effectivePrefix}b'])!,
c: doubleType.mapFromDatabaseResponse(data['${effectivePrefix}c']),
a: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}a']),
b: const IntType().mapFromDatabaseResponse(data['${effectivePrefix}b'])!,
c: const RealType().mapFromDatabaseResponse(data['${effectivePrefix}c']),
);
}
@override
@ -871,18 +865,14 @@ class MytableData extends DataClass implements Insertable<MytableData> {
factory MytableData.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
final boolType = db.typeSystem.forDartType<bool>();
final dateTimeType = db.typeSystem.forDartType<DateTime>();
return MytableData(
someid:
intType.mapFromDatabaseResponse(data['${effectivePrefix}someid'])!,
sometext: stringType
someid: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}someid'])!,
sometext: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}sometext']),
isInserting: boolType
isInserting: const BoolType()
.mapFromDatabaseResponse(data['${effectivePrefix}is_inserting']),
somedate: dateTimeType
somedate: const DateTimeType()
.mapFromDatabaseResponse(data['${effectivePrefix}somedate']),
);
}
@ -1150,13 +1140,13 @@ class EMail extends DataClass implements Insertable<EMail> {
factory EMail.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final stringType = db.typeSystem.forDartType<String>();
return EMail(
sender:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}sender'])!,
title:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}title'])!,
body: stringType.mapFromDatabaseResponse(data['${effectivePrefix}body'])!,
sender: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}sender'])!,
title: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}title'])!,
body: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}body'])!,
);
}
@override
@ -1375,13 +1365,11 @@ class WeirdData extends DataClass implements Insertable<WeirdData> {
factory WeirdData.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return WeirdData(
sqlClass:
intType.mapFromDatabaseResponse(data['${effectivePrefix}class'])!,
textColumn:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}text'])!,
sqlClass: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}class'])!,
textColumn: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}text'])!,
);
}
@override

View File

@ -22,19 +22,17 @@ class TodoEntry extends DataClass implements Insertable<TodoEntry> {
factory TodoEntry.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
final dateTimeType = db.typeSystem.forDartType<DateTime>();
return TodoEntry(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
title:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}title']),
content: stringType
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
title: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}title']),
content: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}content'])!,
targetDate: dateTimeType
targetDate: const DateTimeType()
.mapFromDatabaseResponse(data['${effectivePrefix}target_date']),
category:
intType.mapFromDatabaseResponse(data['${effectivePrefix}category']),
category: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}category']),
);
}
@override
@ -342,14 +340,13 @@ class Category extends DataClass implements Insertable<Category> {
factory Category.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
return Category(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
description:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}desc'])!,
priority: $CategoriesTable.$converter0.mapToDart(
intType.mapFromDatabaseResponse(data['${effectivePrefix}priority']))!,
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
description: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}desc'])!,
priority: $CategoriesTable.$converter0.mapToDart(const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}priority']))!,
);
}
@override
@ -577,19 +574,16 @@ class User extends DataClass implements Insertable<User> {
factory User.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
final boolType = db.typeSystem.forDartType<bool>();
final uint8ListType = db.typeSystem.forDartType<Uint8List>();
final dateTimeType = db.typeSystem.forDartType<DateTime>();
return User(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
name: stringType.mapFromDatabaseResponse(data['${effectivePrefix}name'])!,
isAwesome: boolType
id: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}id'])!,
name: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}name'])!,
isAwesome: const BoolType()
.mapFromDatabaseResponse(data['${effectivePrefix}is_awesome'])!,
profilePicture: uint8ListType
profilePicture: const BlobType()
.mapFromDatabaseResponse(data['${effectivePrefix}profile_picture'])!,
creationTime: dateTimeType
creationTime: const DateTimeType()
.mapFromDatabaseResponse(data['${effectivePrefix}creation_time'])!,
);
}
@ -884,10 +878,11 @@ class SharedTodo extends DataClass implements Insertable<SharedTodo> {
factory SharedTodo.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
return SharedTodo(
todo: intType.mapFromDatabaseResponse(data['${effectivePrefix}todo'])!,
user: intType.mapFromDatabaseResponse(data['${effectivePrefix}user'])!,
todo: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}todo'])!,
user: const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}user'])!,
);
}
@override
@ -1210,14 +1205,12 @@ class $TableWithoutPKTable extends TableWithoutPK
@override
CustomRowClass map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
final intType = _db.typeSystem.forDartType<int>();
final doubleType = _db.typeSystem.forDartType<double>();
final stringType = _db.typeSystem.forDartType<String>();
return CustomRowClass(
intType
const IntType()
.mapFromDatabaseResponse(data['${effectivePrefix}not_really_an_id'])!,
doubleType.mapFromDatabaseResponse(data['${effectivePrefix}some_float'])!,
custom: $TableWithoutPKTable.$converter0.mapToDart(stringType
const RealType()
.mapFromDatabaseResponse(data['${effectivePrefix}some_float'])!,
custom: $TableWithoutPKTable.$converter0.mapToDart(const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}custom']))!,
);
}
@ -1237,9 +1230,9 @@ class PureDefault extends DataClass implements Insertable<PureDefault> {
factory PureDefault.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String? prefix}) {
final effectivePrefix = prefix ?? '';
final stringType = db.typeSystem.forDartType<String>();
return PureDefault(
txt: stringType.mapFromDatabaseResponse(data['${effectivePrefix}insert']),
txt: const StringType()
.mapFromDatabaseResponse(data['${effectivePrefix}insert']),
);
}
@override

View File

@ -3,7 +3,6 @@ import 'package:moor_generator/moor_generator.dart';
import 'package:moor_generator/src/utils/string_escaper.dart';
import 'package:moor_generator/src/writer/utils/override_toString.dart';
import 'package:moor_generator/writer.dart';
import 'package:recase/recase.dart';
class DataClassWriter {
final MoorTable table;
@ -84,7 +83,6 @@ class DataClassWriter {
table,
scope.generationOptions,
);
writer.prepareVariables(_buffer);
// finally, the mighty constructor invocation:
_buffer.write('return $dataClassName');
@ -293,30 +291,14 @@ class RowMappingWriter {
final String dbName;
final Map<String, String> _dartTypeToSqlType = {};
Iterable<MoorColumn> get _columns => positional.followedBy(named.keys);
RowMappingWriter(this.positional, this.named, this.table, this.options,
{this.dbName = 'db'});
void prepareVariables(StringBuffer buffer) {
final types = _columns.map((e) => e.variableTypeName).toSet();
for (final usedType in types) {
// final intType = db.typeSystem.forDartType<int>();
final resolver = '${ReCase(usedType).camelCase}Type';
_dartTypeToSqlType[usedType] = resolver;
buffer.write(
'final $resolver = $dbName.typeSystem.forDartType<$usedType>();\n');
}
}
void writeArguments(StringBuffer buffer) {
String readAndMap(MoorColumn column) {
final resolver = _dartTypeToSqlType[column.variableTypeName];
final columnName = "'\${effectivePrefix}${column.name.name}'";
var loadType = '$resolver.mapFromDatabaseResponse(data[$columnName])';
final rawData = "data['\${effectivePrefix}${column.name.name}']";
final sqlType = 'const ${sqlTypes[column.type]}()';
var loadType = '$sqlType.mapFromDatabaseResponse($rawData)';
// run the loaded expression though the custom converter for the final
// result.

View File

@ -149,7 +149,6 @@ class TableWriter {
scope.generationOptions,
dbName: '_db',
);
writer.prepareVariables(_buffer);
final classElement = info.targetClass;
final ctor = info.constructor;

File diff suppressed because it is too large Load Diff