dbay
Version:
In-Process, In-Memory & File-Based Relational Data Processing with SQLite, BetterSQLite3
89 lines (72 loc) • 3.51 kB
text/coffeescript
'use strict'
############################################################################################################
E = require './errors'
SQL = String.raw
#===========================================================================================================
@DBay_sqlgen = ( clasz = Object ) => class extends clasz
# #---------------------------------------------------------------------------------------------------------
# _$sqlgen_initialize: ->
# guy.props.def @_me, '_statements', { enumerable: false, value: {}, }
# return undefined
#---------------------------------------------------------------------------------------------------------
prepare_insert: ( cfg ) -> @prepare @create_insert cfg
create_insert: ( cfg ) ->
@types.validate.dbay_create_insert_cfg ( cfg = { @constructor.C.defaults.dbay_create_insert_cfg..., cfg..., } )
{ L, I, V, } = @sql
if cfg.fields?
fields = cfg.fields
else
fields = @_get_field_names cfg.schema, cfg.into
fields = ( field for field in fields when field not in cfg.exclude ) if cfg.exclude?
R = []
R.push "insert into #{I cfg.schema}.#{I cfg.into}"
if fields.length is 0
R.push " default values"
else
R.push " ( "
R.push ( ( I field ) for field in fields ).join ', '
R.push " ) values ( "
### TAINT how to escape dollar placeholders??? ###
R.push ( ( "$#{field}" ) for field in fields ).join ', '
if cfg.on_conflict
R.push " ) "
switch ( type = @types.type_of cfg.on_conflict )
when 'text'
R.push "on conflict #{cfg.on_conflict}"
when 'object'
### `cfg.on_conflict.update` is `true` ###
R.push "on conflict do update set "
R.push ( "#{I field} = excluded.#{I field}" for field in fields ).join ', '
else
throw new E.DBay_wrong_type '^dbay/sqlgen@1^', "a nonempty_text or an object", type
else
R.push " )"
R.push " returning #{cfg.returning}" if cfg.returning?
R.push ";"
return R.join ''
#---------------------------------------------------------------------------------------------------------
_get_field_names: ( schema, name ) ->
schema_i = @sql.I schema
statement = @prepare SQL"select name from #{schema_i}.pragma_table_info( $name );"
statement.raw true
R = ( row[ 0 ] for row from statement.iterate { name, } )
throw new E.DBay_object_unknown '^dbay/sqlgen@1^', schema, name if R.length is 0
return R
# #---------------------------------------------------------------------------------------------------------
# _get_fields: ( schema, name ) ->
# ### TAINT rewrite; see above ###
# # @types.validate.dbay_fields_of_cfg ( cfg = { @constructor.C.defaults.dbay_fields_of_cfg..., cfg..., } )
# schema_i = @sql.I schema
# R = []
# for d from @all_rows SQL"select * from #{schema_i}.pragma_table_info( $name );", { name, }
# # { cid: 0, name: 'id', type: 'integer', notnull: 1, dflt_value: null, pk: 1 }
# type = if d.type is '' then null else d.type
# R.push {
# idx: d.cid
# type: type
# name: d.name
# optional: !d.notnull
# default: d.dflt_value
# is_pk: !!d.pk }
# throw new E.DBay_object_unknown '^dbay/sqlgen@1^', schema, name if R.length is 0
# return R