Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions cf/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,14 @@ function Postgres(a, b) {
}
}

// Transaction control runs on the simple protocol (a zero-argument unsafe) so that
// `prepare: true` never names it. A named `commit` whose Bind reaches a pooler backend
// that never parsed it fails with 26000, and the retry of that error re-sends `commit`
// on the now aborted transaction, which Postgres answers with ROLLBACK and no error.
function quoteIdent(name) {
return '"' + name.replace(/"/g, '""') + '"'
}

async function begin(options, fn) {
!fn && (fn = options, options = '')
const queries = Queue()
Expand All @@ -256,7 +264,7 @@ function Postgres(a, b) {
let uncaughtError
, result

name && await sql`savepoint ${ sql(name) }`
name && await sql.unsafe('savepoint ' + quoteIdent(name))
try {
result = await new Promise((resolve, reject) => {
const x = fn(sql)
Expand All @@ -267,16 +275,16 @@ function Postgres(a, b) {
throw uncaughtError
} catch (e) {
await (name
? sql`rollback to ${ sql(name) }`
: sql`rollback`
? sql.unsafe('rollback to ' + quoteIdent(name))
: sql.unsafe('rollback')
)
throw e instanceof PostgresError && e.code === '25P02' && uncaughtError || e
}

if (!name) {
prepare
? await sql`prepare transaction '${ sql.unsafe(prepare) }'`
: await sql`commit`
? await sql.unsafe('prepare transaction \'' + prepare.replace(/'/g, '\'\'') + '\'')
: await sql.unsafe('commit')
}

return result
Expand Down
18 changes: 13 additions & 5 deletions cjs/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,14 @@ function Postgres(a, b) {
}
}

// Transaction control runs on the simple protocol (a zero-argument unsafe) so that
// `prepare: true` never names it. A named `commit` whose Bind reaches a pooler backend
// that never parsed it fails with 26000, and the retry of that error re-sends `commit`
// on the now aborted transaction, which Postgres answers with ROLLBACK and no error.
function quoteIdent(name) {
return '"' + name.replace(/"/g, '""') + '"'
}

async function begin(options, fn) {
!fn && (fn = options, options = '')
const queries = Queue()
Expand All @@ -255,7 +263,7 @@ function Postgres(a, b) {
let uncaughtError
, result

name && await sql`savepoint ${ sql(name) }`
name && await sql.unsafe('savepoint ' + quoteIdent(name))
try {
result = await new Promise((resolve, reject) => {
const x = fn(sql)
Expand All @@ -266,16 +274,16 @@ function Postgres(a, b) {
throw uncaughtError
} catch (e) {
await (name
? sql`rollback to ${ sql(name) }`
: sql`rollback`
? sql.unsafe('rollback to ' + quoteIdent(name))
: sql.unsafe('rollback')
)
throw e instanceof PostgresError && e.code === '25P02' && uncaughtError || e
}

if (!name) {
prepare
? await sql`prepare transaction '${ sql.unsafe(prepare) }'`
: await sql`commit`
? await sql.unsafe('prepare transaction \'' + prepare.replace(/'/g, '\'\'') + '\'')
: await sql.unsafe('commit')
}

return result
Expand Down
18 changes: 13 additions & 5 deletions deno/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,14 @@ function Postgres(a, b) {
}
}

// Transaction control runs on the simple protocol (a zero-argument unsafe) so that
// `prepare: true` never names it. A named `commit` whose Bind reaches a pooler backend
// that never parsed it fails with 26000, and the retry of that error re-sends `commit`
// on the now aborted transaction, which Postgres answers with ROLLBACK and no error.
function quoteIdent(name) {
return '"' + name.replace(/"/g, '""') + '"'
}

async function begin(options, fn) {
!fn && (fn = options, options = '')
const queries = Queue()
Expand All @@ -256,7 +264,7 @@ function Postgres(a, b) {
let uncaughtError
, result

name && await sql`savepoint ${ sql(name) }`
name && await sql.unsafe('savepoint ' + quoteIdent(name))
try {
result = await new Promise((resolve, reject) => {
const x = fn(sql)
Expand All @@ -267,16 +275,16 @@ function Postgres(a, b) {
throw uncaughtError
} catch (e) {
await (name
? sql`rollback to ${ sql(name) }`
: sql`rollback`
? sql.unsafe('rollback to ' + quoteIdent(name))
: sql.unsafe('rollback')
)
throw e instanceof PostgresError && e.code === '25P02' && uncaughtError || e
}

if (!name) {
prepare
? await sql`prepare transaction '${ sql.unsafe(prepare) }'`
: await sql`commit`
? await sql.unsafe('prepare transaction \'' + prepare.replace(/'/g, '\'\'') + '\'')
: await sql.unsafe('commit')
}

return result
Expand Down
18 changes: 13 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,14 @@ function Postgres(a, b) {
}
}

// Transaction control runs on the simple protocol (a zero-argument unsafe) so that
// `prepare: true` never names it. A named `commit` whose Bind reaches a pooler backend
// that never parsed it fails with 26000, and the retry of that error re-sends `commit`
// on the now aborted transaction, which Postgres answers with ROLLBACK and no error.
function quoteIdent(name) {
return '"' + name.replace(/"/g, '""') + '"'
}

async function begin(options, fn) {
!fn && (fn = options, options = '')
const queries = Queue()
Expand All @@ -255,7 +263,7 @@ function Postgres(a, b) {
let uncaughtError
, result

name && await sql`savepoint ${ sql(name) }`
name && await sql.unsafe('savepoint ' + quoteIdent(name))
try {
result = await new Promise((resolve, reject) => {
const x = fn(sql)
Expand All @@ -266,16 +274,16 @@ function Postgres(a, b) {
throw uncaughtError
} catch (e) {
await (name
? sql`rollback to ${ sql(name) }`
: sql`rollback`
? sql.unsafe('rollback to ' + quoteIdent(name))
: sql.unsafe('rollback')
)
throw e instanceof PostgresError && e.code === '25P02' && uncaughtError || e
}

if (!name) {
prepare
? await sql`prepare transaction '${ sql.unsafe(prepare) }'`
: await sql`commit`
? await sql.unsafe('prepare transaction \'' + prepare.replace(/'/g, '\'\'') + '\'')
: await sql.unsafe('commit')
}

return result
Expand Down