exportTableData static method

Future<BulkData> exportTableData({
  1. required Database database,
  2. required String table,
  3. Object? lastId,
  4. int limit = 100,
  5. Filter? filter,
})

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),
  );
}