Ignore:
Timestamp:
01/05/08 14:15:41 (12 years ago)
Author:
cbyrom
Message:

Add script to run ingest for all avaiable config files.
Make oai_ingest_new2 a proper object.
Adjust db_funcs - now pass in details to set up database connection

  • although defaults available, if not done.

Simplify coord parsing in PostgresRecord? by using a reusable function.
+ various tidy ups and fixes.

File:
1 edited

Legend:

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

    r3814 r3839  
    1010class PostgresDAO: 
    1111     
    12     def __init__(self, record): 
     12    def __init__(self, record, connection=None): 
    1313        ''' 
    1414        Constructor - to initialise the DAL and do some initial setting up 
     
    1818            sys.exit("USAGE: argument 1 = PostgresRecord object to process") 
    1919        else: 
    20             print "INFO: Creating/updating DB entry for record, %s" %record.id 
    21  
    22         # setup a connection to the db 
    23         self._connection = db_connect() 
     20            print "INFO: Creating/updating DB entry for record, %s" %record.discovery_id 
     21 
     22        # setup a connection to the db - if none specified 
     23        if connection is None: 
     24            connection = db_funcs.db_connect() 
     25        self._connection = connection 
    2426        self._record = record 
    2527        self.id = None 
    2628         
     29 
     30    def commavaluesfromsublist(self, list): 
     31        ''' 
     32        Creates an comma-separated string of values from a list of sublists, taking  
     33        the first element of each sublist 
     34        ''' 
     35        csvString = "" 
     36        for item in list: 
     37            if item: 
     38                if len(csvString) > 0: 
     39                    csvString += ","     
     40                csvString += "%s" % item[0] 
     41             
     42        return csvString 
     43 
    2744             
    2845    def getRecordID(self): 
     
    3350        ''' 
    3451        logging.info("Looking up record, " + self._record.discovery_id + " in DB") 
    35         if self.id is not None & self.id > 0: 
     52        if self.id is not None and self.id > 0: 
    3653            logging.info("Already looked up record - ID is " + self.id) 
    3754            return self.id 
     
    4663        Looks up a record in the DB; if it finds it, update it, otherwise create it 
    4764        ''' 
    48         if getRecordID() > 0: 
    49             createRecord() 
    50         else: 
    51             updateRecord() 
     65        if self.getRecordID() > 0: 
     66            self.createRecord() 
     67        else: 
     68            self.updateRecord() 
    5269 
    5370             
     
    5976        # firstly store the actual documents contained by the record - i.e. the original doc + 
    6077        # the various transforms required 
    61         _insertOriginalRecord() 
    62         _insertMetadataRecords() 
     78        self._insertOriginalRecord() 
     79        self._insertMetadataRecords() 
    6380         
    6481        # Now add the spatiotemporal data 
    65         _insertSpatioTemporalData() 
     82        self._insertSpatioTemporalData() 
    6683        logging.info("New record created") 
    6784             
     
    7794            # firstly update the actual documents contained by the record - i.e. the original doc + 
    7895            # the various transforms required 
    79             _updateMetadataRecords(record) 
     96            self._updateMetadataRecords(record) 
    8097             
    8198            # Now update the spatiotemporal data 
    82             _updateSpatioTemporalData(record) 
     99            self._updateSpatioTemporalData(record) 
    83100         
    84101         
     
    106123 
    107124     
    108     def _insertSpatioTemporalData(): 
     125    def _insertSpatioTemporalData(self): 
    109126        ''' 
    110127        Create a record in the postgres DB based on the spatiotemporal data  
     
    114131        # NB, build the query up in two parts so that we only include the correct data 
    115132        sqlStart = "" 
     133        insert_sql="INSERT INTO "+location_table+" (geom) VALUES ( setsrid('BOX3D("+west+" "+south+","+east+" "+north+")'::box3d,4326) );" 
    116134        sqlEnd = " VALUES (DEFAULT, '" + self._record.id  
    117135        if (not self._record.hasNullCoords()): 
     
    143161             
    144162     
    145     def _updateSpatioTemporalData(): 
     163    def _updateSpatioTemporalData(self): 
    146164        ''' 
    147165        Updates a record in the postgres DB based on the spatiotemporal data  
     
    175193     
    176194             
    177     def _insertOriginalRecord(): 
     195    def _insertOriginalRecord(self): 
    178196        ''' 
    179197        Insert the original metadata doc into the postgres DB 
     
    191209         
    192210     
    193     def _updateOriginalRecord(): 
     211    def _updateOriginalRecord(self): 
    194212        ''' 
    195213        Update the original doc in the postgres DB 
     
    207225     
    208226             
    209     def _insertMetadataRecords(): 
     227    def _insertMetadataRecords(self): 
    210228        ''' 
    211229        Insert the metadata docs into the postgres DB 
     
    228246     
    229247     
    230     def _updateMetadataRecords(): 
     248    def _updateMetadataRecords(self): 
    231249        ''' 
    232250        Update the metadata docs into the postgres DB 
     
    253271        ''' 
    254272        self._record = record 
     273 
     274 
     275     
     276    def link_spatial_and_temporal(Mid,west,south,east,north,startdate,enddate): 
     277        ''' 
     278        Creates an entry in the item/time/location table linking an item, time and location. 
     279        ''' 
     280        locationid = insert_spatial_coverage(Mid,west,south,east,north) 
     281        timeid = insert_temporal_coverage(Mid,startdate,enddate) 
     282        if (locationid > -1): 
     283            locationidstr = "%s" % locationid 
     284        else: 
     285            locationidstr = "NULL" 
     286     
     287        if (timeid > -1): 
     288            timeidstr = "%s" % timeid 
     289        else: 
     290            timeidstr = "NULL" 
     291     
     292        itemtimelocation_sql = "INSERT INTO "+item_table+" (itemid, locationid, timeid) values ('"+Mid+"', "+locationidstr+", "+timeidstr+" );" 
     293     
     294        print "ItemTimeLocation:\t"+itemtimelocation_sql 
     295        cursor = connection.cursor() 
     296        try: 
     297            cursor.execute(itemtimelocation_sql) 
     298        except: 
     299            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value) 
     300        connection.commit() 
     301     
     302    def link_spatial(Mid,west,south,east,north): 
     303            '''Creates an entry in the item/time/location table linking an item and location only''' 
     304            locationid = insert_spatial_coverage(Mid,west,south,east,north) 
     305            if (locationid > -1): 
     306                    locationidstr = "%s" % locationid 
     307            else: 
     308                    locationidstr = "NULL" 
     309     
     310            itemtimelocation_sql = "INSERT INTO "+item_table+" (itemid, locationid) values ('"+Mid+"', "+locationidstr+" );" 
     311     
     312            print "ItemTimeLocation:\t"+itemtimelocation_sql 
     313            cursor = connection.cursor() 
     314            try: 
     315                cursor.execute(itemtimelocation_sql) 
     316            except: 
     317                print "Error: database error %s %s" %(sys.exc_type, sys.exc_value) 
     318            connection.commit() 
     319     
     320    def link_temporal(Mid,startdate,enddate): 
     321            '''Creates an entry in the item/time/location table linking an item and time only''' 
     322            timeid = insert_temporal_coverage(Mid,startdate,enddate) 
     323            if (timeid > -1): 
     324                    timeidstr = "%s" % timeid 
     325            else: 
     326                    timeidstr = "NULL" 
     327     
     328            itemtimelocation_sql = "INSERT INTO "+item_table+" (itemid, timeid) values ('"+Mid+"', "+timeidstr+" );" 
     329     
     330            print "ItemTimeLocation:\t"+itemtimelocation_sql 
     331            cursor = connection.cursor() 
     332            try: 
     333                cursor.execute(itemtimelocation_sql) 
     334            except: 
     335                print "Error: database error %s %s" %(sys.exc_type, sys.exc_value) 
     336            connection.commit() 
     337     
     338     
     339    def insert_spatial_coverage(Mid,west,south,east,north): 
     340        ''' 
     341        Attempts to insert spatial coverage into spatial table.  
     342        If successful, returns newly created location id, -1 otherwise 
     343        ''' 
     344        returnid = -1 
     345        if str(west)!='null' and str(south)!='null' and str(east)!='null' and str(north)!='null': 
     346            insert_sql="INSERT INTO "+location_table+" (geom) VALUES ( setsrid('BOX3D("+west+" "+south+","+east+" "+north+")'::box3d,4326) );" 
     347            print insert_sql 
     348        cursor = connection.cursor() 
     349        try: 
     350            cursor.execute(insert_sql) 
     351            if (cursor.rowcount > 0): 
     352                getid_sql="select currval('"+location_id_seq+"');" 
     353                cursor.execute(getid_sql) 
     354                id = commavaluesfromsublist(cursor.fetchall()) 
     355                return int(id) 
     356            else: 
     357                return -1 
     358        except: 
     359            print "Error: database error %s %s" %(sys.exc_type, sys.exc_value) 
     360        connection.commit() 
     361     
     362    def insert_temporal_coverage(Mid,startdate,enddate): 
     363        '''Attempts to insert temporal coverage (only) into time table. If successful, returns timeid to be used in item table, -1 otherwise''' 
     364        returnid = -1 
     365        if (startdate=='nostartdate' and enddate=='noenddate'): 
     366            # Skip if both are missing, although it's OK if only 1 is given 
     367            return -1 
     368        else: 
     369            if (startdate=='nostartdate'): startdate='NULL' 
     370            if (enddate=='noenddate'): enddate='NULL' 
     371            insert_sql =  "INSERT INTO "+time_table+" (start_time, end_time) VALUES('"+startdate+"', '"+enddate+"');" 
     372            print insert_sql 
     373            cursor = connection.cursor() 
     374            try: 
     375                    cursor.execute(insert_sql) 
     376                    if (cursor.rowcount > 0): 
     377                            getid_sql="select currval('"+time_id_seq+"');" 
     378                            cursor.execute(getid_sql) 
     379                            id = commavaluesfromsublist(cursor.fetchall()) 
     380                            return int(id) 
     381                    else: 
     382                            return -1 
     383            except: 
     384                    print "Error: database error %s %s" %(sys.exc_type, sys.exc_value) 
     385            connection.commit() 
Note: See TracChangeset for help on using the changeset viewer.