UNPKG

orange-orm

Version:

Object Relational Mapper

69 lines (62 loc) 2.31 kB
const quote = require('./quote'); function insertSql(_context, table, row, options) { let columnNames = []; let regularColumnNames = []; let conflictColumnUpdateSql = ''; let values = []; let sql = 'INSERT INTO ' + quote(table._dbName) + ' '; addDiscriminators(); addColumns(); if (columnNames.length === 0) { sql += 'VALUES ()'; } else { sql = sql + '(' + columnNames.join(',') + ') ' + 'VALUES (' + values.join(',') + ')' + onDuplicateKeyUpdate(); } return sql; function onDuplicateKeyUpdate() { if (options.concurrency === 'skipOnConflict' || options.concurrency === 'overwrite') { return ` ON DUPLICATE KEY UPDATE ${conflictColumnUpdateSql} `; } else { return ''; } } function addDiscriminators() { let discriminators = table._columnDiscriminators; for (let i = 0; i < discriminators.length; i++) { let parts = discriminators[i].split('='); columnNames.push(quote(parts[0])); values.push(parts[1]); } } function addColumns() { let conflictColumnUpdates = []; let columns = table._columns; for (let i = 0; i < columns.length; i++) { let column = columns[i]; const columnName = quote(column._dbName); regularColumnNames.push(columnName); if (row['__' + column.alias] !== undefined) { columnNames.push(columnName); values.push('%s'); addConflictUpdate(column); } } if (conflictColumnUpdates.length === 0) { const column = table._primaryColumns[0]; const columnName = quote(column._dbName); conflictColumnUpdates.push(`${columnName}=VALUES(${columnName})`); } conflictColumnUpdateSql = conflictColumnUpdates.join(','); function addConflictUpdate(column) { let concurrency = options[column.alias]?.concurrency || options.concurrency; const columnName = quote(column._dbName); const tableName = quote(table._dbName); if (concurrency === 'overwrite') { conflictColumnUpdates.push(`${columnName}=VALUES(${columnName})`); } else if (concurrency === 'optimistic') { conflictColumnUpdates.push(`${columnName} = CASE WHEN ${tableName}.${columnName} <> VALUES(${columnName}) THEN CAST('12345678-1234-1234-1234-123456789012Conflict when updating ${columnName}12345678-1234-1234-1234-123456789012' AS SIGNED) ELSE ${tableName}.${columnName} END`); } } } } module.exports = insertSql;