icql-dba
Version:
An SQLite DB Adapter built with BetterSQLite3
83 lines (72 loc) • 3.43 kB
text/coffeescript
'use strict'
############################################################################################################
CND = require 'cnd'
rpr = CND.rpr
badge = 'ICQL-DBA/STDLIB'
debug = CND.get_logger 'debug', badge
warn = CND.get_logger 'warn', badge
info = CND.get_logger 'info', badge
urge = CND.get_logger 'urge', badge
help = CND.get_logger 'help', badge
whisper = CND.get_logger 'whisper', badge
echo = CND.echo.bind CND
{ freeze
lets } = require 'letsfreezethat'
#-----------------------------------------------------------------------------------------------------------
= ( clasz = Object ) => class extends clasz
### TAINT use `cfg` ###
create_stdlib: ->
return null if .stdlib_created
.stdlib_created = true
prefix = 'std_'
#-------------------------------------------------------------------------------------------------------
name: prefix + 'str_reverse'
deterministic: true
varargs: false
call: ( s ) -> ( Array.from s ).reverse().join ''
#-------------------------------------------------------------------------------------------------------
name: prefix + 'str_join'
deterministic: true
varargs: true
call: ( joiner, P... ) -> P.join joiner
#-------------------------------------------------------------------------------------------------------
name: prefix + 'str_split_first'
columns: [ 'prefix', 'suffix', ]
parameters: [ 'text', 'splitter', ]
deterministic: true
varargs: false
rows: ( text, splitter ) ->
return null if ( text is null ) or ( splitter is null )
if ( idx = text.indexOf splitter ) < 0 then yield [ text, null, ]
else yield [ text[ ... idx ], text[ idx + 1 .. ], ]
return null
#-------------------------------------------------------------------------------------------------------
name: prefix + 'generate_series'
columns: [ 'value', ]
parameters: [ 'start', 'stop', 'step', ]
varargs: true
deterministic: true
rows: ( start, stop = Infinity, step = 1 ) ->
### NOTE: `stop` differs from SQLite3, which has 9223372036854775807 ###
value = start
loop
break if value > stop
yield [ value, ]
value += step
return null
#-------------------------------------------------------------------------------------------------------
name: prefix + 're_matches'
columns: [ 'match', 'capture', ]
parameters: [ 'text', 'pattern', ]
rows: ( text, pattern ) ->
regex = new RegExp pattern, 'g'
while ( match = regex.exec text )?
yield [ match[ 0 ], ( match[ 1 ] ? null ), ]
return null
#-------------------------------------------------------------------------------------------------------
return null