From a00a60a8dd847226040cbc76acd42f78b5cbe58a Mon Sep 17 00:00:00 2001 From: gryf Date: Sun, 26 Aug 2007 11:14:54 +0000 Subject: [PATCH] * Added functions for fill TreeStore and ListStore with data. * Added methods for fetch information about file/directory. --- mvc/src/models/m_main.py | 185 +++++++++++++++++++++++++++++++++++---- 1 file changed, 170 insertions(+), 15 deletions(-) diff --git a/mvc/src/models/m_main.py b/mvc/src/models/m_main.py index 6951eaa..1d01bca 100644 --- a/mvc/src/models/m_main.py +++ b/mvc/src/models/m_main.py @@ -17,6 +17,9 @@ import mx.DateTime import os import mimetypes +import gtk +import gobject + from m_config import ConfigModel class MainModel(ModelMT): @@ -31,6 +34,9 @@ class MainModel(ModelMT): modified = False db_connection = None db_cursor = None + abort = False + discsTree = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING,str) + filesList = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_STRING,str) def __init__(self): ModelMT.__init__(self) @@ -64,6 +70,17 @@ class MainModel(ModelMT): self.__create_internal_filename() self.__connect_to_db() self.__create_database() + + try: + self.discsTree.clear() + except: + pass + + try: + self.filesList.clear() + except: + pass + return def save(self): @@ -82,11 +99,76 @@ class MainModel(ModelMT): return self.thread = _threading.Thread(target=self.__scan) self.thread.start() + return + + def refresh_tree(self): + """generate tree model from discs tree""" + if __debug__: + print "refreshing" + # flush buffer to release db lock. + self.db_connection.commit() + + if self.busy: + return + self.thread = _threading.Thread(target=self.__prepare_discs_treemodel) + self.thread.start() return + def get_root_entries(self,id=None): + try: + self.filesList.clear() + except: + pass + # parent for virtual '..' dir + #myiter = self.filemodel.insert_before(None,None) + #self.cur.execute("SELECT parent FROM files_connect WHERE child=? AND depth = 1",(id,)) + #self.filemodel.set_value(myiter,0,self.cur.fetchone()[0]) + #self.filemodel.set_value(myiter,1,'..') + #if __debug__: + # print datetime.datetime.fromtimestamp(ch[3]) + + # directories first + self.db_cursor.execute("SELECT o.child, f.filename, f.size, f.date FROM files_connect o LEFT JOIN files f ON o.child=f.id WHERE o.parent=? AND o.depth=1 AND f.type=1 ORDER BY f.filename",(id,)) + for ch in self.db_cursor.fetchall(): + myiter = self.filesList.insert_before(None,None) + self.filesList.set_value(myiter,0,ch[0]) + self.filesList.set_value(myiter,1,ch[1]) + self.filesList.set_value(myiter,2,ch[2]) + self.filesList.set_value(myiter,3,datetime.datetime.fromtimestamp(ch[3])) + self.filesList.set_value(myiter,4,1) + self.filesList.set_value(myiter,5,'direktorja') + self.filesList.set_value(myiter,6,gtk.STOCK_DIRECTORY) + #print datetime.datetime.fromtimestamp(ch[3]) + + # all the rest + self.db_cursor.execute("SELECT o.child, f.filename, f.size, f.date, f.type FROM files_connect o LEFT JOIN files f ON o.child=f.id WHERE o.parent=? AND o.depth=1 AND f.type!=1 ORDER BY f.filename",(id,)) + for ch in self.db_cursor.fetchall(): + myiter = self.filesList.insert_before(None,None) + self.filesList.set_value(myiter,0,ch[0]) + self.filesList.set_value(myiter,1,ch[1]) + self.filesList.set_value(myiter,2,ch[2]) + self.filesList.set_value(myiter,3,datetime.datetime.fromtimestamp(ch[3])) + self.filesList.set_value(myiter,4,ch[4]) + self.filesList.set_value(myiter,5,'kategoria srategoria') + self.filesList.set_value(myiter,6,gtk.STOCK_FILE) + #print datetime.datetime.fromtimestamp(ch[3]) + return + + def get_file_info(self,id): + """get file info from database""" + self.db_cursor.execute("SELECT filename, date, size, type FROM files WHERE id = ?",(id,)) + set = self.db_cursor.fetchone() + if set == None: + return '' + + string = """Filename: %s +Date: %s +Size: %s +type: %s""" % (set[0],datetime.datetime.fromtimestamp(set[1]),set[2],set[3]) + return string + # private class functions - def __connect_to_db(self): self.db_connection = sqlite.connect("%s" % self.internal_filename, detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES) self.db_cursor = self.db_connection.cursor() @@ -122,7 +204,9 @@ class MainModel(ModelMT): # jako, że to jest w osobnym wątku, a sqlite się przypieprza, że musi mieć # konekszyn dla tego samego wątku, więc robimy osobne połączenie dla tego zadania. - db_connection = sqlite.connect("%s" % self.internal_filename, detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES) + db_connection = sqlite.connect("%s" % self.internal_filename, + detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES, + isolation_level="IMMEDIATE") db_cursor = db_connection.cursor() timestamp = datetime.datetime.now() @@ -140,7 +224,10 @@ class MainModel(ModelMT): for root,kat,plik in os.walk(self.path): for p in plik: count+=1 - step = 1.0/count + if count > 0: + step = 1.0/count + else: + step = 1.0 self.count = 0 def __recurse(path,name,wobj,date=0,frac=0,size=0,idWhere=1): @@ -153,6 +240,8 @@ class MainModel(ModelMT): idWhere - simple id parent, or "place" where to add node """ #{{{ + if self.abort: + return -1 _size = size walker = os.walk(path) root,dirs,files = walker.next() @@ -167,9 +256,15 @@ class MainModel(ModelMT): for i in dirs: st = os.stat(os.path.join(root,i)) - _size = _size + __recurse(os.path.join(path,i),i,wobj,st.st_mtime,frac,0,currentid) + dirsize = __recurse(os.path.join(path,i),i,wobj,st.st_mtime,frac,0,currentid) + if dirsize == -1: + break + else: + _size = _size + dirsize for i in files: + if self.abort: + break self.count = self.count + 1 st = os.stat(os.path.join(root,i)) @@ -201,30 +296,90 @@ class MainModel(ModelMT): db_cursor.execute("insert into files_connect(parent,child,depth) values(?,?,?)",(currentfileid, currentfileid, 0)) if currentid>0: db_cursor.execute("insert into files_connect(parent, child, depth) select r1.parent, r2.child, r1.depth + r2.depth + 1 as depth FROM files_connect r1, files_connect r2 WHERE r1.child = ? AND r2.parent = ? ",(currentid, currentfileid)) - db_connection.commit() db_cursor.execute("update files set size=? where id=?",(_size, currentid)) - return _size + if self.abort: + return -1 + else: + return _size #}}} - #self.db_connection.commit() - __recurse(self.path,self.label,self,0,step) - - db_connection.commit() - db_cursor.close() + if __recurse(self.path,self.label,self,0,step) == -1: + db_cursor.close() + db_connection.rollback() + else: + db_cursor.close() + db_connection.commit() + self.__prepare_discs_treemodel() db_connection.close() + if __debug__: + print "scan time: ", (datetime.datetime.now() - timestamp) + self.modified = True self.busy = False #self.__display_main_tree() - #if self.sbid != 0: - # self.status.remove(self.sbSearchCId, self.sbid) self.statusmsg = "Idle" + self.progress = 0 + self.abort = False + + def __prepare_discs_treemodel(self): + """load data from DB to tree model""" + # cleanup treeStore + self.discsTree.clear() + + #connect + db_connection = sqlite.connect("%s" % self.internal_filename, + detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES) + db_cursor = db_connection.cursor() + db_cursor.execute("select count(id) from files where type=1") + count = db_cursor.fetchone()[0] + if count>0: + step = 1.0/self.count + else: + step = 1.0 + count = 0 + + self.statusmsg = "Fetching data from catalog file" + + def get_children(id, name, parent): + """fetch all children and place them in model""" + #{{{ + myiter = self.discsTree.insert_before(parent,None) + self.discsTree.set_value(myiter,0,id) + self.discsTree.set_value(myiter,1,name) + + # isroot? + if parent == None: + self.discsTree.set_value(myiter,2,gtk.STOCK_CDROM) + else: + self.discsTree.set_value(myiter,2,gtk.STOCK_DIRECTORY) + db_cursor.execute("SELECT o.child, f.filename FROM files_connect o LEFT JOIN files f ON o.child=f.id WHERE o.parent=? AND o.depth=1 AND f.type=1 ORDER BY f.filename",(id,)) + + # progress + self.progress = step * self.count + + for cid,name in db_cursor.fetchall(): + get_children(cid, name, myiter) + #}}} + + # get initial roots from first, default root (id: 1) in the tree, + # and then add other subroots to tree model + if __debug__: + data = datetime.datetime.now() + db_cursor.execute("SELECT o.child, f.filename FROM files_connect o LEFT JOIN files f ON o.child=f.id WHERE o.parent=1 AND o.depth=1 AND f.type=1 ORDER BY f.filename") + + # real volumes: + for id,name in db_cursor.fetchall(): + get_children(id,name,None) + if __debug__: + print "tree generation time: ", (datetime.datetime.now() - data) + + self.statusmsg = "Idle" self.progress = 0 - if __debug__: - print "scan time: ", (datetime.datetime.now() - timestamp) + return pass # end of class