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 }