Changeset 4712


Ignore:
Timestamp:
24/12/08 09:45:39 (11 years ago)
Author:
sdonegan
Message:

Updated to compile a report on number of files successfully (or not) ingested to the database and to list problem files for later collation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery/branches/ingestAutomation-upgrade/OAIBatch/oai_document_ingester.py

    r4664 r4712  
    99from time import strftime 
    1010from SchemaNameSpace import SchemaNameSpace 
     11from DIF import DIF 
     12from MDIP import MDIP 
     13import ndgUtils 
    1114from ndgUtils.ndgXqueries import ndgXqueries 
    12 import ndgUtils.lib.fileutilities as FileUtilities 
     15from FileUtilities import FileUtilities 
    1316from PostgresRecord import PostgresRecord 
    1417from PostgresDAO import PostgresDAO 
    15 from Utilities import idget 
     18from datetime import date 
    1619import db_funcs 
    1720 
    18 class oai_document_ingester(object): 
     21class oai_document_ingester: 
    1922        ''' 
    2023        Class to handle the ingest of files from the OAI harvester to the discovery service postgres DB 
     
    2427 
    2528        def getID(self, filename): 
    26                 ''' 
    27                 Gets the identifier out of an input metadata xml record.  
    28                 @param filename - name of document file being processed 
    29                 @return: ID - id to use to refer to the document 
    30                 ''' 
    31                 logging.info("Retrieving identifier for metadata record " + filename) 
    32                 xml=file(filename).read() 
    33                 ID = idget(xml) 
    34                 return ID 
     29                '''  
     30                Gets the identifier out of an input metadata xml record.  
     31                Copes with DIF and MDIP currently. 
     32                @param filename - name of document file being processed 
     33                @return: ID - id to use to refer to the document 
     34                ''' 
     35                logging.info("Retrieving identifier for metadata record " + filename) 
     36                xml=file(filename).read() 
     37                if self._datacentre_format == "DIF": 
     38                    d=DIF(xml) 
     39                    ID=d.entryID 
     40                elif self._datacentre_format == "MDIP": 
     41                    d=MDIP(xml) 
     42                    ID=d.id 
     43                else: 
     44                    raise TypeError, "Only handles DIF or MDIP here." 
     45         
     46                logging.info("Found identifier: " + ID) 
     47                return ID 
    3548         
    3649         
     
    4154                @param filename: full path of file to add to postgres DB  
    4255                ''' 
     56                 
     57                #filename = self.discDir + actualFilename 
     58                 
    4359                if not os.path.isfile(filename): 
    4460                        logging.info("Skipping, %s - not a valid file" %filename) 
     
    4662                 
    4763                logging.info("Adding file, " + filename + ", to postgres DB") 
     64                 
     65                numSlash = len(filename.split('/')) 
     66                shortFilename = filename.split('/')[numSlash - 1] 
    4867                 
    4968                # first of all create a PostgresRecord - this object represents all the data required 
     
    5170                dao = None 
    5271                try: 
     72                         
    5373                        discoveryID = self.getID(filename) 
     74                         
    5475                        record = PostgresRecord(filename, self._NDG_dataProvider, \ 
    5576                                                            self._datacentre_groups, self._datacentre_namespace, \ 
    5677                                                            discoveryID, self._xq, self._datacentre_format) 
    5778         
     79                         
    5880                        # Now create the data access object to interface to the DB 
    5981                        dao = PostgresDAO(record, self._dbConnection) 
    60                  
     82                         
    6183                        # Finally, write the new record 
    62                         if dao.createOrUpdateRecord(): 
     84                        if dao.createOrUpdateRecord():                           
    6385                                self._no_files_ingested += 1 
     86                                 
     87                         
    6488                except: 
     89                         
     90                        #if error encountered, add to failure lisr 
     91                        logging.error("Could not update: " + filename) 
     92                         
     93                        originalRecordFilename = self.inputFileOrigFinal[shortFilename] 
     94                        self.updateFailList.append(originalRecordFilename) 
     95                         
    6596                        logging.error("Exception thrown - detail: ") 
    6697                        logging.error(sys.exc_info()) 
     
    112143                    if words[0] == 'namespace': 
    113144                        self._datacentre_namespace = words[1] 
    114                     if words[0] == 'NDG_dataProvider': 
     145                    if words[0] == 'self._NDG_dataProvider': 
    115146                        self._NDG_dataProvider = True 
    116147                 
     
    203234                if datacentre is None: 
    204235                        self.usage() 
     236                         
     237                #create list to to hold files ingest failed on. 
     238                self.updateFailList = [] 
     239                 
     240                # create file utils object to do various file related stuff 
     241                fileUtils = FileUtilities() 
    205242                 
    206243                numfilesproc = 0 
     
    242279                 
    243280                # Create/clear the 'in' directory pristine copy of the discovery records 
    244                 FileUtilities.setUpDir(originals_dir) 
     281                fileUtils.setUpDir(originals_dir) 
    245282                commandline = "find " + self._harvest_home + " -type f -print | xargs -i cp \{\} " + originals_dir 
    246283                logging.info("Executing : " + commandline) 
     
    251288                 
    252289                # Create/clear the directory for the 'out' processed copy of the discovery records. 
    253                 FileUtilities.setUpDir(discovery_dir) 
     290                fileUtils.setUpDir(discovery_dir) 
    254291                     
    255292                #Execute the script which processes/renames the files (changed 08/01/07 to get id from inside file) 
    256293                # - also replace any namespace declarations with a standard one which we know works in NDG 
    257                 # NB, this copies files from the original dir to the discovery dir 
     294                # NB, this copies files from the original dir to the discovery dir               
     295                self.inputFileOrigFinal = {} 
     296                 
    258297                logging.info(self.lineSeparator) 
    259298                logging.info("Renaming files:") 
     299         
    260300                for filename in os.listdir(originals_dir): 
    261                         if filename.endswith('.xml'): 
     301                        if filename.endswith('.xml'):                            
    262302                                original_filename = originals_dir + filename 
     303                                                                 
    263304                                try: 
    264305                                        ident=self.getID(original_filename) 
     306                                         
    265307                                except Exception, detail: 
    266308                                        logging.error("Could not retrieve ID from file, %s" %filename) 
     
    275317                                                ident = ident.replace("/","-") 
    276318                                                new_filename = discovery_dir + "/" +self._datacentre_namespace+ "__"+self._datacentre_format+ "__"+ ident +".xml" 
     319                                                new_filename_short = self._datacentre_namespace+ "__"+self._datacentre_format+ "__"+ ident +".xml" 
    277320                                                logging.info("original file = " + original_filename) 
    278321                                                logging.info("newfile = " + new_filename) 
    279                                  
     322                                                 
     323                                                #create list of all ORIGINAL filenames for ingest reporting (use actual filename) 
     324                                                #this links a derived filename in processing dir with original filename 
     325                                                #get basic filename from the path+filename passed to this function to use as key                 
     326                                                self.inputFileOrigFinal[new_filename_short]=filename 
     327                                                                                                                 
    280328                                # now correct any namespace issues 
    281329                                try: 
     
    289337                        else: 
    290338                                logging.warning('File %s is not xml format. Not processed'  %(filename)) 
     339                                 
     340                         
    291341                 
    292342                logging.info(self.lineSeparator) 
     
    296346                self._xq=ndgXqueries() 
    297347                for libFile in self._xq.xqlib: 
    298                         FileUtilities.createFile(libFile, self._xq.xqlib[libFile]) 
     348                        fileUtils.createFile(libFile, self._xq.xqlib[libFile]) 
    299349                 
    300350                # Process the resulting files and put the data into the postgres DB 
     
    303353                self._getDBConnection() 
    304354                 
     355                #add this to self so can produce list of failed files 
     356                #self.discDir = discovery_dir 
     357                 
    305358                filenames = os.listdir(discovery_dir) 
    306359                for filename in filenames: 
     
    311364                 
    312365                this_backupdir = backupdir_base + "_originals/" 
    313                 FileUtilities.makeBackUp(originals_dir, this_backupdir) 
     366                #fileUtils.makeBackUp(originals_dir, this_backupdir) 
    314367                 
    315368                #Clear out the original harvest records area and discovery dir 
    316                 FileUtilities.cleanDir(originals_dir) 
    317                 FileUtilities.cleanDir(discovery_dir) 
     369                fileUtils.cleanDir(originals_dir) 
     370                #fileUtils.cleanDir(discovery_dir) 
     371                 
     372                #create a summary file for each data centre ingest 
     373                data_dir = self._base_dir + "data/" 
     374                recOpFileName = data_dir + datacentre + "_ingestSummary.txt"             
     375                recOpFile = open(recOpFileName,'w') 
    318376                 
    319377                logging.info("oai_document_ingest processing complete:") 
     378                 
     379                recOpFile.write("Ingest report for data centre: " + datacentre + "\n") 
     380                recOpFile.write("Ingest date: " + str(date.today()) + "\n") 
     381                recOpFile.write("Original metadata directory: " + self._harvest_home + "\n\n") 
     382                recOpFile.write("PROCESSED " + str(numfilesproc) + "\n") 
     383                recOpFile.write("INGESTED " + str(self._no_files_ingested)  + "\n") 
     384                 
    320385                if self._no_problem_files == 0: 
    321386                        logging.info("All files successfully processed - cleaning harvest directory") 
    322                         FileUtilities.cleanDir(self._harvest_home) 
     387                        #fileUtils.cleanDir(self._harvest_home) 
    323388                else: 
    324389                        logging.error("Problems experienced with %s files" %self._no_problem_files) 
    325390                        logging.error("- harvest directory will not be cleared until these have been fixed and the script has been reran") 
     391                         
     392                        logging.info("INFO: Could not ingest the following files into the Discovery Database: ") 
     393                         
     394                        recOpFile.write("PROBLEM_NUM "  + str(self._no_problem_files)  + "\n") 
     395                         
     396                        for badFile in self.updateFailList: 
     397                                logging.info("INFO: Could not ingest = %s" %badFile) 
     398                                recOpFile.write("PROBLEM_FILE " + badFile + "\n")                                        
    326399                 
    327400                logging.info(self.lineSeparator) 
     
    329402                logging.info("INFO: Number of files ingested = %s" %self._no_files_ingested) 
    330403                logging.info(self.lineSeparator) 
    331                 print "Script finished running." 
    332                  
     404                 
     405                recOpFile.close() 
     406                                 
     407                 
     408                print "\nScript finished running." 
    333409         
    334410if __name__=="__main__": 
Note: See TracChangeset for help on using the changeset viewer.