-
-
Save lefnire/26d72911ee7fb7dcf82fc5d919d192a5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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