Changeset 4165


Ignore:
Timestamp:
Apr 10, 2017, 6:03:08 PM (2 years ago)
Author:
Juanma
Message:

Added mdb-tools support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lliurex-abies2pmb/trunk/fuentes/lliurex-abies2pmb-core.install/abies2pmb.py

    r4163 r4165  
    22import os
    33import datetime
     4import subprocess
     5import sys
     6import tempfile
    47# -*- coding: utf-8 -*-
    58class abiesToPmb():
    6         def __init__(self):
    7                 self.dbg=1
     9        def __init__(self,mdbFile):
     10                self.dbg=0
     11               
    812                #Dict with relations between pmb and abies
    913                self.pmb_abies={}
    10 
    1114                self.pmb_abies["empr_categ"]=["TiposLector"]
    1215                self.pmb_abies["docs_location"]=["Ubicaciones"]
     
    2023                self.pmb_abies["indexint"]=["CDUs"]
    2124                self.pmb_abies["notices_tmp"]=["Fondos_all"]
     25
     26                #Blacklist pmb_abies tables.
     27                self.blacklist=['notices_tmp']
    2228
    2329                #Dict with abies source fields for pmb
     
    5460                self.formatFields['CDUs']={'index 0':'inc 1 1000'}
    5561                self.formatFields['Series']={'index 0':'inc 1 1000'}
    56 #               self.formatFields['Fondos_all']={'index 2':'from CDUs.0 on 0=1'}
    5762                self.formatFields['Fondos']={'index 1':'value 1="a",value 2="g",value 3="m",value4="j",value 5="k",value 6="a",value 7="l"'}
    5863                self.formatFields['Fondos'].update({'index 13':'from Autores.2 on 13=0'})
     
    6671                self.formatTables['Fondos_all']={'index 1':'from Fondos_CDUs.1 on 0=0'}
    6772                self.formatFields['Fondos_all']={'index 2':'from CDUs.0 on 0=1'}
    68 #DEPRECATED
    69                 #Dict with needed fields from abies
    70                 self.abies_fields={}
    71                 self.abies_fields["Ubicaciones"]=[0,1]
    72                 self.abies_fields["TiposLector"]=[0,1]
    73                 self.abies_fields["Autores"]=[0,1,2]
    74                 self.abies_fields["Editoriales"]=[0,1]
    75                 self.abies_fields["Cursos"]=[0,1]
    76                 self.abies_fields["Ejemplares"]=[0,4,2,"13+14+15",6,8]
    77                 self.abies_fields["Fondos_CDUs"]=[0,"1>CDUs.0"]
    78                 self.abies_fields["Series"]=[0,1]
    79 #DEPRECATED
    8073
    8174                #Dict with temp results
     
    8477                #Array with process order
    8578                self.executionOrder=['Ubicaciones','TiposLector','Autores','Editoriales','Cursos','Ejemplares','Series','CDUs','Fondos_all','Fondos']
    86 #               self.executionOrder=['Series']
    8779                #Tmp variables
    8880                self.workDir='/tmp/.abiesToPmb/'
     
    9082                self.tableValuesDict={}
    9183                self.tmpInc=0
    92 
     84                #Mdb file
     85                self.mdb=mdbFile
     86        #def _init
    9387
    9488        def _debug(self,msg):
    9589                if self.dbg:
    9690                        print('Migrator: '+str(msg))
     91        #def _debug
    9792
    9893        def _error(self,e):
    9994                print(str(e))
     95        #def _error
    10096
    10197        ###
     
    10399        ###
    104100        def beginMigration(self):
    105                 for abiesTable in self.executionOrder:
    106                         self.tmpInc=0
    107                         self._debug("Processing "+abiesTable)
    108                         self._loadTable(abiesTable)
    109                         pmbTable=self._getTableEquivalence(abiesTable)
    110                         self._generateSql(pmbTable,abiesTable)
    111                 print ("Files generated for tables "+str(self.executionOrder))
     101                returnValue=False
     102                if self.exportMdb():
     103                        for abiesTable in self.executionOrder:
     104                                self.tmpInc=0
     105                                self._debug("Processing "+abiesTable)
     106                                self._loadTable(abiesTable)
     107                                pmbTable=self._getTableEquivalence(abiesTable)
     108                                self._generateSql(pmbTable,abiesTable)
     109                        returnValue=True
     110                        self._debug("Files generated for tables "+str(self.executionOrder))
     111                return returnValue
    112112        #def beginMigration
     113
     114        def exportMdb(self):
     115                returnValue=None
     116                if os.path.exists(self.mdb):
     117                        try:
     118                                cmdOut=subprocess.check_output(['mdb-tables',self.mdb],universal_newlines=True)
     119                                if cmdOut:
     120                                        self.workDir=tempfile.mkdtemp()+"/"
     121                                        tables=cmdOut.strip("\n")
     122                                        listTables=tables.split(' ')
     123                                        for table in listTables:
     124                                                if table!='':
     125                                                        cmdOut=subprocess.check_output(['mdb-export','-H','-d|||',self.mdb,table],universal_newlines=True)
     126                                                        if cmdOut:
     127                                                                f=open (self.workDir+table+".csv",'w')
     128                                                                f.writelines(cmdOut)
     129                                                                f.close()
     130                                returnValue=True
     131                        except Exception as e:
     132                                self._error(e)
     133                                returnValue=False
     134                return returnValue
     135        #def exportMdb
    113136
    114137        ###
     
    121144                origData=self.tableValuesDict[abiesTable]
    122145                fileName=destTable+".sql"
    123                 f=open (fileName,'w')
     146                if destTable not in self.blacklist:
     147                        f=open (fileName,'w')
    124148                for line in origData:
    125149                        strInsertValues=''
     
    145169                                strInsertValues=strInsertValues+tmp+','
    146170                        strInsertValues=strInsertValues[:-1]
    147                         f.write("Insert into "+destTable+" values ("+strInsertValues+");\n")
    148                 f.close()
    149         #def fileParser
    150        
    151         #Gets the value from a file
    152         #Input: Tablename
    153         #Input: index of the field
    154         #Output: field value
    155         def _getFieldValue(self,tableName,index):
    156                 fieldValue=None
    157                 if tableName in self.tmpTableDict.keys():
    158                         listValues=self.tmpTableDict[tableName]
    159                         for line in listValues:
    160                                 pass
    161                 return fieldValue
    162         #def _getFieldValue
    163 
     171                        if destTable not in self.blacklist:
     172                                f.write("Insert into "+destTable+" values ("+strInsertValues+");\n")
     173                if destTable not in self.blacklist:
     174                        f.close()
     175        #def _generateSql
     176
     177        ###
     178        #Loads a table from a file or a virtual table from a bunch of tables
     179        #Input: Table name
     180        ###
    164181        def _loadTable(self,tableName):
    165                 fileName=tableName+'.csv'
     182                fileName=self.workDir+tableName+'.csv'
    166183                data=[]
    167184                if os.path.exists(fileName):
     
    183200                self.tableValuesDict[tableName]=data
    184201                if tableName in self.formatTables.keys():
    185                                 self.tableValuesDict[tableName]=self._checkTransformTables(tableName)
    186 
     202                        self.tableValuesDict[tableName]=self._checkTransformTables(tableName)
     203        #def _loadTable
     204
     205        ###
     206        #Loads a virtual table as described by virtual table's dict
     207        #Input: Table name
     208        #Output: Dataset (array of arrays) with the virtual table
     209        ###
    187210        def _loadVirtualTable(self,tableName):
    188211                self._debug("Loading virtual table "+tableName)
     
    223246                return(data)
    224247
     248        ###
     249        #Finds the pmb table related with an abies table
     250        #Input: Table name in abies
     251        #Output: pmb table
     252        ###
    225253        def _getTableEquivalence(self,tableName):
    226254                pmbTable=None
     
    230258                                break
    231259                return pmbTable
    232 
     260        #def _getTableEquivalence
     261
     262        ###
     263        #Check if there's any transformation to apply to the fields of a table
     264        #Input: Abies table name
     265        #Output: Dict with field indexes as keys and transformations to apply as values
    233266        def     _checkTransformField(self,abiesTable):
    234267                transformDict={}
     
    255288                self._debug("TransformDict: "+str(transformDict))
    256289                return transformDict
    257 
     290        #def _checkTransformField
     291
     292        ###
     293        #Transform routines, self-explaining
     294        ###
    258295        def _transformAdd(self,line,index):
    259296                sourceIndex=line.split(' ')[1]
     
    309346                returnValue='self._funcIncrementField('+inc+')'
    310347                return(returnValue)
    311 
     348        ###
     349        #Some values need a special transformation that requires a helper function.
     350        #Those helper functions are the _func...
     351        ###
    312352        def _funcIncrementField(self,inc):
    313353                self.tmpInc=self.tmpInc+int(inc)
     
    363403                                returnValue=row[reqFieldIndex]
    364404                                break
    365                 print("Result: "+str(returnValue))
    366405                return returnValue
    367 
    368 
     406        #Transform fields functions
     407
     408        ###
     409        #Check if there's any Transform to apply to a whole table
     410        #Input: abies table
     411        #Output: Dataset with the table
     412        ###
    369413        def _checkTransformTables(self,tableName):
    370414                transformDict={}
     
    378422                                        transformDict=self._transformTableJoin(tableName,index,line)
    379423                return transformDict
    380 
     424        #def _checkTransformTamble
     425
     426        ###
     427        #Function helpers for table transformation. Self-explaining
     428        ###
    381429        def _transformTableUniq(self,tableName,index):
    382430                self._debug("Uniq items from index "+str(index))
     
    409457                #Walk through origin table and insert values from sourceTableDict
    410458                tmpIndex=int(joinFrom)
    411                 print("Setting values from "+tableName + " field: "+joinFrom)
    412459                for row in self.tableValuesDict[tableName]:
    413460                        rowIndex=row[tmpIndex]
     
    418465                        transformDict.append(row)
    419466                return transformDict
     467        #Table transformation function helpers
    420468
    421469### MAIN PROGRAM ###
    422 migration=abiesToPmb()
    423 migration.beginMigration()
     470
     471migration=abiesToPmb(sys.argv[1])
     472result=migration.beginMigration()
     473print(result)
    424474
    425475
Note: See TracChangeset for help on using the changeset viewer.