def main():
    #-----------Setting up and unsing option parser-----------------------
    parser=OptionParser(usage= usage, version=version)
    
    parser.add_option("-u",'--user',
                      action="store",dest="user",
                      help="Name of target edb user")

    parser.add_option("-e","--edb",
                      action="store",dest="edb",
                      help="Name of target edb")

    parser.add_option("-v","--viewports",
                      action="store",dest="viewports",
                      help="Comma-separated list of area id's to be cut out, default is all")

    parser.add_option("-y","--year",
                      action="store",dest="year",
                      help="Cut out for given year")
    
    parser.add_option("-l", "--loglevel",
                      action="store",dest="loglevel",default=2,
                      help="Sets the loglevel (0-3 where 3=full logging)")

    parser.add_option("-s","--suffix",
                      action="store",dest="suffix",default="v1",
                      help="Sets suffix to names of generated edb's to support version management, default is 'v1'")

    (options, args) = parser.parse_args()


    
    #--------------------Init logger-----------------------
    rootLogger = logger.RootLogger(level=options.loglevel)
    global log
    log = rootLogger.getLogger(sys.argv[0])

    #-----------------Validating options-------------------

    if options.user is None:
        log.error("Need to specify -u <user>")
        return 1
    if options.edb is None:
        log.error("Need to specify -e <edb>")
        return 1
    if options.year is None:
        log.error("Need to specify -y <year>")
        return 1
    if len(options.suffix)>4:
        log.error("Limit your suffix length to 4 characters")
        return 1

    if len(options.year)!=4:
        log.error("Year should be given with four digits")
        return 1

    dmn=Domain()
    viewports=[]
    if options.viewports is not None:        
        viewportIds=options.viewports.split(",")
    else:
        viewportIds=dmn.listViewports()
    for vpId in viewportIds:
        vp=ViewPort()
        vp.read(path.join(dmn.wndPath(),"modell.par"),vpId)
        viewports.append(vp)
    
    edb=Edb(dmn,options.user,options.edb)

    log.info("Reading sourcedb...")
    sourcedb=Sourcedb(edb)
    sourcedb.read()

    log.info("Reading emfacdb...")
    emfacdb=Emfacdb(edb)
    emfacdb.read()

    log.info("Reading subdb...")
    subdb=Subdb(edb)
    subdb.read()
    
    edbDotRsrc=edb.rsrcPath()
    
    for vpInd,vp in enumerate(viewports):        
        targetEdbName=vp.code+"_"+options.year+"_"+options.suffix     
        tEdb=Edb(dmn,options.user,targetEdbName)
        if tEdb.exists():
            log.info("Edb %s already exists, remove first to update" %targetEdbName)
            continue
        tEdb.create(edbRsrc=edbDotRsrc)
        log.info("Created empty edb %s" %targetEdbName)

        subdb.setEdb(tEdb)
        subdb.write()
        log.info("Wrote searchkeys")

        emfacdb.setEdb(tEdb)        
        emfacdb.write()
        log.info("Wrote emfacdb")
        
        tSourcedb=Sourcedb(tEdb)        
        
        log.info("Cutting out viewport %s (%i/%i)" %(vp.code,vpInd+1,len(viewports)))
        for srcInd,src in enumerate(sourcedb.sources):
            if includeShip(src,vp.code,src["Y1"],options.year):
                log.debug("Ship %i/%i included in %s" %(srcInd+1,len(sourcedb.sources),tEdb.name))
                tSourcedb.sources.append(src)
        tSourcedb.write()
        log.info("Wrote exatracted sources to %s" %tEdb.name)
        tEdb.setDesc("This edb has been extracted from %s under user %s, " %(edb.name,edb.user)+
                            "and includes all ships that have visited the map area %s (%s) during %s\n" %(vp.code,vp.name,options.year))
    log.info("Finished!")
    return 0
Beispiel #2
0
def main():
    #-----------Setting up and unsing option parser-----------------------
    parser=OptionParser(usage= usage, version=version)
    
    parser.add_option("-u",'--targetUser',
                      action="store",dest="targetUser",
                      help="Name of target edb user")

    parser.add_option("-e","--targetEdb",
                      action="store",dest="targetEdb",
                      help="Name of target edb")
    
    parser.add_option("--templateUser",
                      action="store",dest="templateUser",
                      help="Name of template edb user")
    
    parser.add_option("--templateEdb",
                      action="store",dest="templateEdb",
                      help="Name of template edb")
    
    parser.add_option("-f","--force",
                      action="store_true",dest="force",
                      help="Overwrite existing data")

    parser.add_option("--templateACIndex",
                      action="store",dest="templateACIndex",
                      help="Attribute on template to join by")
    
    parser.add_option("--targetACIndex",
                      action="store",dest="targetACIndex",
                      help="Attribute on target to join by")    
    
    parser.add_option("-l", "--loglevel",
                      action="store",dest="loglevel",default=2,
                      help="Sets the loglevel (0-3 where 3=full logging)")

    parser.add_option("--ALOBFilter",
                      action="store",dest="ALOBFilter",
                      help="Exclude ships with specified ALOB"+
                      " (specify as '<key>=<value>')")

    parser.add_option("--MMSI",
                      action="store",dest="MMSI",
                      help="Specify single MMSI to fetch")

    parser.add_option("--logfile",
                      action="store",dest="logfile",
                      help="Send output to logfile") 
    
    (options, args) = parser.parse_args()

    #---------Init logger------------------    
    rootLogger = logger.RootLogger(level=options.loglevel)
    global log
    if options.logfile is not None:
        log = rootLogger.getFileLogger(sys.argv[0],options.logfile,format="%(message)s")
    else:
        log = rootLogger.getStreamLogger(sys.argv[0],infoFormat="%(message)s")
    
    #---------Validating and processing options-------------------
    
    if len(args)!=0:
        log.error("No arguments wanted, only options")
        log.info(str(args))
        
    if options.targetUser is None:
        log.error("Need to specify target user -u <user>")
        return 1
    if options.targetEdb is None:
        log.error("Need to specify target edb -e <edb>")
        return 1
    if options.templateUser is None:
        log.error("Need to specify template user --templateUser <user>")
        return 1
    if options.templateEdb is None:
        log.error("Need to specify template edb --templateEdb <edb>")
        return 1

    if options.MMSI is not None:
        X1=2147483647 #ship source identifier
        coords=options.MMSI.split(",")
        if len(coords)>1: #If X1,Y1 is used as identifier as in sourcedb
            Y1=int(coords[1])
        else:
            Y1=int(coords[0])
    else:
        X1=None
        Y1=None
            
    if options.ALOBFilter is not None:
        ALOBFilter=options.ALOBFilter.split("=")
        if len(ALOBFilter)!=2:
            log.error("Wrong format used for ALOBFilter,"+
                      " should be specified as <key>=<value>")
            return 1
    else:
        ALOBFilter=None

    #------------------------------------------------------

    msg=50*"-"+"\nUpdating ships with source templates\n"
    if options.MMSI is not None:
        msg+="Processing selected with MMSI: %s\n" %options.MMSI
    else:
        msg+="Processing all sources"

    if ALOBFilter is not None:
            msg+="Ships with ALOB %s=%s excluded\n" %(ALOBFilter[0],ALOBFilter[1])
    if options.force:
        msg+="Already existing data will be overwritten"
    else:
        msg+="Already existing data will not be overwritten"
        
    msg+="\n"
    log.info(msg)
    
    #Parameters that will not be transferred from template to target
    skipPars=["NAME","INFO","INFO2","ALOB","X1","Y1","X2","Y2","PX","PY"]
    
    #Set domain
    dmn=Domain()

    #Create edb objects
    targetEdb=Edb(dmn,options.targetUser,options.targetEdb)
    templateEdb=Edb(dmn,options.templateUser,options.templateEdb)

    #Read sourcedb from target edb
    log.debug("Reading sources from target edb")
    sourcedb=Sourcedb(targetEdb)

    templateACIndex=options.templateACIndex
    if templateACIndex is not None:
        try:
            templateACIndex=int(templateACIndex)
        except:
            log.error("Invalid templateACIndex, should be an integer")
            return 1
        
    targetACIndex=options.targetACIndex
    if targetACIndex is not None:
        try:
            targetACIndex=int(targetACIndex)
        except:
            log.error("Invalid targetACIndex, should be an integer")
            return 1

    log.debug("Reading sources from target edb")
    templates=loadTemplate(templateEdb,templateACIndex)
    log.info("Read %i unique sources from template edb" %len(templates.keys()))

    templateEmfacdb = Emfacdb(templateEdb)
    templateEmfacdb.read()
    targetEmfacdb = Emfacdb(targetEdb)
    targetEmfacdb.read()

    #Set templateEmfacdb to targetEdb (preparation to transfer emfacs)
    templateEmfacdb.setEdb(targetEdb)
    if templateEmfacdb.activities!={} and options.force:
        log.info("Overwriting emfacdb of target")
        try:
            templateEmfacdb.write(force=True)
        except PyAirviroOSException,err:
            log.error(str(err))
            return 1
        log.debug("Loaded emfacdb from template to target edb")