dbay
Version:
In-Process, In-Memory & File-Based Relational Data Processing with SQLite, BetterSQLite3
122 lines (105 loc) • 5.04 kB
text/coffeescript
'use strict'
############################################################################################################
GUY = require 'guy'
{ alert
debug
help
info
plain
praise
urge
warn
whisper } = GUY.trm.get_loggers 'DBAY/HELPERS'
{ rpr
inspect
echo
log } = GUY.trm
#...........................................................................................................
PATH = require 'path'
FS = require 'fs'
shm_path = '/dev/shm'
LFT = require 'letsfreezethat'
#-----------------------------------------------------------------------------------------------------------
= ( path ) ->
try
return ( FS.statSync path ).isDirectory()
catch error
throw error unless error.code is 'ENOENT'
return false
#-----------------------------------------------------------------------------------------------------------
= ( path ) ->
try
return ( FS.statSync path ).isFile()
catch error
throw error unless error.code is 'ENOENT'
return false
#-----------------------------------------------------------------------------------------------------------
= ( path ) ->
### Given a `path`, unlink the associated file; in case no file is found, ignore silently. If an error
occurs, just print a warning. To be used in an exit handler, so no error handling makes sense here. ###
try FS.unlinkSync path catch error
warn '^dbay@1^', error.message unless error.code is 'ENOENT'
return null
#-----------------------------------------------------------------------------------------------------------
= if shm_path then shm_path else ( require 'os' ).tmpdir()
#-----------------------------------------------------------------------------------------------------------
= ( parts, expressions... ) ->
R = parts[ 0 ]
for expression, idx in expressions
R += expression.toString() + parts[ idx + 1 ]
return R
#-----------------------------------------------------------------------------------------------------------
= ( d ) ->
R = {}
R[ k ] = v for k, v of d when v?
return R
#-----------------------------------------------------------------------------------------------------------
= def = Object.defineProperty
= hide = ( object, name, value ) => Object.defineProperty object, name,
enumerable: false
writable: true
configurable: true
value: value
#-----------------------------------------------------------------------------------------------------------
= ( d, fallback, keys... ) ->
R = {}
keys = keys.flat Infinity
for key in keys
R[ key ] = if ( value = d[ key ] ) is undefined then fallback else value
return [ R, keys, ]
#-----------------------------------------------------------------------------------------------------------
= ( d, fallback, keys... ) -> ( d, fallback, keys )[ 0 ]
#-----------------------------------------------------------------------------------------------------------
= ( d, fallback, keys... ) ->
[ R, keys, ] = d, fallback, keys...
delete d[ key ] for key in keys
return R
#-----------------------------------------------------------------------------------------------------------
= def_oneoff = ( object, name, cfg, method ) =>
get = ->
R = method.apply object
delete cfg.get
def object, name,
configurable: ( cfg.configurable ? true )
enumerable: ( cfg.enumerable ? true )
value: R
return R
def object, name, { enumerable: true, configurable: true, get, }
return null
#-----------------------------------------------------------------------------------------------------------
= ( self, cfg = null, types = null ) =>
{ props, } = require '..'
clasz = self.constructor
#.........................................................................................................
### assign defaults object where to be found to obtain viable `cfg` object: ###
defaults = clasz.C?.defaults?.constructor_cfg ? null
self.cfg = { defaults..., cfg..., }
#.........................................................................................................
### procure `types` where not given; make it a non-enumerable to avoid rpr of object: ###
types ?= new ( require 'intertype' ).Intertype()
self, 'types', { enumerable: false, value: types, }
#.........................................................................................................
### call class method `declare_types()`; this method may perform `self.types.validate.constructor_cfg self.cfg`: ###
clasz.declare_types self if clasz.declare_types?
self.cfg = LFT.freeze self.cfg
return undefined