changeset 256:5667f11fd7c9

Only fetch page fields that we're going to use from the DB.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 03 Apr 2014 20:05:13 -0700
parents c27317412100
children 8098c84efab0
files wikked/views/__init__.py wikked/views/read.py wikked/wiki.py
diffstat 3 files changed, 29 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/views/__init__.py	Wed Apr 02 19:23:19 2014 -0700
+++ b/wikked/views/__init__.py	Thu Apr 03 20:05:13 2014 -0700
@@ -31,7 +31,8 @@
     return url[1:]
 
 
-def get_page_or_none(url, convert_url=True, check_perms=DONT_CHECK, force_resolve=False):
+def get_page_or_none(url, fields=None, convert_url=True,
+        check_perms=DONT_CHECK, force_resolve=False):
     if convert_url:
         url = url_from_viewarg(url)
 
@@ -45,7 +46,7 @@
         elif force_resolve:
             g.wiki.resolve(only_urls=[url], force=True)
 
-        page = g.wiki.getPage(url)
+        page = g.wiki.getPage(url, fields=fields)
     except PageNotFoundError:
         return None
 
@@ -57,8 +58,10 @@
     return page
 
 
-def get_page_or_404(url, convert_url=True, check_perms=DONT_CHECK, force_resolve=False):
-    page = get_page_or_none(url, convert_url, check_perms, force_resolve)
+def get_page_or_404(url, fields=None, convert_url=True,
+        check_perms=DONT_CHECK, force_resolve=False):
+    page = get_page_or_none(url, fields, convert_url, check_perms,
+            force_resolve)
     if page is not None:
         return page
     app.logger.error("No such page: " + url)
--- a/wikked/views/read.py	Wed Apr 02 19:23:19 2014 -0700
+++ b/wikked/views/read.py	Thu Apr 03 20:05:13 2014 -0700
@@ -72,6 +72,7 @@
         # Normal page.
         page = get_page_or_404(
                 path,
+                fields=['url', 'title', 'text', 'meta'],
                 convert_url=False,
                 check_perms=CHECK_FOR_READ,
                 force_resolve=force_resolve)
@@ -84,6 +85,7 @@
     meta_page_url = '%s:%s' % (endpoint, path)
     info_page = get_page_or_none(
             meta_page_url,
+            fields=['url', 'title', 'text', 'meta'],
             convert_url=False,
             check_perms=CHECK_FOR_READ,
             force_resolve=force_resolve)
@@ -95,6 +97,7 @@
             # Default page text.
             info_page = get_page_or_404(
                     endpoint_info.default,
+                    fields=['url', 'title', 'text', 'meta'],
                     convert_url=False,
                     check_perms=CHECK_FOR_READ,
                     force_resolve=force_resolve)
@@ -108,7 +111,8 @@
 
     # Get the list of pages to show here.
     query = {endpoint: [value]}
-    pages = g.wiki.getPages(meta_query=query)
+    pages = g.wiki.getPages(meta_query=query,
+            fields=['url', 'title', 'text', 'meta'])
     tpl_data = {
             'name': endpoint,
             'value': value,
@@ -146,7 +150,8 @@
 
 @app.route('/api/raw/<path:url>')
 def api_read_page_raw(url):
-    page = get_page_or_404(url, check_perms=CHECK_FOR_READ)
+    page = get_page_or_404(url, check_perms=CHECK_FOR_READ,
+            fields=['url', 'title', 'text', 'meta'])
     result = {'meta': get_page_meta(page), 'text': page.raw_text}
     return jsonify(result)
 
@@ -169,7 +174,8 @@
 
 @app.route('/api/state/<path:url>')
 def api_get_state(url):
-    page = get_page_or_404(url, check_perms=CHECK_FOR_READ)
+    page = get_page_or_404(url, check_perms=CHECK_FOR_READ,
+            fields=['url', 'title', 'path', 'meta'])
     state = page.getState()
     return jsonify({
         'meta': get_page_meta(page, True),
@@ -184,10 +190,12 @@
 
 @app.route('/api/outlinks/<path:url>')
 def api_get_outgoing_links(url):
-    page = get_page_or_404(url, check_perms=CHECK_FOR_READ)
+    page = get_page_or_404(url, check_perms=CHECK_FOR_READ,
+            fields=['url', 'title', 'links'])
     links = []
     for link in page.links:
-        other = get_page_or_none(link, convert_url=False)
+        other = get_page_or_none(link, convert_url=False,
+                fields=['url', 'title', 'meta'])
         if other is not None and is_page_readable(other):
             links.append({
                 'url': other.url,
@@ -207,10 +215,12 @@
 
 @app.route('/api/inlinks/<path:url>')
 def api_get_incoming_links(url):
-    page = get_page_or_404(url, check_perms=CHECK_FOR_READ)
+    page = get_page_or_404(url, check_perms=CHECK_FOR_READ,
+            fields=['url', 'title', 'meta'])
     links = []
     for link in page.getIncomingLinks():
-        other = get_page_or_none(link, convert_url=False)
+        other = get_page_or_none(link, convert_url=False,
+                fields=['url', 'title', 'meta'])
         if other is not None and is_page_readable(other):
             links.append({
                 'url': link,
--- a/wikked/wiki.py	Wed Apr 02 19:23:19 2014 -0700
+++ b/wikked/wiki.py	Thu Apr 03 20:05:13 2014 -0700
@@ -310,16 +310,17 @@
         for url in self.db.getPageUrls(subdir):
             yield url
 
-    def getPages(self, subdir=None, meta_query=None):
+    def getPages(self, subdir=None, meta_query=None, fields=None):
         """ Gets all the pages in the wiki, or in the given sub-directory.
         """
-        for page in self.db.getPages(subdir, meta_query):
+        for page in self.db.getPages(subdir=subdir, meta_query=meta_query,
+                fields=fields):
             yield page
 
-    def getPage(self, url):
+    def getPage(self, url, fields=None):
         """ Gets the page for a given URL.
         """
-        return self.db.getPage(url)
+        return self.db.getPage(url, fields=fields)
 
     def setPage(self, url, page_fields):
         """ Updates or creates a page for a given URL.