tcdb.go - cdb - Constant database manipulation utility
(HTM) git clone git://git.z3bra.org/cdb.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tcdb.go (2050B)
---
1 package main
2
3 import (
4 "bufio"
5 "flag"
6 "fmt"
7 "io"
8 "io/ioutil"
9 "log"
10 "os"
11 "path"
12
13 "github.com/jbarham/cdb"
14 )
15
16 func exitOnErr(err error) {
17 if err != nil {
18 log.Fatal(err)
19 }
20 }
21
22 func usage() {
23 fmt.Fprint(os.Stderr, "usage: cdb [-dm] [-k key [-s n]] db\n")
24 os.Exit(2)
25 }
26
27 func dumpdb(out *bufio.Writer, in *bufio.Reader) {
28 err := cdb.Dump(out, in)
29 out.Flush()
30 if err != nil {
31 os.Exit(111)
32 }
33 }
34
35
36 func makedb(db string, tmp *os.File) {
37 tmpname := tmp.Name()
38
39 exitOnErr(cdb.Make(tmp, bufio.NewReader(os.Stdin)))
40 exitOnErr(tmp.Sync())
41 exitOnErr(tmp.Close())
42 exitOnErr(os.Rename(tmpname, db))
43 }
44
45 func get(db string, key string, skip int, count int) {
46 var r *io.SectionReader
47
48 c, err := cdb.Open(db)
49 if err != nil {
50 log.Fatal(err)
51 }
52 defer c.Close()
53
54 for n := 0; n < skip + count; n++ {
55 r, err = c.FindNext([]byte(key))
56 if err == io.EOF {
57 os.Exit(100)
58 }
59 if err != nil {
60 log.Fatal(err)
61 }
62 if n >= skip {
63 _, err = io.Copy(os.Stdout, r)
64 if err != nil {
65 log.Fatal(err)
66 }
67 fmt.Printf("\n")
68 }
69 }
70 }
71
72 func main() {
73 var tmp *os.File
74 var err error
75
76 var key string
77 var db string
78 var skip int
79 var count int
80 var dump bool
81 var make bool
82
83 flag.StringVar(&key, "k", "", "Print record with key k")
84 flag.IntVar(&skip, "s", 0, "Skip the first s matching records")
85 flag.IntVar(&count, "c", 1, "Print c matching records")
86 flag.BoolVar(&dump, "d", false, "Print records suitable for cbdmake")
87 flag.BoolVar(&make, "m", false, "Writes a constant database to f")
88 flag.Parse()
89
90 args := flag.Args()
91
92 if (len(args) != 1) {
93 usage()
94 }
95
96 db = args[0]
97
98 if (make) {
99 dir, _ := path.Split(db)
100 if (dir == "") {
101 dir = "."
102 }
103 tmp, err = ioutil.TempFile(dir, ".*.cdb" )
104 exitOnErr(err)
105 makedb(db, tmp)
106 os.Exit(0)
107 } else if (dump) {
108 in, out := bufio.NewReader(os.Stdin), bufio.NewWriter(os.Stdout)
109 f, err := os.OpenFile(db, os.O_RDWR|os.O_CREATE, 0644)
110 if err != nil {
111 log.Fatal(err)
112 }
113 in = bufio.NewReader(f)
114 dumpdb(out, in)
115 os.Exit(0)
116 }
117
118 get(db, key, skip, count)
119 }