示例#1
0
文件: MGrep.py 项目: MValaguz/MGrep
 def slot_actionFactory_reset(self):
     """
        Ritorna alle preferenze di base eliminando la directory di lavoro. Al termine il programma viene chiuso senza salvare
     """
     if message_question_yes_no('Do you want delete the preferences files in folder ' + self.o_preferenze.work_dir + '?') == 'Yes':
         if message_question_yes_no('Are you sure?') == 'Yes':
             self.o_preferenze.cancella_tutto()
             message_info('Preferences files deleted! Close and restart the program!')                
示例#2
0
    def pubblica(self, p_tipo_server):
        """
            Pubblica il file Oracle Form o Oracle Report nei server indicati
            se p_tipo_server = 1 compila in SMILE, altrimenti in ICOM
        """
        from compile_oracle_form_report import pubblica_form_report

        # ricerco la posizione dell'indice selezionato e ne ricavo il contenuto
        try:
            v_index = self.o_lst1.selectedIndexes()[0]
        except:
            return
        v_item = self.lista_risultati.itemFromIndex(v_index)
        v_file = v_item.text()

        # tipo server
        if p_tipo_server == '1':
            v_nome = 'SMILE'
        else:
            v_nome = 'ICOM'
        # se è stato selezionato qualcosa
        if v_file != '' and message_question_yes_no(
                "Do you want to compile the file " + chr(10) + v_file +
                chr(10) + "and post it in " + v_nome + " system?") == 'Yes':
            #sono ammessi solo file con suffissi specifici
            if '.fmb' not in v_file and '.rdf' not in v_file:
                message_error(
                    'File is not in format "Oracle Form" or "Oracle Report"!')
            else:
                # apro una nuova finestra figlia della principale
                pubblica_form_report(v_file, self.o_preferenze.work_dir,
                                     p_tipo_server)
示例#3
0
 def slot_clear(self):
     """
        Cancella l'intera lista
     """
     if message_question_yes_no(
             'Do you want to clear result list?') == 'Yes':
         self.lista_risultati.clear()
示例#4
0
def killa_sessione(p_sid, p_serial, p_oracle_user_sys, p_oracle_password_sys,
                   p_oracle_dsn_real):
    """
        killa la sessione oracle dalla coppia p_sid e p_serial
    """
    if message_question_yes_no(
            "Do you want to kill the selected session?") == 'Yes':
        try:
            # connessione al DB come amministratore
            v_connection = cx_Oracle.connect(user=p_oracle_user_sys,
                                             password=p_oracle_password_sys,
                                             dsn=p_oracle_dsn_real,
                                             mode=cx_Oracle.SYSDBA)
            v_ok = True
        except:
            message_error(
                'Connection to oracle rejected. Please control login information.'
            )
            v_ok = False

        if v_ok:
            v_cursor = v_connection.cursor()
            v_cursor.execute("ALTER SYSTEM KILL SESSION '" +
                             str(p_sid).strip() + "," + str(p_serial).strip() +
                             "'")
            v_cursor.close()
            v_connection.close()
            message_info('The session is being closed.')
示例#5
0
文件: MGrep.py 项目: MValaguz/MGrep
 def slot_actionReset_main_window_position(self):
     """
        Reimposta la posizione e la dimensione della finestra principale
     """
     if message_question_yes_no('Do you want to reset position and size of main window?') == 'Yes':
         # dimensione finestra
         self.resize( 800, 600 )                        
         # centratura della window
         qr = self.frameGeometry()                
         cp = QtWidgets.QDesktopWidget().availableGeometry().center()                
         qr.moveCenter(cp)                
         self.move(qr.topLeft())            
示例#6
0
    def slot_startjob(self):
        """
            Avvia un job
        """
        if hasattr(self, 'lista_risultati'):
            # ottengo un oggetto index-qt della riga selezionata
            index = self.o_lst1.currentIndex()
            # non devo prendere la cella selezionata ma la cella 0 della riga selezionata (quella che contiene il nome del job)
            v_item_0 = self.lista_risultati.itemFromIndex(
                index.sibling(index.row(), 0))
            if v_item_0 != None:
                v_job_name = v_item_0.text()
                if message_question_yes_no(
                        'Do you want start ' + v_job_name +
                        ' job?\nNotice! MGrep will be waiting the end of job!'
                ) == 'Yes':
                    try:
                        # connessione al DB come amministratore
                        v_connection = cx_Oracle.connect(
                            user=self.o_preferenze.v_oracle_user_sys,
                            password=self.o_preferenze.v_oracle_password_sys,
                            dsn=self.e_server_name.currentText(),
                            mode=cx_Oracle.SYSDBA)
                    except:
                        message_error(
                            'Connection to oracle rejected. Please control login information.'
                        )
                        return []

                    # apro cursore
                    v_cursor = v_connection.cursor()
                    # imposto l'istruzione
                    v_istruzione = "BEGIN DBMS_SCHEDULER.RUN_JOB (job_name => 'SMILE." + v_job_name + "'); END;"
                    # eseguo istruzione monitorando eventuali errori (attivo l'icona della clessidra)
                    try:
                        QtWidgets.QApplication.setOverrideCursor(
                            QtGui.QCursor(QtCore.Qt.WaitCursor))
                        v_cursor.execute(v_istruzione)
                        QtWidgets.QApplication.restoreOverrideCursor()
                        message_info('Job finished :-)')
                    # se riscontrato errore --> emetto sia codice che messaggio
                    except cx_Oracle.Error as e:
                        errorObj, = e.args
                        message_error("Error: " + errorObj.message)

                    # chiudo e disattivo icona della clessidra
                    v_cursor.close()
                    v_connection.close()
                    QtWidgets.QApplication.restoreOverrideCursor()
示例#7
0
文件: MGrep.py 项目: MValaguz/MGrep
 def slot_actionSave_the_windows_position(self):
     """
        Salva la posizione delle finestre per riaprirle identiche all'avvio del programma
     """
     if message_question_yes_no('Do you want to save the windows position and set them for the next program startup?') == 'Yes':
         # pulisco la lista delle posizioni delle window
         self.o_preferenze.l_windows_pos.clear()
         
         # ricerco informazioni della window principale (è l'unica window di cui salvo sia posizione che dimensione)
         o_pos = self.geometry()            
         o_rect = o_pos.getRect()            
         self.o_preferenze.l_windows_pos.append( "MainWindow " + str(o_rect[0]) + " " + str(o_rect[1]) + " " +  str(o_rect[2]) + " " + str(o_rect[3]) )                                    
         # salvo i nomi delle varie finestre aperte
         o_window_list = self.mdiArea.subWindowList()                        
         for i in range(0,len(o_window_list)):                
             self.o_preferenze.l_windows_pos.append( str(o_window_list[i].windowTitle()).replace(' ','_') ) 
                 
         # salvo la lista            
         self.o_preferenze.salva_pos_finestre()            
示例#8
0
    def slot_enablejob(self):
        """
            Riattiva un job
        """
        if hasattr(self, 'lista_risultati'):
            # ottengo un oggetto index-qt della riga selezionata
            index = self.o_lst1.currentIndex()
            # non devo prendere la cella selezionata ma la cella 0 della riga selezionata (quella che contiene il nome del job)
            v_item_0 = self.lista_risultati.itemFromIndex(
                index.sibling(index.row(), 0))
            if v_item_0 != None:
                v_job_name = v_item_0.text()
                if message_question_yes_no('Do you want enable ' + v_job_name +
                                           ' job?') == 'Yes':
                    try:
                        # connessione al DB come amministratore
                        v_connection = cx_Oracle.connect(
                            user=self.o_preferenze.v_oracle_user_sys,
                            password=self.o_preferenze.v_oracle_password_sys,
                            dsn=self.e_server_name.currentText(),
                            mode=cx_Oracle.SYSDBA)
                    except:
                        message_error(
                            'Connection to oracle rejected. Please control login information.'
                        )
                        return []

                    # apro cursore
                    v_cursor = v_connection.cursor()
                    # imposto l'istruzione
                    v_istruzione = "BEGIN DBMS_SCHEDULER.ENABLE (name => 'SMILE." + v_job_name + "'); END;"
                    # eseguo istruzione monitorando eventuali errori
                    try:
                        v_cursor.execute(v_istruzione)
                        message_info(v_job_name + ' was enabled!')
                    # se riscontrato errore --> emetto sia codice che messaggio
                    except cx_Oracle.Error as e:
                        errorObj, = e.args
                        message_error("Error: " + errorObj.message)

                    # chiudo
                    v_cursor.close()
                    v_connection.close()
示例#9
0
 def slot_backup_line(self):
     """
         Copia il file indicato all'interno di un file zip di nome Old, presente nella medesima
         cartella del file di partenza. Se il file zip non esiste, viene creato. Se esiste il file
         indicato viene accodato
     """
     if message_question_yes_no(
             "Do you want to backup file into old.zip?") == 'Yes':
         # ricerco la posizione dell'indice selezionato e ne ricavo il contenuto
         try:
             v_index = self.o_lst1.selectedIndexes()[0]
         except:
             return
         v_item = self.lista_risultati.itemFromIndex(v_index)
         v_seltext = v_item.text()
         #scompongo l'intera pathname in tutte le sue componenti (directory, nome file, suffisso)
         v_directory = os.path.split(v_seltext)[0]
         v_solo_nome_file = os.path.split(v_seltext)[1]
         v_solo_nome_file_senza_suffisso = os.path.splitext(
             v_solo_nome_file)[0]
         v_suffisso_nome_file = os.path.splitext(v_solo_nome_file)[1]
         #prendo la data di sistema che servirà per dare un suffisso al nome del file che viene zippato
         v_system_date = datetime.datetime.now()
         v_str_data = '_' + str(v_system_date.year) + '_' + str(
             v_system_date.month) + '_' + str(v_system_date.day)
         if v_directory != '':
             try:
                 #apro il file zip (se non esiste lo creo)
                 v_zip = zipfile.ZipFile(v_directory + '\\old.zip', 'a')
                 #accodo il file indicato allo zip (il nome di arrivo è il nome del file più suffisso data)
                 v_zip.write(
                     v_seltext, v_solo_nome_file_senza_suffisso +
                     v_str_data + '.' + v_suffisso_nome_file)
                 #chiudo lo zip e emetto messaggio che procedura terminata
                 v_zip.close()
                 message_info('The file ' + v_solo_nome_file +
                              ' is been copied into Old.zip')
             except:
                 message_error('Error to copy the file into Old zip!')
    def copia_tabella(self,
                      v_user_db,
                      v_password_db,
                      v_dsn_db,
                      v_table_name,
                      v_table_where,
                      v_sqlite_db_name,
                      v_blob_pathname): 
                                      
        #Collegamento a Oracle
        try:
            v_oracle_db = cx_Oracle.connect(user=v_user_db, password=v_password_db, dsn=v_dsn_db)        
        except:
            message_error("Connecting problems to Oracle DB!")
            #esco
            return 'ko'
        v_oracle_cursor = v_oracle_db.cursor()    
        #Apre il DB sqlite    
        v_sqlite_conn = sqlite3.connect(database=v_sqlite_db_name)
        #Indico al db di funzionare in modalità byte altrimenti ci sono problemi nel gestire utf-8
        v_sqlite_conn.text_factory = bytes
        v_sqlite_cur = v_sqlite_conn.cursor()
        
        #Controllo se tabella SQLite esiste già
        v_sqlite_cur.execute("SELECT COUNT(*) FROM sqlite_master WHERE name='" + v_table_name + "'")                                
        #Se la tabella esiste chiedo se posso sovrascrivere
        if v_sqlite_cur.fetchone()[0] > 0:
            if message_question_yes_no("Table in SQLite DB already exist! Do you want overwrite it?") == 'Yes':                            
                #Cancello la tabella se già presente nel db sqlite
                query ='DROP TABLE ' + v_table_name
                v_sqlite_cur.execute(query)    
            else:
                #esco
                return 'ko'
            
        #Conta dei record nella tabella sorgente Oracle
        #Aggiungo la where (solo se caricata)        
        query = 'SELECT COUNT(*) FROM ' + v_table_name        
        if len(v_table_where.split()) > 0:
            query += ' WHERE ' + v_table_where
        try:    
            v_oracle_cursor.execute(query)
        except:
            message_error("Oracle table do not exists or errors in 'where' condition!")
            #esco
            return 'ko'
        
        v_total_rows = 0
        for row in v_oracle_cursor:                  
            v_total_rows = row[0]
        #Calcolo 1% che rappresenta lo spostamento della progress bar
        v_rif_percent = 0
        if v_total_rows > 100:
            v_rif_percent = v_total_rows // 100

        #Creo la tabella in ambiente di backup (ottengo lo script di create table)
        query = estrae_struttura_tabella_oracle('c', v_oracle_cursor, v_user_db, v_table_name)
        v_sqlite_cur.execute(query)

        #Creo una lista con le posizioni dei campi dove si trovano i blob 
        #In pratica un array dove sono segnati le posizioni dei campi
        #Esempio:
        #CREATE TABLE ta_files (
        #  files_nu NUMBER(8,0)   NOT NULL,
        #  modul_do VARCHAR2(1)   NOT NULL,
        #  files_do VARCHAR2(1)   NOT NULL,
        #  filen_co VARCHAR2(200) NOT NULL,
        #  exten_co VARCHAR2(20)  NULL,
        #  files_fi BLOB          NULL,
        #  ....
        #)
        #La lista conterrà un solo elemento con valore 6 indicante la posizione del campo files_fi
        v_posizioni_blob = estrae_struttura_tabella_oracle('b', v_oracle_cursor, v_user_db, v_table_name)
        v_estensione_blob = estrae_struttura_tabella_oracle('e', v_oracle_cursor, v_user_db, v_table_name)

        #Se nella tabella sono presenti dei blob, creo una cartella nel file system dove ci finiranno i blob
        if v_posizioni_blob:     
            message_info('Table contains blob data! It will be copied in ' + v_blob_pathname + v_table_name)                                
            try: 
                os.mkdir(v_blob_pathname + v_table_name)                
            except:
                message_error('The table contains blob fields! The copy must create the directory ' + v_table_name + ' but this already exists!')                        
                exit()    
            #In questa cartella inserisco un file di testo che riporta le posizioni dei blob. Tale file verrà poi utilizzo nel caso
            #si voglia ricopiare la tabella dentro Oracle
            v_file_allegato = open(v_blob_pathname + v_table_name + '\\blob_fields_position.ini','w')
            v_file_allegato.write(str(v_posizioni_blob))
            v_file_allegato.close()                            
                    
        #Copia dei dati
        query = estrae_struttura_tabella_oracle('s', v_oracle_cursor, v_user_db, v_table_name) 
        #if v_table_where is not None:
        if len(v_table_where.split()) > 0:
            query += ' WHERE ' + v_table_where

        v_insert_base = estrae_struttura_tabella_oracle('i', v_oracle_cursor, v_user_db, v_table_name)         
        v_oracle_cursor.execute(query)        
        v_progress = 0
        v_puntatore_blob = 0
        v_valore_colonna = str()
        for row in v_oracle_cursor:                  
            v_1a_volta = True
            v_insert = v_insert_base            
            for count, column in enumerate(row):                
                if column is None:
                    v_valore_colonna = ''
                else:                
                    v_valore_colonna = column
                    #se la colonna è un blob --> sostituisco il contenuto con quello del puntatore 
                    #e scrivo il contenuto della colonna come file separato in directory a parte
                    if v_posizioni_blob:                
                        if count+1 in v_posizioni_blob:                    
                            v_puntatore_blob += 1                                                
                            v_file_allegato = open(v_blob_pathname + v_table_name + '\\' + str(v_puntatore_blob) + '.zzz','wb')
                            v_file_allegato.write(column.read())
                            v_file_allegato.close()                            
                            v_valore_colonna = str(v_puntatore_blob)                    
                    
                #compongo la insert con il contenuto della colonna (da notare il replace del carattere " con apice singolo!)
                v_valore_colonna = str(v_valore_colonna)                    
                if v_1a_volta:                
                    v_insert += '"' + v_valore_colonna.replace('"',"'") + '"'
                else:
                    v_insert += ',"' + v_valore_colonna.replace('"',"'") + '"'
                    
                v_1a_volta = False
            v_insert += ')'        
            v_sqlite_cur.execute(v_insert)    

            #Emetto percentuale di avanzamento ma solo se righe maggiori di 100
            if v_total_rows > 100:
                v_progress += 1
                if v_progress % v_rif_percent == 0:                                    
                    self.avanza_progress('Total records to copy: ' + str(v_total_rows))
                    #print('Avanzamento scrittura...' + str((v_progress*100//v_total_rows)+1) + '%')                    
        #commit
        v_sqlite_conn.commit()                        
        #chiusura dei cursori
        v_sqlite_conn.close()                    
        v_oracle_cursor.close()   
        
        return 'ok' 
示例#11
0
    def __init__(self, p_csv_name, p_csv_separator, p_modalita_test):

        # rendo la mia classe una superclasse
        super(convert_csv_to_excel, self).__init__()

        # creazione della wait window
        self.v_progress_step = 0
        self.progress = QtWidgets.QProgressDialog(self)
        self.progress.setMinimumDuration(0)
        self.progress.setWindowModality(QtCore.Qt.WindowModal)
        self.progress.setWindowTitle("Copy...")

        # icona di riferimento
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons/icons/MGrep.ico"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.progress.setWindowIcon(icon)

        # imposto valore minimo e massimo a 0 in modo venga considerata una progress a tempo indefinito
        # Attenzione! dentro nel ciclo deve essere usata la funzione setvalue altrimenti non visualizza e non avanza nulla!
        self.progress.setMinimum(0)
        self.progress.setMaximum(100)
        # creo un campo label che viene impostato con 100 caratteri in modo venga data una dimensione di base standard
        self.progress_label = QtWidgets.QLabel()
        self.progress_label.setText('.' * 100)
        # collego la label già presente nell'oggetto progress bar con la mia label
        self.progress.setLabel(self.progress_label)

        # controllo sia stato indicato il separatore csv
        if p_csv_separator == '':
            message_error('Insert a csv separator!')
            return None

        #Spezzo il nome del file per ricavare il nome di destinazione e controllo che la destinazione non esista
        v_solo_nome_file = os.path.split(p_csv_name)[1]
        v_solo_directory = os.path.split(p_csv_name)[0]
        v_solo_nome_file_senza_suffisso = os.path.splitext(v_solo_nome_file)[0]
        v_suffisso_nome_file = os.path.splitext(v_solo_nome_file)[1]
        v_xls_name = v_solo_directory + '//' + v_solo_nome_file_senza_suffisso + '.xlsx'
        if os.path.isfile(v_xls_name):
            if message_question_yes_no(
                    "Destination file already exists. Do you to replace it?"
            ) == 'No':
                # esco dalla procedura perché utente ha deciso di non preseguire
                return None

        #Apro il file e conto le righe
        v_total_rows = 0
        with open(p_csv_name, encoding='latin-1', mode='r') as v_file:
            for v_line in v_file:
                v_total_rows += 1

        #Calcolo l'1% che rappresenta lo spostamento della progress bar
        v_rif_percent = 0
        if v_total_rows > 100:
            v_rif_percent = v_total_rows // 100

        #Creazione del file excel
        workbook = Workbook(v_xls_name)
        worksheet = workbook.add_worksheet()

        #Rileggo il file e converto da un formato all'altro
        v_progress = 0
        v_y = 0
        with open(p_csv_name, encoding='latin-1', mode='r') as v_file:
            for v_line in v_file:
                v_valori = v_line.split(p_csv_separator)
                v_x = 0
                for campo in v_valori:
                    if check_campo_numerico(campo):
                        worksheet.write(v_y, v_x, campo_numerico(campo))
                    else:
                        worksheet.write(v_y, v_x, campo)
                    v_x += 1
                v_y += 1
                #Emetto percentuale di avanzamento ma solo se righe maggiori di 100
                if v_total_rows > 100:
                    v_progress += 1
                    if v_progress % v_rif_percent == 0:
                        self.avanza_progress('Total record to copy: ' +
                                             str(v_total_rows))

        #Chiusura del file e del db
        self.avanza_progress('Finalizing process...')
        workbook.close()
        #Messaggio finale
        message_info('File conversion completed!')

        return None