
if ( !sql.TableExists( "cookies" ) ) then

	sql.Query( "CREATE TABLE IF NOT EXISTS cookies ( key TEXT NOT NULL PRIMARY KEY, value TEXT );" )
	
end


module( "cookie", package.seeall )

local CachedEntries = {}
local BufferedWrites = {}

local function GetCache( key )
	local entry = CachedEntries[ key ]
	
	if entry == nil || SysTime() > entry[ 1 ] then
		local name = SQLStr( key )
		local val = sql.QueryValue( "SELECT value FROM cookies WHERE key = " .. name )
		
		if !val then
			return false
		end
		
		CachedEntries[ key ] = { SysTime() + 30, val }
	end
	
	return CachedEntries[ key ][ 2 ]
end

local function FlushCacheEntry( key )
	CachedEntries[ key ] = nil
	BufferedWrites[ key ] = nil
end

local function FlushCache()
	CachedEntries = {}
	BufferedWrites = {}
end

local function CommitToSQLite()
	sql.Begin()
	
	for k,v in pairs(BufferedWrites) do
		local name = SQLStr( k )
		local value = SQLStr( v )

		sql.Query( "INSERT OR REPLACE INTO cookies ( key, value ) VALUES ( "..name..", "..value.." )" )
	end
	
	BufferedWrites = {}
	sql.Commit()
end

local function ScheduleCommit()	
	timer.Create("Cookie_CommitToSQLite", 0.1, 1, CommitToSQLite)
end

local function SetCache( key, value )
	if !CachedEntries[ key ] then
		CachedEntries[ key ] = { SysTime() + 30, value }
	end
	
	CachedEntries[ key ][ 2 ] = value
	BufferedWrites[ key ] = value

	ScheduleCommit()
end

--[[---------------------------------------------------------
   Get a String Value
-----------------------------------------------------------]]
function GetString( name, default )

	local val = GetCache( name )
	if (!val) then return default end
	
	return val
	
end


--[[---------------------------------------------------------
   Get a Number Value
-----------------------------------------------------------]]
function GetNumber( name, default )

	local val = GetCache( name )
	if (!val) then return default end
	
	return tonumber( val )
	
end

--[[---------------------------------------------------------
   Delete a Value
-----------------------------------------------------------]]
function Delete( name )

	FlushCacheEntry( name )
	
	name = SQLStr( name )
	sql.Query( "DELETE FROM cookies WHERE key = " .. name )

end

--[[---------------------------------------------------------
   Set a Value
-----------------------------------------------------------]]
function Set( name, value )
	SetCache( name, value )
end




--[[---------------------------------------------------------
   ClearCookies
-----------------------------------------------------------]]
local function ClearCookies( ply, command, arguments )   

	sql.Query( "DELETE FROM cookies" )
	FlushCache()
	
end     

concommand.Add( "lua_cookieclear", ClearCookies )  


--[[---------------------------------------------------------
   ClearCookies
-----------------------------------------------------------]]
local function SpewCookies( ply, command, arguments )   

	local res = sql.Query( "SELECT key, value FROM cookies LIMIT 200" )
	
	for k, v in ipairs( res ) do
	
		MsgN( v['key'], " = ", v['value'] )
	
	end

end     

concommand.Add( "lua_cookiespew", SpewCookies ) 