epiquery2
Version:
run templated queries from the http's using learnings from 1
72 lines (60 loc) • 2.43 kB
text/coffeescript
fs = require 'fs'
_ = require 'underscore'
path = require 'path'
log = require 'simplog'
config = require './config.coffee'
events = require 'events'
buffer = require './util/buffer.coffee'
DRIVERS={}
QUERY_EXEC_TIME_STATS={}
QUERIES_EXECUTED={}
loadDrivers = (driverPath) ->
log.info "loading drivers from %s", driverPath
for file in fs.readdirSync(driverPath)
# ignore hidden files
continue if file[0] is '.'
log.debug "loading driver from #{file}"
driverModule = require path.join(driverPath, file)
if driverModule.DriverClass
driverName = file.replace(/\.coffee$/,'').replace(/\.js/,'')
DRIVERS[driverName] =
class: driverModule.DriverClass
module: driverModule
name: driverName
log.info "driver '#{driverName}' loaded"
else
log.error "Unable to find execute in module #{file}"
selectDriver = (connectionConfig) ->
DRIVERS[connectionConfig.driver]
init = () ->
# load out-of-the-box drivers
loadDrivers(path.join(__dirname, 'drivers'))
# load any additional drivers indicated by configuration
config.driverDirectory and loadDrivers(config.driverDirectory)
trackExecutionTime = (templateName, executionTime) ->
if QUERY_EXEC_TIME_STATS[templateName] == undefined
QUERY_EXEC_TIME_STATS[templateName] = new buffer.CircularBuffer(25)
QUERY_EXEC_TIME_STATS[templateName].store(executionTime)
trackInflightQuery = (templateName) ->
if not QUERIES_EXECUTED[templateName]
QUERIES_EXECUTED[templateName] = 0
QUERIES_EXECUTED[templateName]++
removeInflightQuery = (templateName) ->
if QUERIES_EXECUTED[templateName]
QUERIES_EXECUTED[templateName] = QUERIES_EXECUTED[templateName] - 1
getInflightQueries = () ->
inflightQueries = {}
_.each QUERIES_EXECUTED, (v, k, l) ->
inflightQueries[k] = v if v > 0
return inflightQueries
module.exports.init = init
module.exports.loadDrivers = loadDrivers
module.exports.selectDriver = selectDriver
module.exports.drivers = DRIVERS
module.exports.QueryStats = {buffer: new buffer.CircularBuffer(25)}
module.exports.storeQueryExecutionTime = trackExecutionTime
module.exports.getQueryExecutionTimes = QUERY_EXEC_TIME_STATS
module.exports.trackInflightQuery = trackInflightQuery
module.exports.removeInflightQuery = removeInflightQuery
module.exports.getInflightQueries = getInflightQueries
module.exports.events = new events.EventEmitter()