Exemplo n.º 1
0
    def testAddData(self):
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        table = db.getTableByName("R_GR0")

        beforedata = [curs.getRow().asList() for curs in table.getCursor(0)]

        ## Add an empty row
        refrow = Row(table)
        refrow.setColumn(0, 1)
        table.writeRow(refrow)

        refdata = refrow.asList()

        db.close()

        db = Database(MapDirectory(self.testdatadir), "db00")
        table = db.getTableByName("R_GR0")

        aux = db.getTableByName("AUX_GR0")
        am = AuxTableManager(aux)

        afterdata = [curs.getRow().asList() for curs in table.getCursor(0)]

        for curs in table.getCursor(0):
            row = curs.getRow()

            index = row.asDict()['NAME_REF'] & 0xffffff
            offset = row.asDict()['NAME_REF'] >> 24

        self.assertEqual(beforedata + [refdata], afterdata)
Exemplo n.º 2
0
    def testWriteNewSlot(self):
        random.seed(0)
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        f = db.getFileByIndex(4)
        nslots = f.pz.next - 1

        slotdatabefore = [f.readSlot(i + 1) for i in range(nslots)]

        slotsize = f.fstruct.ft_slsize
        writtendata = "".join(
            [chr(random.randint(0, 255)) for i in xrange(slotsize)])

        f.writeSlot(writtendata)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        nslots = f.pz.next - 1
        slotdata = [f.readSlot(i + 1) for i in range(nslots)]

        slotdataexpected = slotdatabefore + [writtendata]

        self.assertEqual(len(slotdataexpected), len(slotdata))
        if slotdataexpected != slotdata:
            print "Equal elements", [
                a == b for a, b in zip(slotdataexpected, slotdata)
            ]
        self.assertEqual(slotdataexpected, slotdata)
Exemplo n.º 3
0
    def testOpenAppend(self):
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        f = db.getFileByIndex(4)
        nslotsbefore = f.pz.next - 1

        self.assertEqual(nslotsbefore, 3)

        slotdatabefore = [f.readSlot(i + 1) for i in range(nslotsbefore)]

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        nslots = f.pz.next - 1

        self.assertEqual(nslots, nslotsbefore)

        slotdata = [f.readSlot(i + 1) for i in range(nslots)]

        self.assertEqual(len(slotdata), len(slotdatabefore))
        if slotdata != slotdatabefore:
            print "Equal elements", [
                a == b for a, b in zip(slotdatabefore, slotdata)
            ]
        self.assertEqual(slotdata, slotdatabefore)
Exemplo n.º 4
0
    def testWriteSlot(self):
        random.seed(0)
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        f = db.getFileByIndex(4)
        nslots = f.pz.next - 1

        slotdatabefore = [f.readSlot(i + 1) for i in range(nslots)]

        slotsize = f.fstruct.ft_slsize
        writtendata = "".join(
            [chr(random.randint(0, 255)) for i in xrange(slotsize)])
        slot = 2
        f.writeSlot(writtendata, slot)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        slotdata = [f.readSlot(i + 1) for i in range(nslots)]

        slotdataexpected = slotdatabefore
        slotdataexpected[slot - 1] = writtendata

        self.assertEqual(slotdataexpected, slotdata)
Exemplo n.º 5
0
    def testWritePage(self):
        random.seed(0)
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        f = db.getFileByIndex(4)
        npages = f.npages
        pagesize = f.fstruct.ft_pgsize

        writtendata = "".join(
            [chr(random.randint(0, 255)) for i in xrange(pagesize)])
        #        import pdb
        #        pdb.set_trace()
        ## Override incomplete page
        f.writePage(writtendata, 1)

        ## Update pz.next so that the incomplete_page buffer won't overwrite the written page
        f.pz.next = f.fstruct.ft_slots * f.page + 1
        assert (f.page == 2)
        assert (f.relslotnum == 0)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        self.assertEqual(f.readPage(1), writtendata)
Exemplo n.º 6
0
    def testAddRows(self):
        random.seed(0)
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        table = db.getTableByName("R_GR0")

        rows = [curs.getRow() for curs in table.getCursor(0)]

        data = [
            "".join([
                chr(random.randint(0, 255))
                for i in xrange(table.rstruct.rt_len)
            ]) for j in xrange(5)
        ]

        newrows = [Row(table, data=d) for d in data]

        for row in newrows:
            table.writeRow(row)

        self.assertEqual(table.getRowCount(), 29 + 5)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        table = db.getTableByName("R_GR0")

        rowsafter = [curs.getRow() for curs in table.getCursor(0)]

        self.assertEqual(table.getRowCount(), 29 + 5)

        self.assertEqual(rows + newrows, rowsafter)
Exemplo n.º 7
0
    def testCreateDatabase(self):
        mapdir = MapDirectory()
        db = Database(mapdir, "db00", 'w')
        db.close()

        self.assertTrue('db00.dbd' in mapdir.listdir())

        #        os.system('prdbd '+os.path.join(mapdir.dir, 'db00'))

        db = Database(mapdir, "db00", 'r')

        db.close()
Exemplo n.º 8
0
    def testOpenWrite(self):
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        f.close()
        f.open('w')
        nslotsbefore = f.pz.next - 1

        self.assertEqual(nslotsbefore, 0)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        f = db.getFileByIndex(4)
        nslots = f.pz.next - 1

        self.assertEqual(nslots, 0)
Exemplo n.º 9
0
    def testAuxIndex(self):
        db = Database(MapDirectory(self.testdatadir), "db00")

        table = db.getTableByName("R_GR0")
        aux = db.getTableByName("AUX_GR0")

        rows = [x.getRow() for x in aux.getCursor(0)]
        index = rows[0].asDict()['NAME_BUF']

        n = len(index) / 4
        index = struct.unpack('%dI' % n, index)
Exemplo n.º 10
0
    def testOpenForAppend(self):
        random.seed(0)
        db = Database(MapDirectory(self.testdatadir), "db00", 'a')
        table = db.getTableByName("R_GR0")

        databefore = [curs.getRow() for curs in table.getCursor(0)]
        rowcountbefore = table.getRowCount()

        self.assertEqual(rowcountbefore, 29)

        db.close()

        ## Read back
        db = Database(MapDirectory(self.testdatadir), "db00", 'r')
        table = db.getTableByName("R_GR0")

        dataafter = [curs.getRow() for curs in table.getCursor(0)]
        rowcountafter = table.getRowCount()

        self.assertEqual(rowcountbefore, rowcountafter)
        self.assertEqual(len(databefore), len(dataafter))
        self.assertEqual(databefore, dataafter)
Exemplo n.º 11
0
    def testSimple(self):
        db = Database(MapDirectory(self.testdatadir), "db00")

        table = db.getTableByName("R_GR0")

        for curs in table.getCursor(0):
            row = curs.getRow()

            aux = db.getTableByName("AUX_GR0")

            am = AuxTableManager(aux)

            index = row.asDict()['NAME_REF'] & 0xffffff
            offset = row.asDict()['NAME_REF'] >> 24
Exemplo n.º 12
0
    def open(self, mode='r'):
        if self.mode != None:
            return None

        self.mode = mode

        if mode == 'w':
            if self.gpsimage:
                if self._inifile == None:
                    self._inifile = self.mapnumstr + 'map.ini'

                ## Create database
                self._db = Database(self.mapdir, 'db' + self.mapnumstr, mode, self.bigendian)

                ## Create zip table
                if self.has_zip:
                    buildziprecord(self._db,
                                   zipfilename = self.mapnumstr + 'z.dat',
                                   auxfilename = self.mapnumstr + 'cn.dat',
                                   extended = self.maptype == MapTypeStreetRoute)

                ## Create marine table
                if self.has_marine:
                    buildmarinerecord(self._db,
                                   filenameprefix = self.mapnumstr)

                ## Create basic groups
                if self.maptype == MapTypeStreetRoute:
                    roads = GroupStreet(self, name=self.mapnumstr + "_Roads")
                else:
                    roads = GroupNormal(self, name=self.mapnumstr + "_Roads")
                roads.searchable = True
                self.addGroup(roads)
                self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Railroads"))
                self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Hydrography"))
                self.addGroup(GroupNormal(self, name=self.mapnumstr + "_Parks"))

            else:
                if self._inifile == None:
                    self._inifile = 'map.ini'
        elif mode in ('r','a'):
            ## Find ini file
            if self._inifile == None:
                filelist = self.mapdir.listdir()
                possibleinifiles = ('map.ini', self.mapnumstr + 'map.ini', 'lay_info.ini')
                found = False
                for filename in possibleinifiles:
                    if filename in filelist:
                        self._inifile = filename
                        found = True
                        break
                if not found:
                    raise ValueError('Could not find ini-file')

            self._cfg.readfp(IniFileFilter(self.mapdir.open(self._inifile)))

            # Get map type
            if self._cfg.has_option('MAP_INFO', 'MAPTYPE'):
                self.maptype = self._cfg.get("MAP_INFO", "MAPTYPE")

            # Get bounding box
            if self._cfg.has_option('MAP_INFO', 'BND_BOX'):
                bbox = map(float, self._cfg.get("MAP_INFO", "BND_BOX").split(" "))
                self._bboxrec = Rec([bbox[0],bbox[2]], [bbox[1], bbox[3]])

            # Get map name
            self.name = self._cfg.get('MAP_INFO', 'MAP_NAME')
#            self.date = self._cfg.get('MAP_INFO', 'MAP_DATE')

            self._laycfg.setupfromcfg(self._cfg, self)
            
            # Find database path
            dbname = self._cfg.get("LAYERS","DB_NAME")
            dbname = re.sub('\\\\', os.sep, dbname)

            # Since Windows is case insensitive, try to match the path case insensitive
            plist=dbname.split(os.sep)
            for i in range(0,len(plist)-2):
                path=os.sep.join(plist[0:i+1])
                if len(path)>0:
                    hits=[d for d in self.mapdir.listdir(path) if d.lower() == plist[i+1].lower()]
                    if len(hits)==0:
                        raise ValueError("Couldnt find database")
                    plist[i+1]=hits[0]
            dbname = os.sep.join(plist)

            if dbname:
                self._db = Database(self.mapdir, dbname, self.mode, self.bigendian)

            # Read groups
            if self.debug:
                print "Groups:"
            for i in range(0,self._cfg.getint("GROUPS","NUMBER")):
                thegroup = groupFactory(self, i, self._cfg, self._db)
                self.groups.append(thegroup)
                thegroup.initFromIni(self._cfg)

            # Read POI file and POI layers
            if self._cfg.has_section("POI"):
                poi_ini = self._cfg.get("POI","POI_CONFIG")
                self.poicfg = ConfigParserUpper()
                if self.mapdir.isfile(poi_ini):
                    self.poicfg.readfp(IniFileFilter(self.mapdir.open(poi_ini)))

                    if self.poicfg.has_section("LAYERS"):
                        self._poigroup = POIGroup(self)

                    self._poiconfig.setupfromcfg(self.poicfg, self)

            # Read routing info
            if self.maptype == MapTypeStreetRoute:
                self.routingcfg = routing.RoutingConfig()
                self.routingcfg.setupfromcfg(self._cfg, self)

            # Read unpack tables
            if self._cfg.has_section('PACK_LAYS'):
                i = 0

                while self._cfg.has_option('PACK_LAYS', str(i)):
                    fields = self._cfg.get('PACK_LAYS', str(i)).split(' ')

                    filename = fields[0]
                    n = int(fields[1])

                    layernumbers = map(int, fields[2:])

                    assert len(layernumbers) == n

                    for layernumber in layernumbers:
                        self.getLayerByIndex(layernumber).setUnpackTable(filename)
                    
                    i += 1
Exemplo n.º 13
0
 def testListFiles(self):
     db = Database(MapDirectory(self.testdatadir), "db00", 'a')
Exemplo n.º 14
0
 def testCreateDatabase(self):
     mapdir = MapDirectory()
     db = Database(mapdir, "db00", 'w')