This repository is currently being migrated. It's locked while the migration is in progress.
forked from parsyl/parquet
/
main.go
100 lines (85 loc) · 2.69 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"encoding/json"
"flag"
"io"
"log"
"os"
"github.com/BillHeroInc/parquet"
"github.com/BillHeroInc/parquet/cmd/parquetgen/gen"
sch "github.com/BillHeroInc/parquet/schema"
)
var (
metadata = flag.Bool("metadata", false, "print the metadata of a parquet file (-parquet) and exit")
pageheaders = flag.Bool("pageheaders", false, "print the page headers of a parquet file (-parquet) and exit (also prints the metadata)")
typ = flag.String("type", "", "name of the struct that will used for writing and reading")
pkg = flag.String("package", "", "package of the generated code")
imp = flag.String("import", "", "import statement of -type if it doesn't live in -package")
pth = flag.String("input", "", "path to the go file that defines -type")
outPth = flag.String("output", "parquet.go", "name of the file that is produced, defaults to parquet.go")
ignore = flag.Bool("ignore", true, "ignore unsupported fields in -type, otherwise log.Fatal is called when an unsupported type is encountered")
parq = flag.String("parquet", "", "path to a parquet file (if you are generating code based on an existing parquet file or printing the file metadata or page headers)")
structOutPth = flag.String("struct-output", "generated_struct.go", "name of the file that is produced, defaults to parquet.go")
)
func main() {
flag.Parse()
if *pth != "" && *parq != "" {
log.Fatal("choose -parquet or -input, but not both")
}
var err error
if *metadata {
readFooter()
} else if *pageheaders {
readPageHeaders()
} else if *parq == "" {
err = gen.FromStruct(*pth, *outPth, *typ, *pkg, *imp, *ignore)
} else {
err = gen.FromParquet(*parq, *structOutPth, *outPth, *typ, *pkg, *imp, *ignore)
}
if err != nil {
log.Fatal(err)
}
}
func readPageHeaders() {
f := openParquet()
footer := getFooter(f)
pageHeaders, err := parquet.PageHeaders(footer, f)
if err != nil {
log.Fatal(err)
}
f.Close()
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
enc.Encode(struct {
PageHeaders []sch.PageHeader `json:"page_headers"`
MetaData sch.FileMetaData `json:"file_metadata"`
}{
PageHeaders: pageHeaders,
MetaData: *footer,
})
}
func readFooter() {
f := openParquet()
footer := getFooter(f)
f.Close()
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
enc.Encode(footer)
}
func openParquet() *os.File {
if *parq == "" {
log.Fatal("-parquet is required with -footer")
}
f, err := os.Open(*parq)
if err != nil {
log.Fatal(err)
}
return f
}
func getFooter(r io.ReadSeeker) *sch.FileMetaData {
footer, err := parquet.ReadMetaData(r)
if err != nil {
log.Fatal("couldn't read footer: ", err)
}
return footer
}