155 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local promise = promise
 | |
| local Await = Citizen.Await
 | |
| local resourceName = GetCurrentResourceName()
 | |
| local GetResourceState = GetResourceState
 | |
| 
 | |
| local options = {
 | |
| 	return_callback_errors = false
 | |
| }
 | |
| 
 | |
| for i = 1, GetNumResourceMetadata(resourceName, 'mysql_option') do
 | |
| 	local option = GetResourceMetadata(resourceName, 'mysql_option', i - 1)
 | |
| 	options[option] = true
 | |
| end
 | |
| 
 | |
| local function await(fn, query, parameters)
 | |
| 	local p = promise.new()
 | |
| 
 | |
| 	fn(nil, query, parameters, function(result, error)
 | |
| 		if error then
 | |
| 			return p:reject(error)
 | |
| 		end
 | |
| 
 | |
| 		p:resolve(result)
 | |
| 	end, resourceName, true)
 | |
| 
 | |
| 	return Await(p)
 | |
| end
 | |
| 
 | |
| local type = type
 | |
| local queryStore = {}
 | |
| 
 | |
| local function safeArgs(query, parameters, cb, transaction)
 | |
| 	local queryType = type(query)
 | |
| 
 | |
| 	if queryType == 'number' then
 | |
| 		query = queryStore[query]
 | |
| 		assert(query, "First argument received invalid query store reference")
 | |
| 	elseif transaction then
 | |
| 		if queryType ~= 'table' then
 | |
| 			error(("First argument expected table, received '%s'"):format(query))
 | |
| 		end
 | |
| 	elseif queryType ~= 'string' then
 | |
| 		error(("First argument expected string, received '%s'"):format(query))
 | |
| 	end
 | |
| 
 | |
| 	if parameters then
 | |
| 		local paramType = type(parameters)
 | |
| 
 | |
| 		if paramType ~= 'table' and paramType ~= 'function' then
 | |
| 			error(("Second argument expected table or function, received '%s'"):format(parameters))
 | |
| 		end
 | |
| 
 | |
| 		if paramType == 'function' or parameters.__cfx_functionReference then
 | |
| 			cb = parameters
 | |
| 			parameters = nil
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	if cb and parameters then
 | |
| 		local cbType = type(cb)
 | |
| 
 | |
| 		if cbType ~= 'function' and (cbType == 'table' and not cb.__cfx_functionReference) then
 | |
| 			error(("Third argument expected function, received '%s'"):format(cb))
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	return query, parameters, cb
 | |
| end
 | |
| 
 | |
| local oxmysql = exports.oxmysql
 | |
| 
 | |
| local mysql_method_mt = {
 | |
| 	__call = function(self, query, parameters, cb)
 | |
| 		query, parameters, cb = safeArgs(query, parameters, cb, self.method == 'transaction')
 | |
| 		return oxmysql[self.method](nil, query, parameters, cb, resourceName, options.return_callback_errors)
 | |
| 	end
 | |
| }
 | |
| 
 | |
| local MySQL = setmetatable(MySQL or {}, {
 | |
| 	__index = function(_, index)
 | |
| 		return function(...)
 | |
| 			return oxmysql[index](nil, ...)
 | |
| 		end
 | |
| 	end
 | |
| })
 | |
| 
 | |
| for _, method in pairs({
 | |
| 	'scalar', 'single', 'query', 'insert', 'update', 'prepare', 'transaction', 'rawExecute',
 | |
| }) do
 | |
| 	MySQL[method] = setmetatable({
 | |
| 		method = method,
 | |
| 		await = function(query, parameters)
 | |
| 			query, parameters = safeArgs(query, parameters, nil, method == 'transaction')
 | |
| 			return await(oxmysql[method], query, parameters)
 | |
| 		end
 | |
| 	}, mysql_method_mt)
 | |
| end
 | |
| 
 | |
| local alias = {
 | |
| 	fetchAll = 'query',
 | |
| 	fetchScalar = 'scalar',
 | |
| 	fetchSingle = 'single',
 | |
| 	insert = 'insert',
 | |
| 	execute = 'update',
 | |
| 	transaction = 'transaction',
 | |
| 	prepare = 'prepare'
 | |
| }
 | |
| 
 | |
| local alias_mt = {
 | |
| 	__index = function(self, key)
 | |
| 		if alias[key] then
 | |
| 			local method = MySQL[alias[key]]
 | |
| 			MySQL.Async[key] = method
 | |
| 			MySQL.Sync[key] = method.await
 | |
| 			alias[key] = nil
 | |
| 			return self[key]
 | |
| 		end
 | |
| 	end
 | |
| }
 | |
| 
 | |
| local function addStore(query, cb)
 | |
| 	assert(type(query) == 'string', 'The SQL Query must be a string')
 | |
| 
 | |
| 	local storeN = #queryStore + 1
 | |
| 	queryStore[storeN] = query
 | |
| 
 | |
| 	return cb and cb(storeN) or storeN
 | |
| end
 | |
| 
 | |
| MySQL.Sync = setmetatable({ store = addStore }, alias_mt)
 | |
| MySQL.Async = setmetatable({ store = addStore }, alias_mt)
 | |
| 
 | |
| local function onReady(cb)
 | |
| 	while GetResourceState('oxmysql') ~= 'started' do
 | |
| 		Wait(50)
 | |
| 	end
 | |
| 
 | |
| 	oxmysql.awaitConnection()
 | |
| 
 | |
| 	return cb and cb() or true
 | |
| end
 | |
| 
 | |
| MySQL.ready = setmetatable({
 | |
| 	await = onReady
 | |
| }, {
 | |
| 	__call = function(_, cb)
 | |
| 		Citizen.CreateThreadNow(function() onReady(cb) end)
 | |
| 	end,
 | |
| })
 | |
| 
 | |
| function MySQL.startTransaction(cb)
 | |
| 	return oxmysql:startTransaction(cb, resourceName)
 | |
| end
 | |
| 
 | |
| _ENV.MySQL = MySQL
 | 
