dbay
Version:
In-Process, In-Memory & File-Based Relational Data Processing with SQLite, BetterSQLite3
131 lines (107 loc) • 5.66 kB
text/coffeescript
'use strict'
############################################################################################################
GUY = require 'guy'
{ alert
debug
help
info
plain
praise
urge
warn
whisper } = GUY.trm.get_loggers 'DBAY/QUERY'
{ rpr
inspect
echo
log } = GUY.trm
#...........................................................................................................
E = require './errors'
#===========================================================================================================
= ( clasz = Object ) => class extends clasz
#---------------------------------------------------------------------------------------------------------
_$query_initialize: ->
GUY.props.def , '_statements', { enumerable: false, value: {}, }
return undefined
#---------------------------------------------------------------------------------------------------------
_clear_statements_cache: ->
delete [ k ] for k of
return null
#---------------------------------------------------------------------------------------------------------
do: ( first, P... ) =>
return switch ( type = .type_of first )
when 'text' then return first, P...
when 'object', 'function' then return first, P...
when 'statement'
statement = first
return if statement.reader then ( statement.iterate P... ) else ( statement.run P... )
throw new E.DBay_wrong_type '^dbay/query@1^', 'a text, an object, or a function', type
#---------------------------------------------------------------------------------------------------------
_query_run_or_execute: ( sql, P... ) ->
return sql, P... if P.length > 0
return sql, P... if [ sql ] is .C.symbols.execute
try
statement = sql
catch error
throw error unless ( error.name is 'RangeError' ) \
and ( error.message is "The supplied SQL string contains more than one statement" )
[ sql ] = .C.symbols.execute
return sql, P...
return if statement.reader then ( statement.iterate P... ) else ( statement.run P... )
#---------------------------------------------------------------------------------------------------------
query: ( sql, P... ) ->
statement = if .isa.statement sql then sql else sql
return if statement.reader then ( statement.iterate P... ) else ( statement.run P... )
#---------------------------------------------------------------------------------------------------------
walk: ( sql, P... ) ->
statement = if .isa.statement sql then sql else sql
return statement.iterate P...
#---------------------------------------------------------------------------------------------------------
all_rows: ( sql, P... ) ->
statement = if .isa.statement sql then sql else sql
return statement.all P...
#---------------------------------------------------------------------------------------------------------
as_object: ( key, sql, P... ) ->
.validate.nonempty_text key
R = {}
for d from sql
R[ d[ key ] ] = d
delete d[ key ] ### TAINT should be optional ###
return R
#---------------------------------------------------------------------------------------------------------
first_row: ( sql, P... ) -> ( sql, P... )[ 0 ] ? null
#---------------------------------------------------------------------------------------------------------
first_values: ( sql, P... ) ->
for row from sql, P...
for key, value of row
yield value
break
return null
#---------------------------------------------------------------------------------------------------------
all_first_values: ( sql, P... ) -> [ ( sql, P... )..., ]
#---------------------------------------------------------------------------------------------------------
single_row: ( sql, P... ) ->
unless ( rows = ( sql, P... ) ).length is 1
throw new E.DBay_expected_single_row '^dbay/query@2^', rows.length
return rows[ 0 ]
#---------------------------------------------------------------------------------------------------------
single_value: ( sql, P... ) ->
row = sql, P...
unless ( keys = Object.keys row ).length is 1
throw new E.DBay_expected_single_value '^dbay/query@4^', keys
return row[ keys[ 0 ] ]
#---------------------------------------------------------------------------------------------------------
execute: ( sql, P... ) ->
throw new E.DBay_argument_not_allowed '^dbay/query@5^', "extra", rpr P if P.length > 0
.exec sql
return null
#---------------------------------------------------------------------------------------------------------
execute_file: ( cfg ) ->
.validate.dbay_execute_file_cfg ( cfg = { .C.defaults.dbay_execute_file_cfg..., cfg..., } )
return ( require 'fs' ).readFileSync cfg.path, { encoding: cfg.encoding, }
#---------------------------------------------------------------------------------------------------------
prepare: ( sql ) ->
sql = .resolve sql if .macros
return ( [ sql ] ?= .prepare sql )
#---------------------------------------------------------------------------------------------------------
pragma: ( P... ) ->
.pragma P...