upsert method

  1. @override
Future<bool> upsert(
  1. Map<String, dynamic> values,
  2. List<String> uniqueBy, [
  3. Map<String, dynamic>? update
])
inherited

Implementation

@override
Future<bool> upsert(
  Map<String, dynamic> values,
  List<String> uniqueBy, [
  Map<String, dynamic>? update,
]) async {
  try {
    if (values.isEmpty) {
      throw InvalidArgumentException(
        "Values map cannot be empty for upsert operation.",
      );
    }

    conn = await getConnection();
    final columns = values.keys.toList();
    final paramBindings = <String, dynamic>{};

    final placeholders = values.keys
        .map((key) {
          final paramName = _nextParamName();
          paramBindings[paramName] = values[key];
          return ":$paramName";
        })
        .join(", ");

    String sql =
        "INSERT INTO $getTable (${columns.join(', ')}) VALUES ($placeholders)";

    if (update == null) {
      update = Map.from(values);
      for (var col in uniqueBy) {
        update.remove(col);
      }
    }

    if (update.isNotEmpty) {
      final updateClauses = update.entries
          .map((entry) {
            final paramName = _nextParamName();
            paramBindings[paramName] = entry.value;
            return "${entry.key} = :$paramName";
          })
          .join(", ");

      sql += " ON DUPLICATE KEY UPDATE $updateClauses";
    }

    await conn.execute(sql, paramBindings);
    return true;
  } catch (e) {
    rethrow;
  }
}