replaceParameters method
Replaces the placeholders in the String
with the values from the provided params
list.
The placeholders are defined by the parameterMatch
parameter.
The parameterMatch
parameter is a String
that defines the placeholder prefix.
Implementation
String replaceParameters(JsonRow params, string parameterMatch) {
String query = this;
if (parameterMatch.isBlank) throw ArgumentError.value(parameterMatch, "parameterMatch", "parameterMatch cannot be blank");
// convert params to string
Map<String, dynamic> convertedParams = {};
for (final param in params.entries) {
convertedParams[param.key] = (param.value as Object?).toString();
}
// find all :placeholders, which can be substituted
final pattern = RegExp("$parameterMatch(\\w+)");
final matches = pattern.allMatches(query).where((match) {
final subString = query.substring(0, match.start);
int count = "'".allMatches(subString).length;
if (count > 0 && count.isOdd) {
return false;
}
count = '"'.allMatches(subString).length;
if (count > 0 && count.isOdd) {
return false;
}
return true;
}).toList();
int lengthShift = 0;
for (final match in matches) {
final paramName = match.group(1);
// check param exists
if (false == convertedParams.containsKey(paramName)) {
convertedParams[paramName!] = "";
}
final newQuery = query.replaceFirst(
match.group(0)!,
convertedParams[paramName]!.toString(),
match.start + lengthShift,
);
lengthShift += newQuery.length - query.length;
query = newQuery;
}
return query;
}