Skip to content

Commit

Permalink
Merge 2c50836 into c228517
Browse files Browse the repository at this point in the history
  • Loading branch information
Sharaal committed Jul 3, 2019
2 parents c228517 + 2c50836 commit 2706fb2
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 41 deletions.
47 changes: 26 additions & 21 deletions index.js
Expand Up @@ -45,16 +45,16 @@ sql.defaultSerialColumn = 'id'

sql.insert = async (...params) => {
if (typeof params[0] === 'string') {
let [table, rows, { keys, serialColumn: serialColumn = sql.defaultSerialColumn } = {}] = params
let [table, rows, { columns, serialColumn: serialColumn = sql.defaultSerialColumn } = {}] = params
let array = true
if (!Array.isArray(rows)) {
rows = [rows]
array = false
}
if (!keys) {
keys = Object.keys(rows[0])
if (!columns) {
columns = Object.keys(rows[0])
}
const result = await sql.query(sql`INSERT INTO ${sql.key(table)} (${sql.keys(keys)}) VALUES ${sql.valuesList(rows, { keys })} RETURNING ${sql.key(serialColumn)}`)
const result = await sql.query(sql`INSERT INTO ${sql.table(table)} (${sql.columns(columns)}) VALUES ${sql.valuesList(rows, { columns })} RETURNING ${sql.column(serialColumn)}`)
if (!array) {
return result.rows[0][serialColumn]
}
Expand All @@ -68,7 +68,7 @@ sql.insert = async (...params) => {
sql.update = async (...params) => {
if (typeof params[0] === 'string') {
const [table, updates, conditions] = params
params = [sql`UPDATE ${sql.key(table)} SET ${sql.assignments(updates)} WHERE ${sql.conditions(conditions)}`]
params = [sql`UPDATE ${sql.table(table)} SET ${sql.assignments(updates)} WHERE ${sql.conditions(conditions)}`]
}
const [query] = params
const result = await sql.query(query)
Expand All @@ -78,7 +78,7 @@ sql.update = async (...params) => {
sql.delete = async (...params) => {
if (typeof params[0] === 'string') {
const [table, conditions] = params
params = [sql`DELETE FROM ${sql.key(table)} WHERE ${sql.conditions(conditions)}`]
params = [sql`DELETE FROM ${sql.table(table)} WHERE ${sql.conditions(conditions)}`]
}
const [query] = params
const result = await sql.query(query)
Expand All @@ -92,7 +92,7 @@ sql.any = async (...params) => {
conditions = columns
columns = ['*']
}
params = [sql`SELECT ${sql.keys(columns)} FROM ${sql.key(table)} WHERE ${sql.conditions(conditions)}`]
params = [sql`SELECT ${sql.columns(columns)} FROM ${sql.table(table)} WHERE ${sql.conditions(conditions)}`]
}
const [query] = params
const result = await sql.query(query)
Expand Down Expand Up @@ -125,25 +125,30 @@ sql.one = async (...params) => {
return row
}

function escapeKey (key) {
return `"${key.replace(/"/g, '""')}"`
function escapeIdentifier (identifier) {
return `"${identifier.replace(/"/g, '""')}"`
}

sql.keys = keys => {
if (!Array.isArray(keys)) {
keys = Object.keys(keys)
sql.table = table => () => ({
text: escapeIdentifier(table),
parameters: []
})

sql.columns = columns => {
if (!Array.isArray(columns)) {
columns = Object.keys(columns)
}
return () => ({
text: keys.map(escapeKey).join(', '),
text: columns.map(escapeIdentifier).join(', '),
parameters: []
})
}

sql.key = key => sql.keys([key])
sql.column = column => sql.columns([column])

sql.values = (values, { keys: keys = Object.keys(values) } = {}) => {
sql.values = (values, { columns: columns = Object.keys(values) } = {}) => {
if (!Array.isArray(values)) {
values = keys.map(key => values[key])
values = columns.map(column => values[column])
}
return parameterPosition => ({
text: Array.apply(null, { length: values.length }).map(() => `$${++parameterPosition}`).join(', '),
Expand All @@ -153,11 +158,11 @@ sql.values = (values, { keys: keys = Object.keys(values) } = {}) => {

sql.value = value => sql.values([value])

sql.valuesList = (valuesList, { keys: keys = Object.keys(valuesList[0]) } = {}) =>
sql.valuesList = (valuesList, { columns: columns = Object.keys(valuesList[0]) } = {}) =>
parameterPosition => {
const queries = []
for (const values of valuesList) {
const query = sql.values(values, { keys })(parameterPosition)
const query = sql.values(values, { columns })(parameterPosition)
queries.push({
text: `(${query.text})`,
parameters: query.parameters
Expand All @@ -176,10 +181,10 @@ sql.valuesList = (valuesList, { keys: keys = Object.keys(valuesList[0]) } = {})
function pairs (pairs, separator) {
return parameterPosition => {
const queries = []
for (const key of Object.keys(pairs)) {
const value = sql.value(pairs[key])(parameterPosition++)
for (const column of Object.keys(pairs)) {
const value = sql.value(pairs[column])(parameterPosition++)
queries.push({
text: `${escapeKey(key)} = ${value.text}`,
text: `${escapeIdentifier(column)} = ${value.text}`,
parameters: value.parameters
})
}
Expand Down
8 changes: 4 additions & 4 deletions test/manipulation-methods/sql.insert.js
Expand Up @@ -158,7 +158,7 @@ describe('sql.update', () => {
)
})

it('insert given keys of row', async () => {
it('insert given columns of row', async () => {
const expectedId = 5
const client = {
query: sinon.fake.returns(Promise.resolve({ rows: [{ id: expectedId }] }))
Expand All @@ -168,7 +168,7 @@ describe('sql.update', () => {
const actualId = await sql.insert(
'table',
{ column1: 'value1', column2: 'value2', column3: 'value3', column4: 'value4' },
{ keys: ['column1', 'column2'] }
{ columns: ['column1', 'column2'] }
)

assert.equal(actualId, expectedId)
Expand All @@ -187,7 +187,7 @@ describe('sql.update', () => {
)
})

it('insert given keys of multiple rows', async () => {
it('insert given columns of multiple rows', async () => {
const expectedIds = [5, 15, 25]
const client = {
query: sinon.fake.returns(Promise.resolve({ rows: expectedIds.map(id => ({ id })) }))
Expand All @@ -201,7 +201,7 @@ describe('sql.update', () => {
{ column1: 'value21', column2: 'value22', column3: 'value23', column4: 'value24' },
{ column1: 'value31', column2: 'value32', column3: 'value33', column4: 'value34' }
],
{ keys: ['column1', 'column2'] }
{ columns: ['column1', 'column2'] }
)

assert.deepEqual(actualIds, expectedIds)
Expand Down
10 changes: 5 additions & 5 deletions test/tag-helpers/sql.key.js → test/tag-helpers/sql.column.js
@@ -1,20 +1,20 @@
const sql = require('../../')
const { testTagHelper } = require('../test')

describe('sql.key', () => {
it('escapes the given key', () => {
describe('sql.column', () => {
it('escapes the given column', () => {
testTagHelper(
sql.key('column'),
sql.column('column'),
{
text: '"column"',
parameters: []
}
)
})

it('escapes the given unsecure key', () => {
it('escapes the given unsecure column', () => {
testTagHelper(
sql.key('column"column'),
sql.column('column"column'),
{
text: '"column""column"',
parameters: []
Expand Down
14 changes: 7 additions & 7 deletions test/tag-helpers/sql.keys.js → test/tag-helpers/sql.columns.js
@@ -1,30 +1,30 @@
const sql = require('../../')
const { testTagHelper } = require('../test')

describe('sql.keys', () => {
it('escape the given keys', () => {
describe('sql.columns', () => {
it('escape the given columns', () => {
testTagHelper(
sql.keys(['column1', 'column2', 'column3']),
sql.columns(['column1', 'column2', 'column3']),
{
text: '"column1", "column2", "column3"',
parameters: []
}
)
})

it('escape the given unsecure keys', () => {
it('escape the given unsecure columns', () => {
testTagHelper(
sql.keys(['column1"column1', 'column2"column2', 'column3"column3']),
sql.columns(['column1"column1', 'column2"column2', 'column3"column3']),
{
text: '"column1""column1", "column2""column2", "column3""column3"',
parameters: []
}
)
})

it('exchange the keys of the given object', () => {
it('exchange the columns of the given object', () => {
testTagHelper(
sql.keys({ column1: 'value1', column2: 'value2', column3: 'value3' }),
sql.columns({ column1: 'value1', column2: 'value2', column3: 'value3' }),
{
text: '"column1", "column2", "column3"',
parameters: []
Expand Down
24 changes: 24 additions & 0 deletions test/tag-helpers/sql.table.js
@@ -0,0 +1,24 @@
const sql = require('../../')
const { testTagHelper } = require('../test')

describe('sql.table', () => {
it('escapes the given table', () => {
testTagHelper(
sql.table('table'),
{
text: '"table"',
parameters: []
}
)
})

it('escapes the given unsecure table', () => {
testTagHelper(
sql.table('table"table'),
{
text: '"table""table"',
parameters: []
}
)
})
})
4 changes: 2 additions & 2 deletions test/tag-helpers/sql.values.js
Expand Up @@ -28,11 +28,11 @@ describe('sql.values', () => {
)
})

it('exchange only the values of the given keys of the given object', () => {
it('exchange only the values of the given columns of the given object', () => {
testTagHelper(
sql.values(
{ column1: 'value1', column2: 'value2', column3: 'value3', column4: 'value4' },
{ keys: ['column1', 'column2'] }
{ columns: ['column1', 'column2'] }
),
{
text: {
Expand Down
4 changes: 2 additions & 2 deletions test/tag-helpers/sql.valuesList.js
Expand Up @@ -53,15 +53,15 @@ describe('sql.valuesList', () => {
)
})

it('exchange only the values of the given keys of the given objects of the list', () => {
it('exchange only the values of the given columns of the given objects of the list', () => {
testTagHelper(
sql.valuesList(
[
{ column1: 'value11', column2: 'value12', column3: 'value13', column4: 'value14' },
{ column1: 'value21', column2: 'value22', column3: 'value23', column4: 'value24' },
{ column1: 'value31', column2: 'value32', column3: 'value33', column4: 'value34' }
],
{ keys: ['column1', 'column2'] }
{ columns: ['column1', 'column2'] }
),
{
text: {
Expand Down

0 comments on commit 2706fb2

Please sign in to comment.