コード例 #1
0
ファイル: register.py プロジェクト: janhradek/regfile
    def registercheck(self, register):
        """
        register (or check) the given files
        """
        pgr, pcom, pdir, psize = "", "", "", 0 # previous group, comment, directory and size
        tstart = time.time()
        ii = 0
        failfiles = []
        dbFilesToStore = []
        with self.dbConnection.getSessionContext() as session:
            for ff in self.files:
                ii = ii + 1
                fileMightBeRegistered = False
                cdir = os.path.dirname(ff) # directory
                sff = os.path.basename(ff) # short filename
                try:
                    if cdir != pdir:
                        print("Directory [{}]".format(cdir))
                        pdir = cdir

                    dbf = DBFile(fileName = sff)

                    if register: # group and comment
                        gr, com = self.getgroupcomment(ff)
                        if gr != pgr or com != pcom:
                            print("Using group:'{}' comment:'{}'".format(gr, com))
                            pgr, pcom = gr, com
                        dbf.group, dbf.comment = gr, com
                    self.printstatus(ii, sff, "Quick")

                    # stage 1 - silent
                    ms = MySum(ff)
                    ms.upgrade(1)
                    dbf.fileSize = ms.fileSize
                    dbf.md1 = ms.md1

                    fileMightBeRegistered = self._determineFileMightBeRegistered(
                            session     = session,
                            fileSize    = dbf.fileSize,
                            md1         = dbf.md1,
                    )

                    if ((not register) and (not fileMightBeRegistered)):
                        self.printstatus(ii, sff, "FAILED")
                        failfiles.append(ff)
                        print()
                        continue

                    tt = threading.Thread(target=ms.upgrade,args=[2])
                    tt.start()
                    while tt.is_alive():
                        try:
                            self.printstatus(ii, sff, self.msgpgs(ms,psize,tstart,fileMightBeRegistered))
                            time.sleep(0.25)
                        except KeyboardInterrupt:
                            ms.requestStop()
                            tt.join()
                            raise

                    tt.join()

                    psize = psize + ms.fileSize

                    dbf.md5     = ms.md5
                    dbf.ed2k    = ms.ed2k

                    matchingDBFile = self._determineMatchingDBFile(
                            session     = session,
                            fileSize    = dbf.fileSize,
                            md1         = dbf.md1,
                            md5         = dbf.md5,
                            ed2k        = dbf.ed2k,
                    )

                    fullMatch = (
                            (matchingDBFile is not None) and
                            (dbf.fileName == matchingDBFile.fileName) and
                            (dbf.group == matchingDBFile.group) and
                            (dbf.comment == matchingDBFile.comment)
                    )

                    if register:
                        if (matchingDBFile is None):
                            DBFileRegister.insert(session, dbf, commit=False)
                            self.printstatus(ii, sff, "New entry " + str(dbf.fileId))
                            dbFilesToStore.append(dbf)
                        else:
                            if (fullMatch):
                                self.printstatus(ii, sff, "Already registered (full match) as " + str(matchingDBFile.fileId))
                            else:
                                self.printstatus(ii, sff, "Already registered (data match) as " + str(matchingDBFile.fileId))
                            failfiles.append(ff)
                    else:
                        if (matchingDBFile is None):
                            self.printstatus(ii, sff, "FAILED")
                            failfiles.append(ff)
                        else:
                            stat = "OK"
                            if (dbf.fileName != matchingDBFile.fileName):
                                stat = "(as " + matchingDBFile.fileName + ") OK"
                            stat = "id:" + str(matchingDBFile.fileId) + " " + stat
                            self.printstatus(ii, sff, stat)
                    print()
                except KeyboardInterrupt:
                    self.printstatus(ii, sff, "Interrupted")
                    failfiles.append(ff + "    (Interrupted)")
                    print()
                    break

            print(self.RULER)
            if register:
                print("About to register {} files out of {}".format(ii-len(failfiles),ii))
            else:
                print("Passed {} files out of {}.{}".format(ii-len(failfiles), ii, "ALL OK" if not len(failfiles) else "" ))
            if len(failfiles) > 0:
                print("A list of files that failed:")
                for ff in failfiles:
                    print("    " + ff)
            if register:
                if len(failfiles) == ii:
                    print("No files were registered!")
                elif self.docommit(failfiles):
                    session.commit()
                    for storedDBFile in dbFilesToStore:
                        self.log(Register.LOGADD + self._formatDBFileForLog(storedDBFile))
                    print("Done.")
                else:
                    print("Aborted!")