From: Robert Griesemer Date: Thu, 15 Sep 2011 23:21:42 +0000 (-0700) Subject: godoc: use new index/suffixarray serialization code X-Git-Tag: weekly.2011-09-16~4 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=66e44000d4158c96154dc572a76182ca6799c56a;p=gostls13.git godoc: use new index/suffixarray serialization code When saving/restoring the fulltext index, the entire respective suffixarray is now saved/restored (as opposed to the indexed data only, and the suffixarray recreated). This saves significant start-up time for large indexes, at the cost of significantly larger index files. R=r CC=golang-dev https://golang.org/cl/5037043 --- diff --git a/src/cmd/godoc/index.go b/src/cmd/godoc/index.go index c70ca4b86e..2543f92161 100644 --- a/src/cmd/godoc/index.go +++ b/src/cmd/godoc/index.go @@ -834,30 +834,36 @@ func NewIndex(dirnames <-chan string, fulltextIndex bool, throttle float64) *Ind } type fileIndex struct { - Sources []byte Words map[string]*LookupResult Alts map[string]*AltWords Snippets []*Snippet + Fulltext bool } // Write writes the index x to w. func (x *Index) Write(w io.Writer) os.Error { - var sources []byte + fulltext := false if x.suffixes != nil { - // fulltext index present - sources = x.suffixes.Bytes() + fulltext = true } fx := fileIndex{ - sources, // indicates if fulltext index is present or not x.words, x.alts, x.snippets, + fulltext, } - err := gob.NewEncoder(w).Encode(fx) - if err == nil && sources != nil { - err = x.fset.Write(w) + if err := gob.NewEncoder(w).Encode(fx); err != nil { + return err + } + if fulltext { + if err := x.fset.Write(w); err != nil { + return err + } + if err := x.suffixes.Write(w); err != nil { + return err + } } - return err + return nil } // Read reads the index from r into x; x must not be nil. @@ -866,17 +872,19 @@ func (x *Index) Read(r io.Reader) os.Error { if err := gob.NewDecoder(r).Decode(&fx); err != nil { return err } - if fx.Sources != nil { - // fulltext index is present + x.words = fx.Words + x.alts = fx.Alts + x.snippets = fx.Snippets + if fx.Fulltext { x.fset = token.NewFileSet() if err := x.fset.Read(r); err != nil { return err } - x.suffixes = suffixarray.New(fx.Sources) + x.suffixes = new(suffixarray.Index) + if err := x.suffixes.Read(r); err != nil { + return err + } } - x.words = fx.Words - x.alts = fx.Alts - x.snippets = fx.Snippets return nil }