TUN-801: Rapid SQL Proxy

This commit is contained in:
rishabh-bector
2018-07-30 16:45:15 -05:00
committed by Areg Harutyunyan
parent aa5e551de6
commit 60ca06d020
55 changed files with 10332 additions and 149 deletions

25
vendor/github.com/elgs/gosqljson/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,25 @@
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
*.test
.DS_Store

16
vendor/github.com/elgs/gosqljson/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,16 @@
#License
ISC License (ISC)
Copyright (c) 2014, Elgs Qian Chen
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

56
vendor/github.com/elgs/gosqljson/README.md generated vendored Normal file
View File

@@ -0,0 +1,56 @@
gosqljson
=========
A Go SQL to JSON library.
#Installation
`go get -u github.com/elgs/gosqljson`
# Sample code
Data in the table:
```
ID NAME
0 Alicia
1 Brian
2 Chloe
4 Bianca
5 Leo
6 Joy
7 Sam
8 Elgs
```
```go
package main
import (
"database/sql"
"fmt"
"github.com/elgs/gosqljson"
_ "github.com/go-sql-driver/mysql"
)
func main() {
ds := "username:password@tcp(host:3306)/db"
db, err := sql.Open("mysql", ds)
if err != nil {
fmt.Println("sql.Open:", err)
return
}
theCase := "lower" // "lower", "upper", "camel" or the orignal case if this is anything other than these three
// headers []string, data [][]string, error
headers, data, _ := gosqljson.QueryDbToArray(db, theCase, "SELECT ID,NAME FROM t LIMIT ?,?", 0, 3)
fmt.Println(headers)
// ["id","name"]
fmt.Println(data)
// [["0","Alicia"],["1","Brian"],["2","Chloe"]]
// data []map[string]string, error
data, _ := gosqljson.QueryDbToMap(db, theCase, "SELECT ID,NAME FROM t LIMIT ?,?", 0, 3)
fmt.Println(data)
// [{"id":"0","name":"Alicia"},{"id":"1","name":"Brian"},{"id":"2","name":"Chloe"}]
}
```

334
vendor/github.com/elgs/gosqljson/gosqljson.go generated vendored Normal file
View File

@@ -0,0 +1,334 @@
package gosqljson
import (
"database/sql"
"encoding/json"
"fmt"
"strings"
)
// QueryDbToArrayJSON - run the sql and return a a JSON string of array
func QueryDbToArrayJSON(db *sql.DB, theCase string, sqlStatement string, sqlParams ...interface{}) (string, error) {
headers, data, err := QueryDbToArray(db, theCase, sqlStatement, sqlParams...)
result := map[string]interface{}{
"headers": headers,
"data": data,
}
jsonString, err := json.Marshal(result)
return string(jsonString), err
}
// QueryDbToMapJSON - run the sql and return a JSON string of array of objects.
func QueryDbToMapJSON(db *sql.DB, theCase string, sqlStatement string, sqlParams ...interface{}) (string, error) {
data, err := QueryDbToMap(db, theCase, sqlStatement, sqlParams...)
jsonString, err := json.Marshal(data)
return string(jsonString), err
}
// QueryDbToArray - headers, data, error
func QueryDbToArray(db *sql.DB, theCase string, sqlStatement string, sqlParams ...interface{}) ([]string, [][]string, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
data := [][]string{}
headers := []string{}
rows, err := db.Query(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
return headers, data, err
}
cols, _ := rows.Columns()
if theCase == "lower" {
colsLower := make([]string, len(cols))
for i, v := range cols {
colsLower[i] = strings.ToLower(v)
}
headers = colsLower
} else if theCase == "upper" {
colsUpper := make([]string, len(cols))
for i, v := range cols {
colsUpper[i] = strings.ToUpper(v)
}
headers = colsUpper
} else if theCase == "camel" {
colsCamel := make([]string, len(cols))
for i, v := range cols {
colsCamel[i] = toCamel(v)
}
headers = colsCamel
} else {
headers = cols
}
rawResult := make([][]byte, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
for rows.Next() {
result := make([]string, len(cols))
rows.Scan(dest...)
for i, raw := range rawResult {
if raw == nil {
result[i] = ""
} else {
result[i] = string(raw)
}
}
data = append(data, result)
}
return headers, data, nil
}
// QueryTxToArray - headers, data, error
func QueryTxToArray(tx *sql.Tx, theCase string, sqlStatement string, sqlParams ...interface{}) ([]string, [][]string, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
data := [][]string{}
headers := []string{}
rows, err := tx.Query(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
return headers, data, err
}
cols, _ := rows.Columns()
if theCase == "lower" {
colsLower := make([]string, len(cols))
for i, v := range cols {
colsLower[i] = strings.ToLower(v)
}
headers = colsLower
} else if theCase == "upper" {
colsUpper := make([]string, len(cols))
for i, v := range cols {
colsUpper[i] = strings.ToUpper(v)
}
headers = colsUpper
} else if theCase == "camel" {
colsCamel := make([]string, len(cols))
for i, v := range cols {
colsCamel[i] = toCamel(v)
}
headers = colsCamel
} else {
headers = cols
}
rawResult := make([][]byte, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
for rows.Next() {
result := make([]string, len(cols))
rows.Scan(dest...)
for i, raw := range rawResult {
if raw == nil {
result[i] = ""
} else {
result[i] = string(raw)
}
}
data = append(data, result)
}
return headers, data, nil
}
// QueryDbToMap - run sql and return an array of maps
func QueryDbToMap(db *sql.DB, theCase string, sqlStatement string, sqlParams ...interface{}) ([]map[string]string, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
results := []map[string]string{}
rows, err := db.Query(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
return results, err
}
cols, _ := rows.Columns()
colsLower := make([]string, len(cols))
colsCamel := make([]string, len(cols))
if theCase == "lower" {
for i, v := range cols {
colsLower[i] = strings.ToLower(v)
}
} else if theCase == "upper" {
for i, v := range cols {
cols[i] = strings.ToUpper(v)
}
} else if theCase == "camel" {
for i, v := range cols {
colsCamel[i] = toCamel(v)
}
}
rawResult := make([][]byte, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
for rows.Next() {
result := make(map[string]string, len(cols))
rows.Scan(dest...)
for i, raw := range rawResult {
if raw == nil {
if theCase == "lower" {
result[colsLower[i]] = ""
} else if theCase == "upper" {
result[cols[i]] = ""
} else if theCase == "camel" {
result[colsCamel[i]] = ""
} else {
result[cols[i]] = ""
}
} else {
if theCase == "lower" {
result[colsLower[i]] = string(raw)
} else if theCase == "upper" {
result[cols[i]] = string(raw)
} else if theCase == "camel" {
result[colsCamel[i]] = string(raw)
} else {
result[cols[i]] = string(raw)
}
}
}
results = append(results, result)
}
return results, nil
}
// QueryTxToMap - run sql and return an array of maps
func QueryTxToMap(tx *sql.Tx, theCase string, sqlStatement string, sqlParams ...interface{}) ([]map[string]string, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
results := []map[string]string{}
rows, err := tx.Query(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
return results, err
}
cols, _ := rows.Columns()
colsLower := make([]string, len(cols))
colsCamel := make([]string, len(cols))
if theCase == "lower" {
for i, v := range cols {
colsLower[i] = strings.ToLower(v)
}
} else if theCase == "upper" {
for i, v := range cols {
cols[i] = strings.ToUpper(v)
}
} else if theCase == "camel" {
for i, v := range cols {
colsCamel[i] = toCamel(v)
}
}
rawResult := make([][]byte, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
for rows.Next() {
result := make(map[string]string, len(cols))
rows.Scan(dest...)
for i, raw := range rawResult {
if raw == nil {
if theCase == "lower" {
result[colsLower[i]] = ""
} else if theCase == "upper" {
result[cols[i]] = ""
} else if theCase == "camel" {
result[colsCamel[i]] = ""
} else {
result[cols[i]] = ""
}
} else {
if theCase == "lower" {
result[colsLower[i]] = string(raw)
} else if theCase == "upper" {
result[cols[i]] = string(raw)
} else if theCase == "camel" {
result[colsCamel[i]] = string(raw)
} else {
result[cols[i]] = string(raw)
}
}
}
results = append(results, result)
}
return results, nil
}
// ExecDb - run the sql and returns rows affected.
func ExecDb(db *sql.DB, sqlStatement string, sqlParams ...interface{}) (int64, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
result, err := db.Exec(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
fmt.Println(err)
return 0, err
}
return result.RowsAffected()
}
// ExecTx - run the sql and returns rows affected.
func ExecTx(tx *sql.Tx, sqlStatement string, sqlParams ...interface{}) (int64, error) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
result, err := tx.Exec(sqlStatement, sqlParams...)
if err != nil {
fmt.Println("Error executing: ", sqlStatement)
fmt.Println(err)
return 0, err
}
return result.RowsAffected()
}
func toCamel(s string) (ret string) {
s = strings.ToLower(s)
a := strings.Split(s, "_")
for i, v := range a {
if i == 0 {
ret += v
} else {
f := strings.ToUpper(string(v[0]))
n := string(v[1:])
ret += fmt.Sprint(f, n)
}
}
return
}