feat: 合并sqlfiddle目录
This commit is contained in:
parent
be74570f38
commit
e4c0aa8838
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2018 The Xorm Authors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
|
@ -0,0 +1,17 @@
|
||||||
|
# SQL Fiddle API (UnOfficial)
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
This Go library is aimed to provide an API to operate http://sqlfiddle.com/
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```Go
|
||||||
|
fiddle := NewFiddle("")
|
||||||
|
res, err := fiddle.CreateSchema(Mysql5_6, `create table person(id int not null auto_increment,
|
||||||
|
name varchar(8),
|
||||||
|
birthday datetime,
|
||||||
|
constraint pk__person primary key(id));`)
|
||||||
|
|
||||||
|
ret, err := fiddle.RunSQL(Mysql5_6, res.Code, "select * from person;")
|
||||||
|
```
|
|
@ -0,0 +1,192 @@
|
||||||
|
// Copyright 2018 The Xorm Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sqlfiddle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
Mysql5_6 = 9
|
||||||
|
Oracle11gR2 = 4
|
||||||
|
PostgreSQL96 = 17
|
||||||
|
PostgreSQL93 = 15
|
||||||
|
SQLite_WebSQL = 7
|
||||||
|
SQLite_SQLjs = 5
|
||||||
|
MSSQL2017 = 18
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
{
|
||||||
|
"_id" : "9_ed3b0c",
|
||||||
|
"short_code" : "ed3b0c",
|
||||||
|
"schema_structure" : [ {
|
||||||
|
"columns" : [ {
|
||||||
|
"name" : "id",
|
||||||
|
"type" : "INT(10)"
|
||||||
|
}, {
|
||||||
|
"name" : "name",
|
||||||
|
"type" : "VARCHAR(8)"
|
||||||
|
}, {
|
||||||
|
"name" : "birthday",
|
||||||
|
"type" : "DATETIME(19)"
|
||||||
|
} ],
|
||||||
|
"table_name" : "person",
|
||||||
|
"table_type" : "TABLE"
|
||||||
|
} ]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultBaseURL = "http://sqlfiddle.com"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Fiddle struct {
|
||||||
|
baseURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFiddle(baseURL string) *Fiddle {
|
||||||
|
if baseURL == "" {
|
||||||
|
baseURL = defaultBaseURL
|
||||||
|
}
|
||||||
|
return &Fiddle{baseURL}
|
||||||
|
}
|
||||||
|
|
||||||
|
type column struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type schemaStructure struct {
|
||||||
|
Columns []column `json:"columns"`
|
||||||
|
TableName string `json:"table_name"`
|
||||||
|
TableType string `json:"table_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type response struct {
|
||||||
|
Id string `json:"_id"`
|
||||||
|
Code string `json:"short_code"`
|
||||||
|
Structures []schemaStructure `json:"schema_structure"`
|
||||||
|
ErrorMsg string `json:"error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Fiddle) CreateSchema(dbType int, sql string) (*response, error) {
|
||||||
|
payload := map[string]interface{}{"statement_separator": ";", "db_type_id": dbType, "ddl": sql}
|
||||||
|
bs, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req, err := http.NewRequest("POST", f.baseURL+"/backend/createSchema?_action=create", bytes.NewBuffer(bs))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
var res response
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&res)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.ErrorMsg != "" {
|
||||||
|
return &res, errors.New(res.ErrorMsg)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
http://sqlfiddle.com/backend/executeQuery?_action=query
|
||||||
|
|
||||||
|
{"db_type_id":9,"schema_short_code":"ed3b0c","statement_separator":";","sql":"select * from person;"}
|
||||||
|
|
||||||
|
{
|
||||||
|
"ID" : 2,
|
||||||
|
"sets" : [ {
|
||||||
|
"RESULTS" : {
|
||||||
|
"COLUMNS" : [ "id", "name", "birthday" ],
|
||||||
|
"DATA" : [ ]
|
||||||
|
},
|
||||||
|
"SUCCEEDED" : true,
|
||||||
|
"STATEMENT" : "select * from person",
|
||||||
|
"EXECUTIONTIME" : 2,
|
||||||
|
"EXECUTIONPLANRAW" : {
|
||||||
|
"COLUMNS" : [ "id", "select_type", "table", "type", "possible_keys", "key", "key_len", "ref", "rows", "filtered", "Extra" ],
|
||||||
|
"DATA" : [ [ "1", "SIMPLE", "person", "ALL", null, null, null, null, "1", "100.00", null ] ]
|
||||||
|
},
|
||||||
|
"EXECUTIONPLAN" : {
|
||||||
|
"COLUMNS" : [ "id", "select_type", "table", "type", "possible_keys", "key", "key_len", "ref", "rows", "filtered", "Extra" ],
|
||||||
|
"DATA" : [ [ "1", "SIMPLE", "person", "ALL", null, null, null, null, "1", "100.00", null ] ]
|
||||||
|
}
|
||||||
|
} ]
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
type sqlResult struct {
|
||||||
|
Statement string `json:"STATEMENT"`
|
||||||
|
Succeeded bool `json:"SUCCEEDED"`
|
||||||
|
ErrorMessage string `json:"ERRORMESSAGE"`
|
||||||
|
ExecutionTime int `json:"EXECUTIONTIME"`
|
||||||
|
Results struct {
|
||||||
|
Columns []string `json:"COLUMNS"`
|
||||||
|
Data [][]interface{} `json:"DATA"`
|
||||||
|
} `json:"RESULTS"`
|
||||||
|
ExecutionPlanRaw struct {
|
||||||
|
Columns []string `json:"COLUMNS"`
|
||||||
|
Data [][]interface{} `json:"DATA"`
|
||||||
|
} `json:"EXECUTIONPLANRAW"`
|
||||||
|
ExecutionPlan struct {
|
||||||
|
Columns []string `json:"COLUMNS"`
|
||||||
|
Data [][]interface{} `json:"DATA"`
|
||||||
|
} `json:"EXECUTIONPLAN"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type sqlResponse struct {
|
||||||
|
Id int64 `json:"ID"`
|
||||||
|
Sets []sqlResult
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Fiddle) RunSQL(dbType int, code, sql string) (*sqlResponse, error) {
|
||||||
|
payload := map[string]interface{}{"schema_short_code": code, "statement_separator": ";", "db_type_id": dbType, "sql": sql}
|
||||||
|
bs, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req, err := http.NewRequest("POST", f.baseURL+"/backend/executeQuery?_action=query", bytes.NewBuffer(bs))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
var res sqlResponse
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&res)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for e := range res.Sets {
|
||||||
|
result := res.Sets[e]
|
||||||
|
|
||||||
|
if result.ErrorMessage != "" {
|
||||||
|
return &res, fmt.Errorf("something wrong with sql %q in pos %v, detail: %q",
|
||||||
|
result.Statement, e+1, result.ErrorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &res, nil
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
// Copyright 2018 The Xorm Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package sqlfiddle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestFiddle_CreateSchema4Mysql(t *testing.T) {
|
||||||
|
fiddle := NewFiddle("")
|
||||||
|
res, err := fiddle.CreateSchema(Mysql5_6, `create table person(id int not null auto_increment,
|
||||||
|
name varchar(8),
|
||||||
|
birthday datetime,
|
||||||
|
constraint pk__person primary key(id));`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(res)
|
||||||
|
|
||||||
|
ret, err := fiddle.RunSQL(Mysql5_6, res.Code, "select * from person;")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(ret)
|
||||||
|
|
||||||
|
ret, err = fiddle.RunSQL(Mysql5_6, res.Code, "select * from person1;")
|
||||||
|
assert.Error(t, err)
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFiddle_CreateSchema4Oracle(t *testing.T) {
|
||||||
|
fiddle := NewFiddle("")
|
||||||
|
res, err := fiddle.CreateSchema(Oracle11gR2, `create table table1(
|
||||||
|
id number(9) not null primary key,
|
||||||
|
a varchar2(40),
|
||||||
|
b varchar2(40),
|
||||||
|
c varchar2(40)
|
||||||
|
);`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(res)
|
||||||
|
|
||||||
|
ret, err := fiddle.RunSQL(Oracle11gR2, res.Code, "select * from table1;")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFiddle_CreateSchema4MssSQL(t *testing.T) {
|
||||||
|
fiddle := NewFiddle("")
|
||||||
|
res, err := fiddle.CreateSchema(Oracle11gR2, `create table table1(
|
||||||
|
id int primary key,
|
||||||
|
a varchar(40),
|
||||||
|
b varchar(40),
|
||||||
|
c varchar(40)
|
||||||
|
);`)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(res)
|
||||||
|
|
||||||
|
ret, err := fiddle.RunSQL(Oracle11gR2, res.Code, "select * from table1;")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
fmt.Println(ret)
|
||||||
|
}
|
Loading…
Reference in New Issue