]> Sergey Matveev's repositories - glocate.git/blob - writer.go
Use database's directory for temporary files
[glocate.git] / writer.go
1 package main
2
3 import (
4         "bufio"
5         "encoding/binary"
6         "io"
7         "log"
8
9         "github.com/klauspost/compress/zstd"
10 )
11
12 func mustWrite(w io.Writer, buf []byte) {
13         if _, err := w.Write(buf); err != nil {
14                 log.Fatalln(err)
15         }
16 }
17
18 func writer(dst io.Writer, sink chan Ent) {
19         comp, err := zstd.NewWriter(dst)
20         if err != nil {
21                 log.Fatalln(err)
22         }
23         bw := bufio.NewWriterSize(comp, 1<<17)
24         num := make([]byte, 8)
25         var name string
26         for ent := range sink {
27                 name = ent.name[len(ent.name)-1]
28                 if len(ent.name) >= 1<<16 {
29                         panic("too long")
30                 }
31                 binary.BigEndian.PutUint16(num[:2], uint16(len(name)))
32                 mustWrite(bw, num[:2])
33                 mustWrite(bw, []byte(name))
34                 if len(ent.name) >= 1<<8 {
35                         panic("too deep")
36                 }
37                 mustWrite(bw, []byte{byte(len(ent.name) - 1)})
38                 binary.BigEndian.PutUint64(num, uint64(ent.mtime))
39                 mustWrite(bw, num)
40                 binary.BigEndian.PutUint64(num, uint64(ent.size))
41                 mustWrite(bw, num)
42         }
43         if err = bw.Flush(); err != nil {
44                 log.Fatalln(err)
45         }
46         if err = comp.Close(); err != nil {
47                 log.Fatalln(err)
48         }
49 }