GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — sqlparser/tracked_buffer.go at master · getlantern/sqlparser Expand file tree/ Copy pathtracked_buffer.goMore file actions 107 lines (99 loc) · 2.8 KB / Copy pathtracked_buffer.goFile metadata and controls107 lines (99 loc) · 2.8 KB 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 101 102 103 104 105 106 107 // Copyright 2012, Google Inc. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package sqlparser import ( "bytes" "fmt" ) // TrackedBuffer is used to rebuild a query from the ast. // bindLocations keeps track of locations in the buffer that // use bind variables for efficient future substitutions. // nodeFormatter is the formatting function the buffer will // use to format a node. By default(nil), it's FormatNode. // But you can supply a different formatting function if you // want to generate a query that's different from the default. type TrackedBuffer struct { *bytes.Buffer bindLocations []bindLocation nodeFormatter func(buf *TrackedBuffer, node SQLNode) } func NewTrackedBuffer(nodeFormatter func(buf *TrackedBuffer, node SQLNode)) *TrackedBuffer { buf := &TrackedBuffer{ Buffer: bytes.NewBuffer(make([]byte, 0, 128)), bindLocations: make([]bindLocation, 0, 4), nodeFormatter: nodeFormatter, } return buf } // Myprintf mimics fmt.Fprintf(buf, ...), but limited to Node(%v), // Node.Value(%s) and string(%s). It also allows a %a for a value argument, in // which case it adds tracking info for future substitutions. // // The name must be something other than the usual Printf() to avoid "go vet" // warnings due to our custom format specifiers. func (buf *TrackedBuffer) Myprintf(format string, values ...interface{}) { end := len(format) fieldnum := 0 for i := 0; i < end; { lasti := i for i < end && format[i] != '%' { i++ } if i > lasti { buf.WriteString(format[lasti:i]) } if i >= end { break } i++ // '%' switch format[i] { case 'c': switch v := values[fieldnum].(type) { case byte: buf.WriteByte(v) case rune: buf.WriteRune(v) default: panic(fmt.Sprintf("unexpected type %T", v)) } case 's': switch v := values[fieldnum].(type) { case []byte: buf.Write(v) case string: buf.WriteString(v) default: panic(fmt.Sprintf("unexpected type %T", v)) } case 'v': node := values[fieldnum].(SQLNode) if buf.nodeFormatter == nil { node.Format(buf) } else { buf.nodeFormatter(buf, node) } case 'a': buf.WriteArg(values[fieldnum].(string)) default: panic("unexpected") } fieldnum++ i++ } } // WriteArg writes a value argument into the buffer. arg should not contain // the ':' prefix. It also adds tracking info for future substitutions. func (buf *TrackedBuffer) WriteArg(arg string) { buf.bindLocations = append(buf.bindLocations, bindLocation{ offset: buf.Len(), length: len(arg), }) buf.WriteString(arg) } func (buf *TrackedBuffer) ParsedQuery() *ParsedQuery { return &ParsedQuery{Query: buf.String(), bindLocations: buf.bindLocations} } func (buf *TrackedBuffer) HasBindVars() bool { return len(buf.bindLocations) != 0 } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |