summaryrefslogtreecommitdiff
path: root/viewfeed.js
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2010-11-07 12:54:43 +0300
committerAndrew Dolgov <[email protected]>2010-11-07 12:54:43 +0300
commitff0010c182c1643cc5e0c516e95ed50e18004068 (patch)
treeeb87cb47d41627c7b1d0671dfc2ef272cc74be40 /viewfeed.js
parent50eefedbfd2f31be4054746bbcec7d8e05c0a2dd (diff)
implement html5 localStorage support for client-side cache
Diffstat (limited to 'viewfeed.js')
-rw-r--r--viewfeed.js107
1 files changed, 83 insertions, 24 deletions
diff --git a/viewfeed.js b/viewfeed.js
index a6065ecb4..e2b20779e 100644
--- a/viewfeed.js
+++ b/viewfeed.js
@@ -1696,13 +1696,19 @@ function cache_inject(id, article, param) {
[id, article, param, ts]);
} else {
- var cache_obj = new Array();
+ var cache_obj = {};
cache_obj["id"] = id;
cache_obj["data"] = article;
cache_obj["param"] = param;
-
- article_cache.push(cache_obj);
+ cache_obj["added"] = new Date();
+
+ if (param) id = id + ":" + param;
+
+ if (has_local_storage())
+ localStorage.setItem(id, JSON.stringify(cache_obj));
+ else
+ article_cache.push(cache_obj);
}
} else {
@@ -1728,9 +1734,22 @@ function cache_find(id) {
return a;
} else {
- for (var i = 0; i < article_cache.length; i++) {
- if (article_cache[i]["id"] == id) {
- return article_cache[i]["data"];
+
+ if (has_local_storage()) {
+ var cache_obj = localStorage.getItem(id);
+
+ if (cache_obj) {
+ cache_obj = JSON.parse(cache_obj);
+
+ if (cache_obj)
+ return cache_obj['data'];
+ }
+
+ } else {
+ for (var i = 0; i < article_cache.length; i++) {
+ if (article_cache[i]["id"] == id) {
+ return article_cache[i]["data"];
+ }
}
}
}
@@ -1753,9 +1772,22 @@ function cache_find_param(id, param) {
return a;
} else {
- for (var i = 0; i < article_cache.length; i++) {
- if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
- return article_cache[i]["data"];
+
+ if (has_local_storage()) {
+ var cache_obj = localStorage.getItem(id + ":" + param);
+
+ if (cache_obj) {
+ cache_obj = JSON.parse(cache_obj);
+
+ if (cache_obj)
+ return cache_obj['data'];
+ }
+
+ } else {
+ for (var i = 0; i < article_cache.length; i++) {
+ if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
+ return article_cache[i]["data"];
+ }
}
}
}
@@ -1778,9 +1810,14 @@ function cache_check(id) {
return a;
} else {
- for (var i = 0; i < article_cache.length; i++) {
- if (article_cache[i]["id"] == id) {
- return true;
+ if (has_local_storage) {
+ if (localStorage.getItem(id))
+ return true;
+ } else {
+ for (var i = 0; i < article_cache.length; i++) {
+ if (article_cache[i]["id"] == id) {
+ return true;
+ }
}
}
}
@@ -1803,9 +1840,15 @@ function cache_check_param(id, param) {
return a;
} else {
- for (var i = 0; i < article_cache.length; i++) {
- if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
- return true;
+
+ if (has_local_storage) {
+ if (localStorage.getItem(id + ':' + param))
+ return true;
+ } else {
+ for (var i = 0; i < article_cache.length; i++) {
+ if (article_cache[i]["id"] == id && article_cache[i]["param"] == param) {
+ return true;
+ }
}
}
}
@@ -1823,8 +1866,14 @@ function cache_expire() {
} else {
- while (article_cache.length > 25) {
- article_cache.shift();
+ if (has_local_storage()) {
+ while (localStorage.length > 25) {
+ localStorage.removeItem(localStorage.key(localStorage.length-1));
+ }
+ } else {
+ while (article_cache.length > 25) {
+ article_cache.shift();
+ }
}
}
}
@@ -1841,15 +1890,25 @@ function cache_invalidate(id) {
return rs.rowsAffected != 0;
} else {
- var i = 0
+ if (has_local_storage()) {
+ for (var i = 0; i < localStorage.length; i++) {
+ var key = localStorage.key(i);
- while (i < article_cache.length) {
- if (article_cache[i]["id"] == id) {
- console.log("cache_invalidate: removed id " + id);
- article_cache.splice(i, 1);
- return true;
+ if (key == id || key.indexOf(id + ":") == 0)
+ localStorage.removeItem(key);
+
+ }
+ } else {
+ var i = 0
+
+ while (i < article_cache.length) {
+ if (article_cache[i]["id"] == id) {
+ console.log("cache_invalidate: removed id " + id);
+ article_cache.splice(i, 1);
+ return true;
+ }
+ i++;
}
- i++;
}
}