diff options
Diffstat (limited to 'sca-cpp/branches/lightweight-sca/hosting/server/store.py')
-rw-r--r-- | sca-cpp/branches/lightweight-sca/hosting/server/store.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/sca-cpp/branches/lightweight-sca/hosting/server/store.py b/sca-cpp/branches/lightweight-sca/hosting/server/store.py new file mode 100644 index 0000000000..054f546c2d --- /dev/null +++ b/sca-cpp/branches/lightweight-sca/hosting/server/store.py @@ -0,0 +1,112 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0 +# +# 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. + +# Stores collection implementation +from util import * +from sys import debug + +# Convert a particular store tag to a store id +def storeid(tag): + return ("store", tag, "store.apps") + +# Get a store from the cache +def getstore(id, cache): + debug('store.py::getstore::id', id) + val = cache.get(id) + if isNil(val) or val is None: + return () + store = cdddr(car(val)) + if not isNil(store) and isList(car(cadr(car(store)))): + # Expand list of entries + estore = tuple(map(lambda e: cons("'entry", e), cadr(car(store)))) + debug('store.py::getstore::estore', estore) + return estore + + debug('store.py::getstore::store', store) + return store + +# Put a store into the cache +def putstore(id, store, cache): + debug('store.py::putstore::id', id) + debug('store.py::putstore::store', store) + val = ((("'feed", ("'title", "App Store"), ("'id", cadr(id))) + store),) + return cache.put(id, val) + +# Put an app into a store +def put(id, app, user, cache, apps): + debug('store.py::put::id', id) + debug('store.py::put::app', app) + tag = car(id) + appid = cdr(id) + + def putapp(appid, app, store): + if isNil(store): + return app + if car(appid) == cadr(assoc("'id", car(store))): + return cons(car(app), cdr(store)) + return cons(car(store), putapp(appid, app, cdr(store))) + + appentry = (("'entry", assoc("'title", car(app)), ("'id", car(appid)), ("'author", user.get(())), assoc("'updated", car(app)), assoc("'content", car(app))),) + debug('store.py::put::appentry', appentry) + + store = putapp(appid, appentry, getstore(storeid(tag), cache)) + return putstore(storeid(tag), store, cache) + +# Get apps from a store +def get(id, user, cache, apps): + debug('store.py::get::id', id) + tag = car(id) + appid = cdr(id) + + def findapp(appid, store): + if isNil(store): + return None + if car(appid) == cadr(assoc("'id", car(store))): + return (car(store),) + return findapp(appid, cdr(store)) + + if isNil(appid): + store = ((("'feed", ("'title", "App Store"), ("'id", tag)) + getstore(storeid(tag), cache)),) + debug('store.py::get::store', store) + return store + + app = findapp(appid, getstore(storeid(tag), cache)) + debug('store.py::get::app', app) + return app + +# Delete apps from a store +def delete(id, user, cache, apps): + debug('store.py::delete::id', id) + tag = car(id) + appid = cdr(id) + + if isNil(appid): + return cache.delete(storeid(tag)) + + def deleteapp(appid, store): + if isNil(store): + return () + if car(appid) == cadr(assoc("'id", car(store))): + return cdr(store) + return cons(car(store), deleteapp(appid, cdr(store))) + + store = getstore(storeid(tag), cache) + deleted = deleteapp(appid, store) + if deleted == store: + return False + return putstore(storeid(tag), deleted, cache) + |