Jump to content

Extraño problema con SQLite


aka Blue

Recommended Posts

Buenas, estoy teniendo unos problemas con SQLite. Éste es el script que uso actualmente:

local sql = dbConnect ( "sqlite" , "wallet.db" ) -- Create the connection 
local walletTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS wallets (owner TEXT,money_inside TEXT)" ) 
local cartera = { }

addEventHandler( "onPlayerLogin", root,
	function( )
		local name = getPlayerName( source )
		local qh = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = ?", name )
		local result = dbPoll( qh, -1 )
		if result then
			for i=1, #result do
				local data = result[i]
				local money_inside = data.money_inside
				cartera[ source ] = tonumber( money_inside )
			end
		else
			cartera[ source ] = 0
		end
	end
)

addEventHandler( "onPlayerLogout", root,
	function(  )
		local name = getPlayerName( source )
		local exists = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = "..name )
		if exists then
			local cartera = cartera[ source ]
			if cartera then
				local result = dbFree ( dbQuery ( sql , "UPDATE wallets SET money_inside = ? WHERE owner = ?" , tonumber(cartera), name ) ) 
				if result then
					outputChatBox( "Cantidad en cartera guardada: $"..cartera, source, 0, 255, 0 )
				else
					outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", source, 255, 145, 0 )
				end
			else
				outputChatBox( "No se te guardará la cartera, ya que no la has usado.", source, 255, 145, 0 )
			end
		else
			local cartera = cartera[ source ]
			if cartera then
				local result = dbQuery ( sql , "INSERT INTO wallets (owner,money_inside) VALUES (?,?)", name, tonumber( cartera ) )
				if result then
					outputChatBox( "Guardada la cantidad $"..cartera.." en la base de datos.", source, 0, 255, 0 )
				else
					outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", source, 255, 145, 0 )
				end
			else
				outputChatBox( "No se te guardará la cartera, ya que no la has usado.", source, 255, 145, 0 )
			end				
		end
	end
)

addCommandHandler( "cartera",
	function( player, commandName, accion, cantidad )
		local cantidad = tonumber( cantidad )
		local account = getPlayerAccount( player )
		if isGuestAccount( account ) then cartera[ player ] = 0 outputChatBox( "No puedes usar la cartera siendo invitado. Logueate", player, 255, 145, 0 ) else
		if cartera[ player ] == nil then cartera[ player ] = 0 end
		if accion == "guardar" then
			if cantidad then
				local cantidad_cartera = cartera[ player ] or 0
				if cartera[ player ] == 0 then
					outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 )
					outputChatBox( "• Genial! Acabas de usar tu cartera.", player, 0, 255, 0 )
					cartera[ player ] = cantidad
				else
					outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 )
					cartera[ player ] = cantidad_cartera + cantidad
					outputChatBox( "Cantidad total en la cartera: $"..cantidad_cartera+cantidad, player, 0, 255, 0 )
				end
			else
				outputChatBox( 'Necesitas añadir una cantidad a guardar en la cartera', player, 255, 145, 0 )
			end
		end
		end
	end
)

He intentado solucionarlo de todas las formas posibles pero, no funciona. El problema es que, por lo visto "no se guarda en SQLite" o algo parecido. Es extraño el error, porque, al estar conectado, al desloguearse y al loguearse sigue la cantidad, pero al reconectar deslogueado, no se guarda. No entiendo lo que pasa.

Link to comment

No es necesario guardar data cuando se desconecta un jugador si previamente ya habías guardado. Es recomendable que cada vez que se haga una variación en el dinero se guarde en la base de datos el cambio, ya que en cualquier momento puede caerse el servidor y los datos se pierden.

Tienes el problema precisamente por esa razon, ya que el player al salir, no ejecuta el logout, sino que ejecuta el evento onPlayerQuit. 

Para solucionar esto, la mejor opción es que crees una función para leer y otra para guardar data. Así no tendrías que estar llamando a la base de datos en cada función.

Link to comment

Es la primera vez que me pongo 'seriamente' con SQLite, por lo cual, pues no entiendo muy bien. Gracias @Bc#, tomaré en cuenta lo que dijiste y haré dos funciones. De cargado y de guardado.

Sigue igual. Se ve que el problema está en la función loadWalletData, no recibe correctamente los valores o qué se yo, no lo entiendo...

local cartera = { }

addEventHandler( "onResourceStart", resourceRoot,
	function( )
		sql = dbConnect ( "sqlite" , "wallet.db" ) -- Create the connection 
		walletTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS wallets (owner TEXT,money_inside TEXT)" ) 	
		if sql and walletTable then
			outputDebugString( "Conectado SQLite para el recurso carteras" )
		else
			outputDebugString( "No se puede conectar SQLite para el recurso de carteras" )
		end
	end
)

function saveWalletData( player )
	local name = getPlayerName( player )
	local exists = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = "..name )
	if exists then
		local cartera = cartera[ player ]
		if cartera then
			local result = dbFree ( dbQuery ( sql , "UPDATE wallets SET money_inside = ? WHERE owner = ?" , tonumber(cartera), name ) ) 
			if result then
			else
				outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", player, 255, 145, 0 )
			end
		else
			outputChatBox( "No se te guardará la cartera, ya que no la has usado.", player, 255, 145, 0 )
		end
	else
		local cartera = cartera[ player ]
		if cartera then
			local result = dbQuery ( sql , "INSERT INTO wallets (owner,money_inside) VALUES (?,?)", name, tonumber( cartera ) )
			if result then
			else
				outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", player, 255, 145, 0 )
			end
		else
			outputChatBox( "No se te guardará la cartera, ya que no la has usado.", player, 255, 145, 0 )
		end				
	end
end

function loadWalletData( player )
	if cartera[ player ] == nil then cartera[ player ] = 0 end
	local name = getPlayerName( player )
	local qh = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = ?", name )
	local result = dbPoll( qh, -1 )
	if result then
		for i=1, #result do
			local data = result[i]
			local money_inside = data.money_inside
			cartera[ player ] = tonumber( money_inside )
		end
	else
		cartera[ player ] = 0
	end
end

addEventHandler( "onPlayerQuit", root, function( ) saveWalletData( source ) end )
addEventHandler( "onPlayerLogin", root, function( ) loadWalletData( source ) end )

addCommandHandler( "cartera",
	function( player, commandName, accion, cantidad )
		local cantidad = tonumber( cantidad )
		local account = getPlayerAccount( player )
		if isGuestAccount( account ) then cartera[ player ] = 0 outputChatBox( "No puedes usar la cartera siendo invitado. Logueate", player, 255, 145, 0 ) else
		if cartera[ player ] == nil then cartera[ player ] = 0 end
		if accion == "guardar" then
			if cantidad then
				local cantidad_cartera = cartera[ player ] or 0
				if cartera[ player ] == 0 then
					outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 )
					cartera[ player ] = cantidad
					saveWalletData( player )
				else
					outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 )
					cartera[ player ] = cantidad_cartera + cantidad
					outputChatBox( "Cantidad total en la cartera: $"..cantidad_cartera+cantidad, player, 0, 255, 0 )
				end
			else
				outputChatBox( 'Necesitas añadir una cantidad a guardar en la cartera', player, 255, 145, 0 )
			end
		end
		end
	end
)

 

Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...