From 4dacb8eef133f85f6be3ac8e4db871def960391d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Tue, 1 Aug 2017 13:58:37 +0200 Subject: [PATCH] Add files --- __resource.lua | 9 +++ esx_datastore.sql | 15 +++++ server/classes/datastore.lua | 44 ++++++++++++++ server/main.lua | 112 +++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 __resource.lua create mode 100644 esx_datastore.sql create mode 100644 server/classes/datastore.lua create mode 100644 server/main.lua diff --git a/__resource.lua b/__resource.lua new file mode 100644 index 00000000..41f5b73e --- /dev/null +++ b/__resource.lua @@ -0,0 +1,9 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'ESX DataStore' + +server_scripts { + '@mysql-async/lib/MySQL.lua', + 'server/classes/datastore.lua', + 'server/main.lua' +} \ No newline at end of file diff --git a/esx_datastore.sql b/esx_datastore.sql new file mode 100644 index 00000000..d9bc4fd5 --- /dev/null +++ b/esx_datastore.sql @@ -0,0 +1,15 @@ +CREATE TABLE `datastore` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `label` varchar(255) NOT NULL, + `shared` int(11) NOT NULL, + PRIMARY KEY (`id`) +); + +CREATE TABLE `datastore_data` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `owner` varchar(255) NOT NULL, + `data` longtext, + PRIMARY KEY (`id`) +); \ No newline at end of file diff --git a/server/classes/datastore.lua b/server/classes/datastore.lua new file mode 100644 index 00000000..482c493c --- /dev/null +++ b/server/classes/datastore.lua @@ -0,0 +1,44 @@ +function CreateDataStore(name, owner, data) + + local self = {} + + self.name = name + self.owner = owner + self.data = data + + self.set = function(key, val) + data[key] = val + self.save() + end + + self.get = function(key) + return data[key] + end + + self.save = function() + + if self.owner == nil then + MySQL.Async.execute( + 'UPDATE datastore_data SET data = @data WHERE name = @name', + { + ['@data'] = json.encode(self.data), + ['@name'] = self.name, + } + ) + else + MySQL.Async.execute( + 'UPDATE datastore_data SET data = @data WHERE name = @name and owner = @owner', + { + ['@data'] = json.encode(self.data), + ['@name'] = self.name, + ['@owner'] = self.owner, + } + ) + end + + end + + return self + +end + diff --git a/server/main.lua b/server/main.lua new file mode 100644 index 00000000..f5f1e7d3 --- /dev/null +++ b/server/main.lua @@ -0,0 +1,112 @@ +ESX = nil +Items = {} +local DataStoresIndex = {} +local DataStores = {} +local SharedDatastores = {} + + +TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + +AddEventHandler('onMySQLReady', function() + + local result = MySQL.Sync.fetchAll('SELECT * FROM datastore') + + for i=1, #result, 1 do + + local name = result[i].name + local label = result[i].label + local shared = result[i].shared + + local result2 = MySQL.Sync.fetchAll( + 'SELECT * FROM datastore_data WHERE name = @name', + { + ['@name'] = name + } + ) + + if shared == 0 then + + table.insert(DataStoresIndex, name) + + DataStores[name] = {} + + for j=1, #result2, 1 do + + local storeName = result2[j].name + local storeOwner = result2[j].owner + local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data)) + + local dataStore = CreateDataStore(storeName, storeOwner, storeData) + + table.insert(DataStores[name], dataStore) + + end + + else + + local items = {} + + local storeName = result2[1].name + local storeData = (result2[1].data == nil and {} or json.decode(result2[1].data)) + + local dataStore = CreateDataStore(storeName, nil, storeData) + SharedDatastores[name] = dataStore + + end + + end + +end) + +function GetDataStore(name, owner) + for i=1, #DataStores[name], 1 do + if DataStores[name][i].owner == owner then + return DataStores[name][i] + end + end +end + +function GetSharedDataStore(name) + return SharedDataStores[name] +end + +AddEventHandler('esx_datastore:getDataStore', function(name, owner, cb) + cb(GetDataStore(name, owner)) +end) + +AddEventHandler('esx_datastore:getSharedDataStore', function(name, cb) + cb(GetSharedDataStore(name)) +end) + +AddEventHandler('esx:playerLoaded', function(source) + + local xPlayer = ESX.GetPlayerFromId(source) + local dataStores = {} + + for i=1, #DataStoresIndex, 1 do + + local name = DataStoresIndex[i] + local dataStore = GetDataStore(name, xPlayer.identifier) + + if dataStore == nil then + + MySQL.Async.execute( + 'INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', + { + ['@name'] = name, + ['@owner'] = xPlayer.identifier, + ['@data'] = '{}' + } + ) + + dataStore = CreateDataStore(name, xPlayer.identifier, {}) + table.insert(DataStores[name], dataStore) + end + + table.insert(dataStores, dataStore) + + end + + xPlayer.set('dataStores', dataStores) + +end)