exportTableData static method
Exports data from the provided table.
Implementation
static Future<BulkData> exportTableData({
required Database database,
required String table,
Object? lastId,
int limit = 100,
Filter? filter,
}) async {
var liveTableDefinition = await _getLiveTableDefinition(database, table);
if (liveTableDefinition == null) {
throw BulkDataException(
message: 'The "$table" table was not found in the live database.',
);
}
var targetTableDefinition = await _getTargetTableDefinition(
database,
table,
);
if (targetTableDefinition == null) {
throw BulkDataException(
message: 'The "$table" table was not found in the database definition.',
);
}
var mismatches = liveTableDefinition.like(targetTableDefinition);
if (mismatches.isNotEmpty) {
throw BulkDataException(
message:
'The "$table" table definition does not match the live database:\n'
'- ${mismatches.join('\n- ')}',
);
}
var columns = liveTableDefinition.columns;
var columnSelects = <String>[];
for (var column in columns) {
if (column.columnType.name == 'bytea') {
columnSelects.add('octet_length("${column.name}")');
} else {
columnSelects.add('"${column.name}"');
}
}
var filterQuery = '';
try {
if (filter != null) {
filterQuery = filter.toQuery(targetTableDefinition);
filterQuery = ' AND $filterQuery';
}
} catch (e) {
throw BulkDataException(
message: 'Failed to create filter query ($e).',
);
}
String strLastId = ValueEncoder.instance.convert(lastId);
List<List<dynamic>> data;
var query =
'SELECT ${columnSelects.join(', ')} FROM "$table" '
'WHERE id > $strLastId$filterQuery ORDER BY "id" LIMIT $limit';
try {
data = await database.unsafeQuery(query);
} catch (e) {
throw BulkDataException(
message: 'Failed to query database ($e).',
query: query,
);
}
return BulkData(
tableDefinition: targetTableDefinition,
data: SerializationManager.encode(data),
);
}