summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/libs-imp-mysql.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2020-07-20 11:09:33 +0200
committerContext Git Mirror Bot <phg@phi-gamma.net>2020-07-20 11:09:33 +0200
commit81095dd1bf20eb5f7e126adbdc8047f940504180 (patch)
treec0cdf7b074e8a2d00c56fde09519e89f155bd425 /tex/context/base/mkiv/libs-imp-mysql.lua
parentf1129626606384a7a55a21a83531f51f8b5dee25 (diff)
downloadcontext-81095dd1bf20eb5f7e126adbdc8047f940504180.tar.gz
2020-07-20 10:42:00
Diffstat (limited to 'tex/context/base/mkiv/libs-imp-mysql.lua')
-rw-r--r--tex/context/base/mkiv/libs-imp-mysql.lua220
1 files changed, 0 insertions, 220 deletions
diff --git a/tex/context/base/mkiv/libs-imp-mysql.lua b/tex/context/base/mkiv/libs-imp-mysql.lua
deleted file mode 100644
index 3e938a6de..000000000
--- a/tex/context/base/mkiv/libs-imp-mysql.lua
+++ /dev/null
@@ -1,220 +0,0 @@
-if not modules then modules = { } end modules ['libs-imp-mysql'] = {
- version = 1.001,
- comment = "companion to util-sql.lua",
- author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
- copyright = "PRAGMA ADE / ConTeXt Development Team",
- license = "see context related readme files"
-}
-
--- c:/data/develop/tex-context/tex/texmf-win64/bin/lib/luametatex/lua/copies/mysql/libmysql.dll
-
-local libname = "mysql"
-local libfile = "libmysql"
-
-local mysqllib = resolvers.libraries.validoptional(libname)
-
-if not mysqllib then return end
-
-local function okay()
- if resolvers.libraries.optionalloaded(libname,libfile) then
- okay = function() return true end
- else
- okay = function() return false end
- end
- return okay()
-end
-
-local lpegmatch = lpeg.match
-local setmetatable = setmetatable
-
-local sql = utilities.sql or require("util-sql")
-local report = logs.reporter(libname)
-
-local trace_sql = false trackers.register("sql.trace", function(v) trace_sql = v end)
-local trace_queries = false trackers.register("sql.queries",function(v) trace_queries = v end)
-
-local mysql_open = mysqllib.open
-local mysql_close = mysqllib.close
-local mysql_execute = mysqllib.execute
-local mysql_getmessage = mysqllib.getmessage
-
-local helpers = sql.helpers
-local methods = sql.methods
-local validspecification = helpers.validspecification
-local preparetemplate = helpers.preparetemplate
-local querysplitter = helpers.querysplitter
-local cache = { }
-local timeout -- = 3600 -- to be tested
-
-local function connect(specification)
- local db = mysql_open(
- specification.database or "",
- specification.username or "",
- specification.password or "",
- specification.host or "",
- specification.port
- )
- if db and timeout then
- mysql_execute(db,formatters["SET SESSION connect_timeout=%s ;"](timeout))
- end
- return db
-end
-
-local function execute_once(specification,retry)
- if okay() then
- if trace_sql then
- report("executing mysql")
- end
- if not validspecification(specification) then
- report("error in specification")
- end
- local query = preparetemplate(specification)
- if not query then
- report("error in preparation")
- return
- else
- query = lpegmatch(querysplitter,query)
- end
- local base = specification.database -- or specification.presets and specification.presets.database
- if not base then
- report("no database specified")
- return
- end
- local result = { }
- local keys = { }
- local id = specification.id
- local db = nil
- if id then
- local session = cache[id]
- if session then
- db = session.db
- else
- db = connect(specification)
- if not db then
- report("no session database specified")
- else
- cache[id] = {
- specification = specification,
- db = db,
- }
- end
- end
- else
- db = connect(specification)
- end
- if not db then
- report("no database opened")
- else
- local converter = specification.converter
- local nofrows = 0
- local callback = nil
- if converter then
- local convert = converter.mysql
- callback = function(nofcolumns,values,fields)
- nofrows = nofrows + 1
- result[nofrows] = convert(values)
- end
- else
- callback = function(nofcolumns,values,fields)
- local column = { }
- for i=1,nofcolumns do
- local field
- if fields then
- field = fields[i]
- keys[i] = field
- else
- field = keys[i]
- end
- if field then
- column[field] = values[i]
- end
- end
- nofrows = nofrows + 1
- result[nofrows] = column
- end
- end
- for i=1,#query do
- local okay = mysql_execute(db,query[i],callback)
- if not okay then
- if id and retry and i == 1 then
- report("error: %s, retrying to connect",mysql_getmessage(db))
- mysql_close(db)
- cache[id] = nil
- return execute_once(specification,false)
- else
- report("error: %s",mysql_getmessage(db))
- end
- end
- end
- end
- if db and not id then
- mysql_close(db)
- end
- -- bonus
- local one = result[1]
- if one then
- setmetatable(result,{ __index = one } )
- end
- --
- return result, keys
- else
- report("error: ","no library loaded")
- end
-end
-
-local function execute(specification)
- return execute_once(specification,true)
-end
-
--- Here we build the dataset stepwise so we don't use the data hack that
--- is used in the client variant.
-
-local wraptemplate = [[
-local converters = utilities.sql.converters
-local deserialize = utilities.sql.deserialize
-
-local tostring = tostring
-local tonumber = tonumber
-local booleanstring = string.booleanstring
-
-%s
-
-return function(cells)
- -- %s (not needed)
- -- %s (not needed)
- return {
- %s
- }
-end
-]]
-
--- return function(result)
--- if not result then
--- return { }
--- end
--- local nofrows = #result
--- if nofrows == 0 then
--- return { }
--- end
--- local target = { } -- no %s needed here
--- for i=1,nofrows do
--- target[%s] = {
--- %s
--- }
--- end
--- return result
--- end
-
-local celltemplate = "cells[%s]"
-
-methods.mysql = {
- execute = execute,
- usesfiles = false,
- wraptemplate = wraptemplate,
- celltemplate = celltemplate,
-}
-
-package.loaded["util-sql-imp-ffi"] = methods.mysql
-package.loaded["util-sql-imp-mysql"] = methods.mysql
-package.loaded["util-sql-imp-library"] = methods.mysql
-package.loaded[libname] = methods.mysql