blob: aa55b272ed390bf5309dd625b712cf124db0964b [file] [log] [blame]
#
# Copyright (c) 2012,2013 Big Switch Networks, Inc.
#
# Licensed under the Eclipse Public License, Version 1.0 (the
# "License"); you may not use this file except in compliance with the
# License. You may obtain a copy of the License at
#
# http://www.eclipse.org/legal/epl-v10.html
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
import datetime
import json
import utif
import re
#
#
#
cached_urls = {}
cached_urls_age = {}
record_urls = None
def clear_cached_urls():
"""
Called when all the url's ought to be discarded.
This is currently done at every command start to reclaim any
memory resources.
Also issued when any update or delete is issued against the
database, since that means one of our results may be different
"""
global cached_urls, cached_urls_age
cached_urls = {}
cached_urls_age = {}
def reset_url(url):
"""
Remove a url from the cache
"""
if url in cached_urls:
del cached_urls[url]
del cached_urls_age[url]
def get_cached_url(url):
"""
Simple cache to manage multiple url requests issued within one command cycle
"""
if url in cached_urls:
# age doesn't get updated when its touched
if url in cached_urls_age and \
cached_urls_age[url] < datetime.datetime.now():
# too old
reset_url(url)
return None
return cached_urls[url]
return None
def record(path):
global record_urls
if path == None:
if record_urls:
record_urls.close()
record_urls = None
return
# need to validate path
try:
record_urls = open(path, 'w')
except Exception, e:
print 'Error: can\'t open %s' % path
def save_url(url, entries, age = None):
"""
Save a url and the response in the cache, associate an age with the
entry, currently two seconds.
"""
cached_urls[url] = entries
if record_urls:
if type(entries) == str:
record_urls.write('REST %s %s %s\n' %
(url, 'STR', entries))
else:
# assume its a complex type
record_urls.write('REST %s %s %s\n' %
(url, 'JSON', json.dumps(entries)))
# age out the url in two seconds
if age == None:
age = 2
cached_urls_age[url] = datetime.datetime.now() + datetime.timedelta(0, age)
def command_finished(words):
if record_urls:
record_urls.write('COMMAND "%s"\n' %
' '.join([utif.quote_string(x) for x in words]))