Skip to content

Commit a2a8fbb

Browse files
committed
#706 Fix single character escaping in the bookkeeping deletion method.
1 parent 513ba26 commit a2a8fbb

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

pramen/core/src/main/scala/za/co/absa/pramen/core/bookkeeper/BookkeeperJdbc.scala

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,11 @@ class BookkeeperJdbc(db: Database, profile: JdbcProfile, batchId: Long) extends
181181
val hasWildcard = tableName.contains("*")
182182

183183
val escape = '\\'
184+
val tableNameTrimmed = tableName.trim
184185
val baseEscaped = tableName.trim
185186
.replace("\\", "\\\\")
186187
.replace("%", "\\%")
188+
.replace("_", "\\_")
187189

188190
val tableNameEscaped = if (hasWildcard) baseEscaped.replace("*", "%") else baseEscaped
189191

@@ -195,10 +197,10 @@ class BookkeeperJdbc(db: Database, profile: JdbcProfile, batchId: Long) extends
195197
val patternForLogging = if (hasWildcard)
196198
s"'$likePattern'"
197199
else
198-
s"'$tableNameEscaped' or '$likePattern'"
200+
s"'$tableNameTrimmed' or '$likePattern'"
199201

200202
val listQuery = BookkeepingRecords.records
201-
.filter(r => r.pramenTableName === tableNameEscaped || r.pramenTableName.like(likePattern, escape))
203+
.filter(r => r.pramenTableName === tableNameTrimmed || r.pramenTableName.like(likePattern, escape))
202204
.map(_.pramenTableName)
203205
.distinct
204206

@@ -208,34 +210,34 @@ class BookkeeperJdbc(db: Database, profile: JdbcProfile, batchId: Long) extends
208210
throw new IllegalArgumentException(s"The table wildcard '$tableName' matches more than 100 tables (${tablesToDelete.length}). To avoid accidental deletions, please refine the wildcard.")
209211

210212
val deletionQuery = BookkeepingRecords.records
211-
.filter(r => r.pramenTableName === tableNameEscaped || r.pramenTableName.like(likePattern))
213+
.filter(r => r.pramenTableName === tableNameTrimmed || r.pramenTableName.like(likePattern))
212214
.delete
213215

214216
try {
215217
val deletedBkCount = SlickUtils.executeAction(db, deletionQuery)
216218
log.info(s"Deleted $deletedBkCount records from the bookkeeping table for tables matching $patternForLogging: ${tablesToDelete.mkString(", ")}")
217219

218220
val deletedSchemaCount = SlickUtils.executeAction(db, SchemaRecords.records
219-
.filter(r => r.pramenTableName === tableNameEscaped || r.pramenTableName.like(likePattern, escape))
221+
.filter(r => r.pramenTableName === tableNameTrimmed || r.pramenTableName.like(likePattern, escape))
220222
.delete
221223
)
222224
log.info(s"Deleted $deletedSchemaCount records from the schemas table.")
223225

224226
val deletedOffsetsCount = SlickUtils.executeAction(db, OffsetRecords.records
225-
.filter(r => r.pramenTableName === tableNameEscaped || r.pramenTableName.like(likePattern, escape))
227+
.filter(r => r.pramenTableName === tableNameTrimmed || r.pramenTableName.like(likePattern, escape))
226228
.delete
227229
)
228230
log.info(s"Deleted $deletedOffsetsCount records from the offsets table.")
229231

230232
val deletedMetadataCount = SlickUtils.executeAction(db, MetadataRecords.records
231-
.filter(r => r.pramenTableName === tableNameEscaped || r.pramenTableName.like(likePattern, escape))
233+
.filter(r => r.pramenTableName === tableNameTrimmed || r.pramenTableName.like(likePattern, escape))
232234
.delete
233235
)
234236
log.info(s"Deleted $deletedMetadataCount records from the metadata table.")
235237

236238
tablesToDelete
237239
} catch {
238-
case NonFatal(ex) => throw new RuntimeException(s"Unable to delete records from the bookkeeping table for tables matching '$likePattern'.", ex)
240+
case NonFatal(ex) => throw new RuntimeException(s"Unable to delete records from the bookkeeping table for tables matching '$patternForLogging'.", ex)
239241
}
240242
}
241243

0 commit comments

Comments
 (0)