Skip to content

Instantly share code, notes, and snippets.

@lefnire
Last active December 15, 2022 05:43
Show Gist options
  • Save lefnire/26d72911ee7fb7dcf82fc5d919d192a5 to your computer and use it in GitHub Desktop.
Save lefnire/26d72911ee7fb7dcf82fc5d919d192a5 to your computer and use it in GitHub Desktop.
// arrayValue doesn't work in rds-data-client, even though it's part of the documentation. Just says "not supported"
// https://github.com/aws/aws-sdk/issues/9#issuecomment-1104182976
type ExecuteStatementCommandInput_ = Pick<ExecuteStatementCommandInput, 'sql' | 'parameters'>
// TODO support multiple datatypes (currently only supports string)
arrayValueFix({sql, parameters}: ExecuteStatementCommandInput_): ExecuteStatementCommandInput_ {
let fixedSql = sql
let fixedParameters: ExecuteStatementCommandInput["parameters"] = []
let offset = 0
parameters.forEach((parameter, i) => {
if (!parameter.value.arrayValue) {
fixedParameters.push(parameter)
return // all good, carry on
}
const values = parameter.value.arrayValue.stringValues
if (!values) {
throw "Currently only applied arrayValue for stringValues. Fix this if need other array value-types"
}
const paramsSeparate = values.map((value, idx) => ({
name: `id${idx + offset}`,
value: {stringValue: value},
typeHint: parameter.typeHint
}))
// @ts-ignore
const placeholder = [...Array(values.length).keys()]
.map(idx => `:id${idx + offset}`).join(',')
offset += values.length
fixedSql = fixedSql.replace(
`:${parameter.name}`,
`(${placeholder})`
)
fixedParameters = [...fixedParameters, ...paramsSeparate]
})
return {sql: fixedSql, parameters: fixedParameters}
}
async function executeStatement<O = object>(statement: ExecuteStatementCommandInput_): Promise<O[]> {
const {sql, parameters} = this.arrayValueFix(statement)
const response = await rdsClient.executeStatement({
includeResultMetadata: true,
secretArn: RDS.db.secretArn,
resourceArn: RDS.db.clusterArn,
database: RDS.db.defaultDatabaseName,
sql,
parameters
})
}
// Run like this
// -------------------
const tags = await db.executeStatement<Tag>({
sql: `select * from tags where id in :tids and user_id=:user_id`,
parameters: [
{name: "tids", typeHint: "UUID", value: {arrayValue: {stringValues: tids}}},
{name: "user_id", typeHint: "UUID", value: {stringValue: context.user.id}}
]
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment