# GARStow cache operations
# Copyright 2010 Adam Sampson <ats@offog.org>

import os, sys
import cPickle as pickle

import packages
from utils import *

cache = {
	"loaded": False,
	"modified": False,
	}

def get(key):
	if not cache["loaded"]:
		load()
	return cache.get(key)

def put(key, value):
	cache[key] = value
	cache["modified"] = True

def load():
	global cache
	cache = {
		"loaded": True,
		"modified": False,
		}

	fn = packages.get_temp_dir() + "/garstowlib-cache"
	try:
		f = open(fn, "rb")
		cache.update(pickle.load(f))
		f.close()
	except:
		# Some error occurred -- leave the cache empty.
		pass

	cache["loaded"] = True
	cache["modified"] = False

def save():
	if not cache["modified"]:
		return

	fn = packages.get_temp_dir() + "/garstowlib-cache"
	mkdir_p(os.path.dirname(fn))
	newfn = "%s.new-%d" % (fn, os.getpid())
	f = open(newfn, "wb")
	pickle.dump(cache, f, pickle.HIGHEST_PROTOCOL)
	f.close()
	os.rename(newfn, fn)

