Mercurial > gemma
view pkg/octree/loader.go @ 4723:baabc2b2f094
Avoid creating user profiles without matching role
The INSTEAD OF triggers on users.list_users did that already, but
profile data coming e.g. via restoring a dump had been added also
if there was no matching database role in the cluster.
This also unifies the errors occuring on creation of users with existing
role names that differed between roles with and without profile before.
Note this is no referential integrity. A dropped role still leaves an
orphaned profile behind.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Thu, 17 Oct 2019 18:56:59 +0200 |
parents | 4bbfe3dd2ab5 |
children | c0eb491aaaa7 |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> package octree import ( "bufio" "bytes" "compress/gzip" "encoding/binary" "log" "github.com/golang/snappy" ) func (s *STRTree) deserializeIndex(r *bufio.Reader) error { var numIndex int32 if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil { return err } index := make([]int32, numIndex) s.index = index var last int32 for i := range index { v, err := binary.ReadVarint(r) if err != nil { return err } value := int32(v) + last index[i] = value last = value } return nil } func (s *STRTree) deserializeBBoxes(r *bufio.Reader) error { var numBBoxes int32 if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil { return err } bboxes := make([]Box2D, numBBoxes) s.bboxes = bboxes var err error read := func(v *float64) { if err == nil { err = binary.Read(r, binary.LittleEndian, v) } } for i := range bboxes { read(&bboxes[i].X1) read(&bboxes[i].Y1) read(&bboxes[i].X2) read(&bboxes[i].Y2) } return err } func (s *STRTree) deserialize(r *bufio.Reader) error { s.tin = new(Tin) if err := s.tin.Deserialize(r); err != nil { return err } var numEntries uint8 if err := binary.Read(r, binary.LittleEndian, &numEntries); err != nil { return err } s.Entries = int(numEntries) if err := s.deserializeIndex(r); err != nil { return err } return s.deserializeBBoxes(r) } func (s *STRTree) FromBytes(data []byte) error { r, err := gzip.NewReader(bytes.NewReader(data)) if err != nil { return err } return s.deserialize(bufio.NewReader(r)) } func (t *Tin) Deserialize(r *bufio.Reader) error { if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil { return err } log.Printf("info: EPSG: %d\n", t.EPSG) if err := t.Min.Read(r); err != nil { return err } if err := t.Max.Read(r); err != nil { return err } log.Printf("info: BBOX: [[%f, %f, %f], [%f, %f, %f]]\n", t.Min.X, t.Min.Y, t.Min.Z, t.Max.X, t.Max.Y, t.Max.Z) var numVertices uint32 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { return err } log.Printf("info: vertices: %d\n", numVertices) vertices := make([]Vertex, numVertices) t.Vertices = vertices for i := range vertices { if err := vertices[i].Read(r); err != nil { return err } } var numTriangles uint32 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { return err } log.Printf("info: triangles: %d\n", numTriangles) indices := make([]int32, 3*numTriangles) triangles := make([][]int32, numTriangles) t.Triangles = triangles var last int32 for i := range triangles { tri := indices[:3] indices = indices[3:] triangles[i] = tri for j := range tri { v, err := binary.ReadVarint(r) if err != nil { return err } value := int32(v) + last tri[j] = value last = value } } return nil } func loadReader(r *bufio.Reader) (*Tree, error) { tree := new(Tree) var tin Tin if err := tin.Deserialize(r); err != nil { return nil, err } tree.EPSG = tin.EPSG tree.vertices = tin.Vertices tree.triangles = tin.Triangles tree.Min = tin.Min tree.Max = tin.Max var numNodes uint32 if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil { return nil, err } log.Printf("info: num nodes: %d\n", numNodes) tree.index = make([]int32, numNodes) entries := tree.index[1:] var last int32 for i := range entries { v, err := binary.ReadVarint(r) if err != nil { return nil, err } value := int32(v) + last entries[i] = value last = value } return tree, nil } func Deserialize(data []byte) (*Tree, error) { return loadReader( bufio.NewReader( snappy.NewReader( bytes.NewReader(data)))) }