Update of /cvsroot/freevo/kaa/vfs/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6508/src

Modified Files:
        mediadb.py 
Log Message:
more playing with the db, but it does not save the data :-(

Index: mediadb.py
===================================================================
RCS file: /cvsroot/freevo/kaa/vfs/src/mediadb.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** mediadb.py  28 Aug 2005 11:36:57 -0000      1.1
--- mediadb.py  28 Aug 2005 15:35:34 -0000      1.2
***************
*** 1,3 ****
--- 1,4 ----
  import os
+ import stat
  
  import kaa.metadata
***************
*** 5,8 ****
--- 6,125 ----
  from db import *
  
+ class Listing(object):
+     def __init__(self):
+         self.items = []
+ 
+     def __str__(self):
+         ret = 'Listing\n'
+         for i in self.items:
+             ret += '  %s\n' % i
+         return ret
+ 
+     def update(self):
+         for i in self.items:
+             i._parse()
+         
+ 
+ class Item(object):
+     def __init__(self, data, dir, db):
+         self.data = data
+         self.dir = dir
+         self.db = db
+         if isinstance(self.data, dict) and not self.data.has_key('path'):
+             self.data['path'] = self.dir['path'] + '/' + self.data['name']
+ 
+     def _parse(self):
+         if isinstance(self.data, dict):
+             if os.stat(self.data['path'])[stat.ST_MTIME] == 
self.data['mtime']:
+                 return False
+             fname = self.data['name']
+             update = True
+         else:
+             fname = self.data
+             update = False
+ 
+         if self.dir:
+             dirname = self.dir['path']
+             path = dirname + '/' + fname
+             parent = ("dir", self.dir["id"])
+ 
+         else:
+             dirname = ''
+             path = '/'
+             parent = None
+             
+         attributes = { 'mtime': os.stat(path)[stat.ST_MTIME] }
+         metadata = kaa.metadata.parse(path)
+         type = ''
+         if metadata and metadata['media'] and \
+                self.db._object_types.has_key(metadata['media']):
+             type = metadata['media']
+         elif os.path.isdir(path):
+             type = 'dir'
+         else:
+             type = 'file'
+ 
+         type_list = self.db._object_types[type]
+         for key in type_list[1].keys():
+             if metadata and metadata.has_key(key) and metadata[key] != None:
+                 attributes[key] = metadata[key]
+ 
+         if update:
+             id = self.data['id']
+             self.db.update_object((type, id), **attributes)
+         else:
+             id = self.db.add_object((type, fname), parent=parent, 
**attributes)['id']
+             
+         # FIXME: get current data from database
+         self.data = self.db.query_normalized(type=type, id=id)[0]
+         self.data['path'] = path
+         return True
+     
+ 
+     def __str__(self):
+         if isinstance(self.data, (str, unicode)):
+             return 'new file %s' % self.data
+         return self.data['name']
+ 
+ 
+     def __getitem__(self, key):
+         return self.data[key]
+ 
+     
+ class Directory(Item):
+     def list(self):
+         self._parse()
+ 
+         dirname = os.path.normpath(self.data['path'])
+         files = self.db.query_normalized(parent = ("dir", self.data["id"]))
+         fs_listing = os.listdir(dirname)
+ 
+         ret = Listing()
+         for f in files[:]:
+             if f['name'] in fs_listing:
+                 # file still there
+                 fs_listing.remove(f['name'])
+                 ret.items.append(Item(f, self, self.db))
+             else:
+                 # file deleted
+                 files.remove(f)
+                 # FIXME: remove from database
+ 
+         for f in fs_listing:
+             # new files
+             if os.path.isdir(dirname + '/' + f):
+                 ret.items.append(Directory(f, self, self.db))
+             else:
+                 ret.items.append(Item(f, self, self.db))
+             
+         return ret
+ 
+ 
+     def __str__(self):
+         if isinstance(self.data, (str, unicode)):
+             return 'new dir %s' % self.data
+         return 'dir ' + self.data['name']
+ 
+             
  class MediaDB(Database):
  
***************
*** 35,41 ****
          if not root:
              root = self.add_object(("dir", "/"))
          else:
              root = root[0]
!         self.dir = { '/': root }
  
  
--- 152,161 ----
          if not root:
              root = self.add_object(("dir", "/"))
+             # FIXME: get current data from database
+             root = self.query_normalized(type='dir', name='/')[0]
          else:
              root = root[0]
!         root['path'] = '/'
!         self.dir = { '/': Directory(root, None, self) }
  
  
***************
*** 43,48 ****
          if dirname in self.dir:
              return self.dir[dirname]
!         parent = self.__get_dir(os.path.dirname(dirname))
!         parent = ("dir", parent["id"])
          
          name = os.path.basename(dirname)
--- 163,168 ----
          if dirname in self.dir:
              return self.dir[dirname]
!         pdir = self.__get_dir(os.path.dirname(dirname))
!         parent = ("dir", pdir["id"])
          
          name = os.path.basename(dirname)
***************
*** 50,93 ****
          if not current:
              current = self.add_object(("dir", name), parent=parent)
!         else:
!             current = current[0]
          self.dir[dirname] = current
          return current
  
  
-     def scan_dir(self, dirname):
-         dirname = os.path.normpath(os.path.abspath(dirname))
-         dir = self.__get_dir(dirname)
-         files = self.query_normalized(parent = ("dir", dir["id"]))
-         listing = os.listdir(dirname)
-         for f in files:
-             if f['name'] in listing:
-                 # file still there
-                 listing.remove(f['name'])
-             else:
-                 # file deleted
-                 print 'deleted'
- 
-         # new files
-         for fname in listing:
-             metadata = kaa.metadata.parse(dirname + '/' + fname)
-             if metadata and metadata['media'] and \
-                    self._object_types.has_key(metadata['media']):
-                 type_list = self._object_types[metadata['media']]
-                 attributes = {}
-                 for key in type_list[1].keys():
-                     if metadata.has_key(key) and metadata[key] != None:
-                         attributes[key] = metadata[key]
-                 self.add_object((metadata['media'], fname), parent=("dir", 
dir["id"]),
-                               **attributes)
-             elif os.path.isdir('/home/dmeyer/mp3/' + fname):
-                 self.add_object(("dir", fname), parent=("dir", dir["id"]))
-             else:
-                 self.add_object(("file", fname), parent=("dir", dir["id"]))
- 
- 
      def listdir(self, dirname):
!         dirname = os.path.normpath(os.path.abspath(dirname))
!         dir = self.__get_dir(dirname)
!         files = self.query_normalized(parent = ("dir", dir["id"]))
!         return dir, files
--- 170,185 ----
          if not current:
              current = self.add_object(("dir", name), parent=parent)
!             # FIXME: get current data from database
!             current = self.query_normalized(type='dir', name=name, 
parent=parent)
!         current = current[0]
!         current['path'] = dirname
!         current = Directory(current, pdir, self)
          self.dir[dirname] = current
          return current
  
  
      def listdir(self, dirname):
!         """
!         List directory.
!         """
!         return 
self.__get_dir(os.path.normpath(os.path.abspath(dirname))).list()



-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to