1
0
Fork 0

CLI supports setting read consistency level

master
Philip O'Toole 3 years ago
parent 7c3cd8c575
commit 7e85cab80d

@ -36,6 +36,7 @@ type argT struct {
var cliHelp = []string{ var cliHelp = []string{
`.backup <file> Write database backup to SQLite file`, `.backup <file> Write database backup to SQLite file`,
`.consistency [none|weak|strong] Show or set read consistency level`,
`.dump <file> Dump the database in SQL text format to a file`, `.dump <file> Dump the database in SQL text format to a file`,
`.expvar Show expvar (Go runtime) information for connected node`, `.expvar Show expvar (Go runtime) information for connected node`,
`.help Show this message`, `.help Show this message`,
@ -82,6 +83,7 @@ func main() {
fmt.Printf("Connected to rqlited version %s\n", version) fmt.Printf("Connected to rqlited version %s\n", version)
timer := false timer := false
consistency := "weak"
prefix := fmt.Sprintf("%s:%d>", argv.Host, argv.Port) prefix := fmt.Sprintf("%s:%d>", argv.Host, argv.Port)
term, err := prompt.NewTerminal() term, err := prompt.NewTerminal()
if err != nil { if err != nil {
@ -112,12 +114,18 @@ func main() {
} }
cmd = strings.ToUpper(cmd) cmd = strings.ToUpper(cmd)
switch cmd { switch cmd {
case ".CONSISTENCY":
if index == -1 || index == len(line)-1 {
ctx.String("%s\n", consistency)
break
}
err = setConsistency(line[index+1:], &consistency)
case ".TABLES": case ".TABLES":
err = queryWithClient(ctx, client, argv, timer, `SELECT name FROM sqlite_master WHERE type="table"`) err = queryWithClient(ctx, client, argv, timer, consistency, `SELECT name FROM sqlite_master WHERE type="table"`)
case ".INDEXES": case ".INDEXES":
err = queryWithClient(ctx, client, argv, timer, `SELECT sql FROM sqlite_master WHERE type="index"`) err = queryWithClient(ctx, client, argv, timer, consistency, `SELECT sql FROM sqlite_master WHERE type="index"`)
case ".SCHEMA": case ".SCHEMA":
err = queryWithClient(ctx, client, argv, timer, "SELECT sql FROM sqlite_master") err = queryWithClient(ctx, client, argv, timer, consistency, `SELECT sql FROM sqlite_master`)
case ".TIMER": case ".TIMER":
err = toggleTimer(line[index+1:], &timer) err = toggleTimer(line[index+1:], &timer)
case ".STATUS": case ".STATUS":
@ -157,7 +165,7 @@ func main() {
case ".QUIT", "QUIT", "EXIT": case ".QUIT", "QUIT", "EXIT":
break FOR_READ break FOR_READ
case "SELECT", "PRAGMA": case "SELECT", "PRAGMA":
err = queryWithClient(ctx, client, argv, timer, line) err = queryWithClient(ctx, client, argv, timer, consistency, line)
default: default:
err = executeWithClient(ctx, client, argv, timer, line) err = executeWithClient(ctx, client, argv, timer, line)
} }
@ -178,6 +186,14 @@ func toggleTimer(op string, flag *bool) error {
return nil return nil
} }
func setConsistency(r string, c *string) error {
if r != "strong" && r != "weak" && r != "none" {
return fmt.Errorf("invalid consistency '%s'. Use 'none', 'weak', or 'strong'", r)
}
*c = r
return nil
}
func makeJSONBody(line string) string { func makeJSONBody(line string) string {
data, err := json.Marshal([]string{line}) data, err := json.Marshal([]string{line})
if err != nil { if err != nil {

@ -80,8 +80,9 @@ type queryResponse struct {
Time float64 `json:"time"` Time float64 `json:"time"`
} }
func queryWithClient(ctx *cli.Context, client *http.Client, argv *argT, timer bool, query string) error { func queryWithClient(ctx *cli.Context, client *http.Client, argv *argT, timer bool, consistency, query string) error {
queryStr := url.Values{} queryStr := url.Values{}
queryStr.Set("level", consistency)
queryStr.Set("q", query) queryStr.Set("q", query)
if timer { if timer {
queryStr.Set("timings", "") queryStr.Set("timings", "")

Loading…
Cancel
Save