mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-07-28 01:59:57 +00:00
TUN-801: Rapid SQL Proxy
This commit is contained in:

committed by
Areg Harutyunyan

parent
aa5e551de6
commit
60ca06d020
25
vendor/github.com/elgs/gosqljson/.gitignore
generated
vendored
Normal file
25
vendor/github.com/elgs/gosqljson/.gitignore
generated
vendored
Normal 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
16
vendor/github.com/elgs/gosqljson/LICENSE
generated
vendored
Normal 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
56
vendor/github.com/elgs/gosqljson/README.md
generated
vendored
Normal 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
334
vendor/github.com/elgs/gosqljson/gosqljson.go
generated
vendored
Normal 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
|
||||
}
|
Reference in New Issue
Block a user