lib/shorturl.py
changeset 28 70b6c13d084f
parent 26 81d6679d50d0
child 29 990300aa8010
equal deleted inserted replaced
27:301d738b1181 28:70b6c13d084f
    21 import struct
    21 import struct
    22 import base64
    22 import base64
    23 import shelve
    23 import shelve
    24 import os.path
    24 import os.path
    25 
    25 
    26 from log import index
    26 
    27 
    27 import utils, db, helpers, folder, image, log
    28 import utils, db, helpers, folder, image
       
    29 
    28 
    30 def int2key (id) :
    29 def int2key (id) :
    31     """
    30     """
    32         Turn an integer into a short-as-possible url-safe string
    31         Turn an integer into a short-as-possible url-safe string
    33     """
    32     """
   144     elif isinstance(obj, image.Image) :
   143     elif isinstance(obj, image.Image) :
   145         dir, fname = utils.strip_path(obj.dir.path), obj.name
   144         dir, fname = utils.strip_path(obj.dir.path), obj.name
   146     else :
   145     else :
   147         assert(False, "%r %r" % (obj, id))
   146         assert(False, "%r %r" % (obj, id))
   148 
   147 
   149     index.info("img %50s %15s = %d %s", dir, fname, id, key)
   148     log.info("img %50s %15s = %d %s", dir, fname, id, key)
   150 
   149 
   151 def updateDB (root) :
   150 def updateDB (root) :
   152     """
   151     """
   153         Update the SQL database
   152         Update the SQL database
   154 
   153 
   160     dirqueue = [root]
   159     dirqueue = [root]
   161 
   160 
   162     # dict of (dir, fname) -> obj
   161     # dict of (dir, fname) -> obj
   163     paths = {}
   162     paths = {}
   164 
   163 
   165     index.info("Processing ShortURLs...")
       
   166 
       
   167     while dirqueue :
   164     while dirqueue :
   168         dir = dirqueue.pop(0)
   165         dir = dirqueue.pop(0)
   169 
   166 
   170         dirqueue.extend(dir.subdirs.itervalues())
   167         dirqueue.extend(dir.subdirs.itervalues())
   171 
   168 
   172         if dir.alive :
   169         if dir.alive :
   173             pathtuple = (utils.strip_path(dir.path), '')
   170             pathtuple = (utils.strip_path(dir.path), '')
   174             
   171             
   175             index.debug("dir %50s", pathtuple[0])
   172             log.debug("dir %50s", pathtuple[0])
   176 
   173 
   177             paths[pathtuple] = dir
   174             paths[pathtuple] = dir
   178 
   175 
   179         for img in dir.images.itervalues() :
   176         for img in dir.images.itervalues() :
   180             pathtuple = (utils.strip_path(img.dir.path), img.name)
   177             pathtuple = (utils.strip_path(img.dir.path), img.name)
   181             
   178             
   182             index.debug("img %50s %15s", *pathtuple)
   179             log.debug("img %50s %15s", *pathtuple)
   183 
   180 
   184             paths[pathtuple] = img
   181             paths[pathtuple] = img
   185     
   182     
   186     print "%d nodes:" % (len(paths))
   183     log.info("we have %d nodes", len(paths))
   187 
   184 
   188     for (id, dir, fname) in db.select("SELECT id, dirpath, filename FROM nodes") :
   185     for (id, dir, fname) in db.select("SELECT id, dirpath, filename FROM nodes") :
   189         try :
   186         try :
   190             obj = paths.pop((dir, fname))
   187             obj = paths.pop((dir, fname))
   191             key = int2key(id)
   188             key = int2key(id)
   192 
   189 
   193             obj.shorturl_code = key
   190             obj.shorturl_code = key
   194 
   191 
   195             index.debug("%s %50s %15s -> %d %s", dir and "img" or "dir", dir, fname, id, key)
   192             log.debug("%s %50s %15s -> %d %s", dir and "img" or "dir", dir, fname, id, key)
   196         
   193         
   197         except KeyError :
   194         except KeyError :
   198             pass
   195             pass
   199 #            index.warning("non-existant node (%d, %s, %s) in db", id, dir, fname)
   196 #            log.warning("non-existant node (%d, %s, %s) in db", id, dir, fname)
   200     
   197     
   201     print "%d NEW nodes:" % (len(paths))
   198     if paths :
   202 
   199         log.info("allocating shorturls for %d new nodes:", len(paths))
   203     db.insert_many(
   200 
   204         _got_obj_key,
   201         db.insert_many(
   205         "INSERT INTO nodes (dirpath, filename) VALUES (?, ?)",
   202             _got_obj_key,
   206         ((obj, (path, fname)) for ((path, fname), obj) in paths.iteritems())
   203             "INSERT INTO nodes (dirpath, filename) VALUES (?, ?)",
   207     )
   204             ((obj, (path, fname)) for ((path, fname), obj) in paths.iteritems())
   208 
   205         )
       
   206     else :
       
   207         log.info("no new images")
       
   208