Commit 4f528f21 authored by shaol~'s avatar shaol~

替换脚手架

parent ea3b3aa8

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

......@@ -3,6 +3,6 @@ package boot
// todo... add your entity runtime
// example:
// import (
// _ "your-project/domain/entity/your-entity/runtime"
// )
import (
_ "doc-service/domain/entity/serversitemicros/runtime"
)
......@@ -4,6 +4,7 @@ import (
pb "doc-service/pb"
"encoding/json"
"errors"
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
imm20200930 "github.com/alibabacloud-go/imm-20200930/v4/client"
openapiutil "github.com/alibabacloud-go/openapi-util/service"
......@@ -50,7 +51,7 @@ func (o *Conversion) GetBucket(isPrivate bool) string {
return "oss://" + "test-bucket-v1-pub"
}
type ConversionRequest struct {
type DoConversionRequest struct {
ProjectName string
SourceType string
TargetType string
......@@ -59,10 +60,10 @@ type ConversionRequest struct {
IsPrivate bool
}
type ConversionResponse struct {
Code string
type GetConversionResponse struct {
Code int
Msg string
Data interface{}
Data *imm20200930.GetTaskResponse
}
type GetTaskRequest struct {
......@@ -73,7 +74,7 @@ type GetTaskRequest struct {
RequestDefinition bool
}
func (o *Conversion) checkParam(arg ConversionRequest) error {
func (o *Conversion) checkParam(arg DoConversionRequest) error {
if arg.SourceURI == "" {
return errors.New("SourceURI 不能为空")
}
......@@ -104,8 +105,9 @@ func (o *Conversion) checkGetTaskParam(arg GetTaskRequest) error {
}
func NewConversion() *Conversion {
config, iniErr := ini.Load("./conf/app.ini")
config, iniErr := ini.Load("domain/conf/app.ini")
if iniErr != nil {
fmt.Println("Fail to read file")
log.Error("Fail to read file: %v")
os.Exit(1)
}
......@@ -149,7 +151,7 @@ func (o *Conversion) CreateApiInfo() (_result *openapi.Params) {
}
// 文件转换
func (o *Conversion) Conversion(arg *ConversionRequest) (map[string]interface{}, error) {
func (o *Conversion) Conversion(arg *DoConversionRequest) (map[string]interface{}, error) {
ret := make(map[string]interface{}, 0)
//校验参数
checkErr := o.checkParam(*arg)
......@@ -168,6 +170,7 @@ func (o *Conversion) Conversion(arg *ConversionRequest) (map[string]interface{},
if parseTargetErr != nil {
return ret, parseTargetErr
}
fmt.Println("24324324324324")
// query params
queries := map[string]interface{}{}
queries["ProjectName"] = arg.ProjectName
......@@ -211,6 +214,7 @@ func (o *Conversion) CreateImClient() (_result *imm20200930.Client, _err error)
// 创建项目
func (o *Conversion) CreateProject() (_err error) {
client, createError := o.CreateImClient()
fmt.Println(client)
if createError != nil {
return createError
}
......
package osscli
import (
"bytes"
"encoding/json"
"fmt"
"io"
"mime/multipart"
"net/http"
"os"
"time"
)
type IOssBucket interface {
UploadFile(fpath string) (string, error)
}
type ossBucket struct {
host string
}
func NewOssBucket(host string) IOssBucket {
return &ossBucket{
host: host,
}
}
func (b *ossBucket) UploadFile(filePath string) (string, error) {
// 检查文件是否存在
_, err := os.Stat(filePath)
if err != nil {
return "", err
}
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
// 打开本地文件
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
// 创建HTTP POST请求
var reqBody bytes.Buffer
writer := multipart.NewWriter(&reqBody)
destFile, err := writer.CreateFormFile("file", file.Name())
if err != nil {
return "", err
}
if _, err = io.Copy(destFile, file); err != nil {
return "", err
}
_ = writer.Close()
request, err := http.NewRequest("POST", b.host+"/oss/upload/storage", &reqBody)
if err != nil {
return "", err
}
// 设置必要的请求头,特别是 Content-Type
request.Header.Set("Content-Type", writer.FormDataContentType())
// 设置 businessCode 请求头
request.Header.Set("businessCode", "4001001")
// 设置超时时间
client := &http.Client{
Timeout: 30 * time.Second,
}
// 发送HTTP POST请求
resp, err := client.Do(request)
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("oss上传响应异常:%d", resp.StatusCode)
}
var response map[string]interface{}
if err := json.NewDecoder(resp.Body).Decode(&response); err != nil {
return "", err
}
if int(response["code"].(float64)) != 200 {
return "", fmt.Errorf("oss上传失败: code=%d, msg=%s", response["code"].(float64), response["msg"].(string))
}
return response["data"].(string), nil
}
......@@ -3,89 +3,110 @@ package service
import (
"context"
service "doc-service/domain/repository"
"doc-service/infra/db"
"fmt"
pb "gitlab.galaxy-immi.com/Backend-group/proto/pb/docservice"
"time"
)
type DocServiceService struct {
pb.UnimplementedDocServiceServiceServer
}
// 发起文件转换
func DoConversion(c context.Context, req *service.ConversionRequest) (resp *service.ConversionResponse, err error) {
/*ret := make(map[string]interface{}, 0)
ret["errcode"] = 0
ret["errmsg"] = nil
ret["base64"] = nil*/
req.IsPrivate = true
func (doc *DocServiceService) DoConversion(c context.Context, req *pb.DoConversionRequest) (resp *pb.DoConversionResponse, err error) {
resp = &pb.DoConversionResponse{}
request := &service.DoConversionRequest{
ProjectName: req.ProjectName,
SourceType: req.SourceType,
TargetType: req.TargetType,
SourceURI: req.SourceUrl,
TargetURI: req.TargetUrl,
IsPrivate: req.IsPrivate,
}
request.IsPrivate = true
//创建项目
createErr := service.NewConversion().CreateProject()
fmt.Println(createErr)
if createErr != nil {
resp.Msg = createErr.Error()
resp.Code = "100010"
resp.Code = 100010
resp.Data = nil
return resp, err
}
//执行转换
result, errs := service.NewConversion().Conversion(req)
result, errs := service.NewConversion().Conversion(request)
if errs != nil {
resp.Msg = createErr.Error()
resp.Code = "100010"
resp.Code = 100010
resp.Data = nil
return resp, err
}
taskId := result["body"].(map[string]interface{})["TaskId"].(string)
//入库
save, errset := db.GetServerSiteMicrosDB().DocServerProject.Create().
save, errsInfo := db.GetServerSiteMicrosDB().DocServerProject.Create().
SetProjectName(req.ProjectName).
SetCreatedAt(time.Now()).
SetSourceURL(req.SourceURI).
SetSourceURL(request.SourceURI).
SetSourceType(req.SourceType).
SetTargetURL(req.TargetURI).
SetTargetURL(request.TargetURI).
SetTaskID(taskId).Save(c)
if errset != nil {
resp.Msg = errset.Error()
resp.Code = "100010"
if errsInfo != nil {
resp.Msg = errsInfo.Error()
resp.Code = 100010
resp.Data = nil
return resp, errset
return resp, errsInfo
}
resp.Msg = ""
resp.Code = "200"
resp.Data = save
resp.Msg = "success"
resp.Code = 200
resp.Data = &pb.DoConversionData{
Id: save.ID,
TaskId: taskId,
}
return resp, nil
}
// 获取转换结果
func GetTaskProject(c context.Context, req *service.GetTaskRequest) (resp *service.ConversionResponse, err error) {
ret := make(map[string]interface{}, 0)
req.RequestDefinition = true
ret["ProjectId"] = req.ProjectId
if ret["ProjectId"] != "" {
projectData, infoErr := db.GetServerSiteMicrosDB().DocServerProject.Get(c, ret["ProjectId"].(int32))
func (doc *DocServiceService) GetProjectInfo(c context.Context, req *pb.GetProjectRequest) (resp *pb.GetProjectResponse, err error) {
request := &service.GetTaskRequest{
ProjectId: req.ProjectId,
ProjectName: req.ProjectName,
TaskType: req.TaskType,
TaskId: req.TaskId,
RequestDefinition: req.RequestDefinition,
}
request.RequestDefinition = true
if req.ProjectId > 0 {
projectData, infoErr := db.GetServerSiteMicrosDB().DocServerProject.Get(c, req.ProjectId)
if infoErr != nil {
resp.Msg = err.Error()
resp.Code = "100010"
resp.Code = 100010
resp.Data = nil
return resp, err
}
req.ProjectName = projectData.ProjectName
req.TaskId = projectData.TaskID
req.TaskType = projectData.TargetType
request.ProjectName = projectData.ProjectName
request.TaskId = projectData.TaskID
request.TaskType = projectData.TargetType
}
result, errs := service.NewConversion().GetTaskProject(*req)
_, errs := service.NewConversion().GetTaskProject(*request)
if errs != nil {
resp.Msg = err.Error()
resp.Code = "100010"
resp.Code = 100010
resp.Data = nil
return resp, err
}
resp.Msg = ""
resp.Code = "200"
resp.Data = result
resp.Msg = "success"
resp.Code = 200
resp.Data = nil
return resp, nil
}
......@@ -71,7 +71,6 @@ require (
github.com/prometheus/procfs v0.7.3 // indirect
github.com/shirou/gopsutil/v3 v3.21.6 // indirect
github.com/shopspring/decimal v1.3.1 // indirect
github.com/smarty/assertions v1.15.1 // indirect
github.com/sony/sonyflake v1.2.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.9.0 // indirect
......@@ -82,7 +81,7 @@ require (
github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect
github.com/uber/jaeger-lib v2.4.1+incompatible // indirect
github.com/zclconf/go-cty v1.8.0 // indirect
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240514033551-95428d937aac // indirect
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913063110-b668f029e9c5 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.24.0 // indirect
......
......@@ -104,6 +104,7 @@ github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTs
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
......@@ -201,6 +202,7 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
......@@ -354,6 +356,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
......@@ -471,6 +474,7 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/shirou/gopsutil/v3 v3.21.6 h1:vU7jrp1Ic/2sHB7w6UNs7MIkn7ebVtTb5D9j45o9VYE=
github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+LwHTKj0ST88=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
......@@ -479,8 +483,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/smarty/assertions v1.15.1 h1:812oFiXI+G55vxsFf+8bIZ1ux30qtkdqzKbEFwyX3Tk=
github.com/smarty/assertions v1.15.1/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=
github.com/smarty/assertions v1.16.0 h1:EvHNkdRA4QHMrn75NZSoUQ/mAUXAYWfatfB01yTCzfY=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
......@@ -542,10 +545,25 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/zclconf/go-cty v1.8.0 h1:s4AvqaeQzJIu3ndv4gVIhplVD0krU+bgrcLSVUnaWuA=
github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
gitlab.galaxy-immi.com/Backend-group/go-com v1.4.2-test-rc12 h1:bzReHSzFXDEDY63QL0VDMfcfAL8MYm7I4h6iB6qIAeY=
gitlab.galaxy-immi.com/Backend-group/go-com v1.4.2-test-rc12/go.mod h1:Wyfqynjmd55ApRDPxuFOlOwcYhS+L0LZU4oExla7+Lw=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240514033551-95428d937aac h1:jwiRGUVpHoHjYXbjC7QJa31P0rCKWCmyArX1kEw/Z+A=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240514033551-95428d937aac/go.mod h1:NLCGYi/Gr51HRqbsp9gsHDIJNrrpSccMIJPfgUWd4qg=
gitlab.galaxy-immi.com/Backend-group/proto v1.6.31-test-rc7 h1:+VWYjaAlEOztKmFxZnhQvreUreYTyndSt9lKkJTSers=
gitlab.galaxy-immi.com/Backend-group/proto v1.6.31-test-rc7/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913021148-7b04b3f8b54c h1:hpq3YUnjU6xEquL/Xr2FBqD+poT+FOx0BOdVtKvgLZk=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913021148-7b04b3f8b54c/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913024000-a982660f14ac h1:010Dii9aRY8rZ8zbLIy5X8FD+optcGKLRSxMd+aswb8=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913024000-a982660f14ac/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913031009-a5919c6b0055 h1:myVSbH6V/gEP1jDYGypAQuKFaoQTHQqTvApjDahA3Fc=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913031009-a5919c6b0055/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913032051-277c2f16a798 h1:905lnaETrbPjiPexZ7ArCTEeFK8sqVIolwdhgtIHBxE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913032051-277c2f16a798/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913053623-1b403c8f08e2 h1:RWSf9MntpTBUFNiF6Bw6La7Af1TIIfhEiVOlo0ZYYk4=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913053623-1b403c8f08e2/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913054214-762767e8ba9e h1:d4L+kDc8w5Aha9kf9pMd3bF1/j+H7sQ/wmducpXCtpA=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913054214-762767e8ba9e/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913063110-b668f029e9c5 h1:RjVYcLotQxjcBVm4eeA1HoQaCb1Xb9lGcRX/O3EgpyQ=
gitlab.galaxy-immi.com/Backend-group/proto v1.10.11-0.20240913063110-b668f029e9c5/go.mod h1:vXZLtbzFvAjc86DXqO8LdYjBkMGc5fVh5XGe2bi4FqE=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
......
......@@ -3,29 +3,32 @@ package main
import (
"context"
"doc-service/domain/repository"
repository "doc-service/domain/repository"
"doc-service/domain/service"
"doc-service/infra/db"
pb "doc-service/pb"
"errors"
"flag"
"fmt"
"net"
"net/http"
"os"
"os/signal"
"strings"
"sync"
"syscall"
pb "doc-service/pb"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"gitlab.galaxy-immi.com/Backend-group/go-com/consts/codes"
"gitlab.galaxy-immi.com/Backend-group/go-com/nacos"
"gitlab.galaxy-immi.com/Backend-group/go-com/third/log"
"gitlab.galaxy-immi.com/Backend-group/go-com/tool"
pb2 "gitlab.galaxy-immi.com/Backend-group/proto/pb/docservice"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
"net"
"net/http"
"os"
"os/signal"
"strings"
"sync"
"syscall"
_ "doc-service/boot"
)
......@@ -129,7 +132,8 @@ func run() error {
grpcServer := grpc.NewServer(grpc.ChainUnaryInterceptor(
log.ErrorInterceptor, log.ValidateInterceptor, sentinelEntry))
pb.RegisterConvertServerServer(grpcServer, service.ConvertServiceImpl)
pb.RegisterConvertServerServer(grpcServer, repository.ConvertServiceImpl)
pb2.RegisterDocServiceServiceServer(grpcServer, &service.DocServiceService{})
listener, err := net.Listen(`tcp`, grpcPort)
if err != nil {
......@@ -143,9 +147,14 @@ func run() error {
go grpcRun(grpcServer, listener)
err = pb.RegisterConvertServerHandlerFromEndpoint(ctx, serviceMux, grpcPort, opts)
err = pb.RegisterDocServiceHandlerFromEndpoint(ctx, serviceMux, grpcPort, opts)
if err != nil {
return fmt.Errorf("pb.RegisterDocServiceHandlerFromEndpoint: %w", err)
}
err = pb2.RegisterDocServiceServiceHandlerFromEndpoint(ctx, serviceMux, grpcPort, opts)
if err != nil {
return fmt.Errorf("pb.RegisterConvertServerHandlerFromEndpoint: %w", err)
return fmt.Errorf("pb.RegisterDocServiceHandlerFromEndpoint: %w", err)
}
err = tool.HandleLive(serviceMux)
......@@ -166,6 +175,7 @@ func run() error {
}
func main() {
fmt.Println("bessssss")
if err := run(); err != nil && !errors.Is(err, http.ErrServerClosed) {
panic(err)
}
......
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.3.0
// - protoc v4.24.4
// source: hello.proto
package convert
package doc
import (
context "context"
......
......@@ -6,7 +6,7 @@ Package after is a reverse proxy.
It translates gRPC into RESTful JSON APIs.
*/
package convert
package doc
import (
"context"
......@@ -31,7 +31,7 @@ var _ = runtime.String
var _ = utilities.NewDoubleArray
var _ = metadata.Join
func request_ConvertServer_Hello_0(ctx context.Context, marshaler runtime.Marshaler, client ConvertServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
func request_DocService_Hello_0(ctx context.Context, marshaler runtime.Marshaler, client ConvertServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq HelloRequest
var metadata runtime.ServerMetadata
......@@ -40,7 +40,7 @@ func request_ConvertServer_Hello_0(ctx context.Context, marshaler runtime.Marsha
}
func local_request_ConvertServer_Hello_0(ctx context.Context, marshaler runtime.Marshaler, server ConvertServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
func local_request_DocService_Hello_0(ctx context.Context, marshaler runtime.Marshaler, server ConvertServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq HelloRequest
var metadata runtime.ServerMetadata
......@@ -49,13 +49,13 @@ func local_request_ConvertServer_Hello_0(ctx context.Context, marshaler runtime.
}
// RegisterConvertServerHandlerServer registers the http handlers for service ConvertServer to "mux".
// UnaryRPC :call ConvertServerServer directly.
// RegisterDocServiceHandlerServer registers the http handlers for service DocService to "mux".
// UnaryRPC :call DocServiceServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterConvertServerHandlerFromEndpoint instead.
func RegisterConvertServerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConvertServerServer) error {
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterDocServiceHandlerFromEndpoint instead.
func RegisterDocServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ConvertServerServer) error {
mux.Handle("GET", pattern_ConvertServer_Hello_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
mux.Handle("GET", pattern_DocService_Hello_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
......@@ -63,12 +63,12 @@ func RegisterConvertServerHandlerServer(ctx context.Context, mux *runtime.ServeM
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/convert.ConvertServer/Hello", runtime.WithHTTPPathPattern("/convert/hello"))
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/doc.DocService/Hello", runtime.WithHTTPPathPattern("/doc/hello"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_ConvertServer_Hello_0(annotatedContext, inboundMarshaler, server, req, pathParams)
resp, md, err := local_request_DocService_Hello_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
......@@ -76,16 +76,16 @@ func RegisterConvertServerHandlerServer(ctx context.Context, mux *runtime.ServeM
return
}
forward_ConvertServer_Hello_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
forward_DocService_Hello_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
// RegisterConvertServerHandlerFromEndpoint is same as RegisterConvertServerHandler but
// RegisterDocServiceHandlerFromEndpoint is same as RegisterDocServiceHandler but
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
func RegisterConvertServerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
func RegisterDocServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
conn, err := grpc.DialContext(ctx, endpoint, opts...)
if err != nil {
return err
......@@ -105,41 +105,41 @@ func RegisterConvertServerHandlerFromEndpoint(ctx context.Context, mux *runtime.
}()
}()
return RegisterConvertServerHandler(ctx, mux, conn)
return RegisterDocServiceHandler(ctx, mux, conn)
}
// RegisterConvertServerHandler registers the http handlers for service ConvertServer to "mux".
// RegisterDocServiceHandler registers the http handlers for service DocService to "mux".
// The handlers forward requests to the grpc endpoint over "conn".
func RegisterConvertServerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterConvertServerHandlerClient(ctx, mux, NewConvertServerClient(conn))
func RegisterDocServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterDocServiceHandlerClient(ctx, mux, NewConvertServerClient(conn))
}
// RegisterConvertServerHandlerClient registers the http handlers for service ConvertServer
// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ConvertServerClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ConvertServerClient"
// RegisterDocServiceHandlerClient registers the http handlers for service DocService
// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "DocServiceClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "DocServiceClient"
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
// "ConvertServerClient" to call the correct interceptors.
func RegisterConvertServerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConvertServerClient) error {
// "DocServiceClient" to call the correct interceptors.
func RegisterDocServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ConvertServerClient) error {
mux.Handle("GET", pattern_ConvertServer_Hello_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
mux.Handle("GET", pattern_DocService_Hello_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/convert.ConvertServer/Hello", runtime.WithHTTPPathPattern("/convert/hello"))
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/doc.DocService/Hello", runtime.WithHTTPPathPattern("/doc/hello"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_ConvertServer_Hello_0(annotatedContext, inboundMarshaler, client, req, pathParams)
resp, md, err := request_DocService_Hello_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_ConvertServer_Hello_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
forward_DocService_Hello_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
......@@ -147,9 +147,9 @@ func RegisterConvertServerHandlerClient(ctx context.Context, mux *runtime.ServeM
}
var (
pattern_ConvertServer_Hello_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"convert", "hello"}, ""))
pattern_DocService_Hello_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"doc", "hello"}, ""))
)
var (
forward_ConvertServer_Hello_0 = runtime.ForwardResponseMessage
forward_DocService_Hello_0 = runtime.ForwardResponseMessage
)
......@@ -4,7 +4,7 @@
// protoc v4.24.4
// source: hello.proto
package convert
package doc
import (
_ "google.golang.org/genproto/googleapis/api/annotations"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
package specutil
import (
"fmt"
"ariga.io/atlas/schemahcl"
"ariga.io/atlas/sql/schema"
"ariga.io/atlas/sql/sqlspec"
"github.com/hashicorp/hcl/v2/hclparse"
"github.com/zclconf/go-cty/cty"
)
// VarAttr is a helper method for constructing *schemahcl.Attr instances that contain a variable reference.
func VarAttr(k, v string) *schemahcl.Attr {
return schemahcl.RefAttr(k, &schemahcl.Ref{V: v})
}
type (
// SchemaSpec is returned by driver convert functions to
// marshal a *schema.Schema into top-level spec objects.
SchemaSpec struct {
Schema *sqlspec.Schema
Tables []*sqlspec.Table
Views []*sqlspec.View
}
doc struct {
Tables []*sqlspec.Table `spec:"table"`
Views []*sqlspec.View `spec:"view"`
Schemas []*sqlspec.Schema `spec:"schema"`
}
)
// Marshal marshals v into an Atlas DDL document using a schemahcl.Marshaler. Marshal uses the given
// schemaSpec function to convert a *schema.Schema into *sqlspec.Schema, []*sqlspec.Table and []*sqlspec.View.
func Marshal(v any, marshaler schemahcl.Marshaler, convertFunc func(*schema.Schema) (*SchemaSpec, error)) ([]byte, error) {
d := &doc{}
switch s := v.(type) {
case *schema.Schema:
spec, err := convertFunc(s)
if err != nil {
return nil, fmt.Errorf("specutil: failed converting schema to spec: %w", err)
}
d.Tables = spec.Tables
d.Views = spec.Views
d.Schemas = []*sqlspec.Schema{spec.Schema}
case *schema.Realm:
for _, s := range s.Schemas {
spec, err := convertFunc(s)
if err != nil {
return nil, fmt.Errorf("specutil: failed converting schema to spec: %w", err)
}
d.Tables = append(d.Tables, spec.Tables...)
d.Views = append(d.Views, spec.Views...)
d.Schemas = append(d.Schemas, spec.Schema)
}
if err := QualifyObjects(d.Tables); err != nil {
return nil, err
}
if err := QualifyObjects(d.Views); err != nil {
return nil, err
}
if err := QualifyReferences(d.Tables, s); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("specutil: failed marshaling spec. %T is not supported", v)
}
return marshaler.MarshalSpec(d)
}
// SchemaObject describes a top-level schema object
// that might be qualified, e.g. a table or a view.
type SchemaObject interface {
Label() string
QualifierLabel() string
SetQualifier(string)
SchemaRef() *schemahcl.Ref
}
// QualifyObjects sets the Qualifier field equal to the schema
// name in any objects with duplicate names in the provided specs.
func QualifyObjects[T SchemaObject](specs []T) error {
var (
seen = make(map[string]T, len(specs))
schemas = make(map[string]bool, len(specs))
)
// Loop first and qualify schema objects with the same label.
// For example, two tables named "users" reside in different
// schemas are converted to: ("s1", "users") and ("s2", "users").
for _, v := range specs {
if s, ok := seen[v.Label()]; ok {
schemaName, err := SchemaName(s.SchemaRef())
if err != nil {
return err
}
s.SetQualifier(schemaName)
schemas[schemaName] = true
schemaName, err = SchemaName(v.SchemaRef())
if err != nil {
return err
}
v.SetQualifier(schemaName)
schemas[schemaName] = true
}
seen[v.Label()] = v
}
// After objects were qualified, they might be conflicted with different
// resources that labeled with the schema name. e.g., ("s1", "users") and
// ("s1"). To resolve this conflict, we qualify these objects as well.
for _, v := range specs {
if v.QualifierLabel() == "" && schemas[v.Label()] {
schemaName, err := SchemaName(v.SchemaRef())
if err != nil {
return err
}
v.SetQualifier(schemaName)
}
}
return nil
}
// QualifyReferences qualifies any reference with qualifier.
func QualifyReferences(tableSpecs []*sqlspec.Table, realm *schema.Realm) error {
type cref struct{ s, t string }
byRef := make(map[cref]*sqlspec.Table)
for _, t := range tableSpecs {
r := cref{s: t.Qualifier, t: t.Name}
if byRef[r] != nil {
return fmt.Errorf("duplicate references were found for: %v", r)
}
byRef[r] = t
}
for _, t := range tableSpecs {
sname, err := SchemaName(t.Schema)
if err != nil {
return err
}
s1, ok := realm.Schema(sname)
if !ok {
return fmt.Errorf("schema %q was not found in realm", sname)
}
t1, ok := s1.Table(t.Name)
if !ok {
return fmt.Errorf("table %q.%q was not found in realm", sname, t.Name)
}
for _, fk := range t.ForeignKeys {
fk1, ok := t1.ForeignKey(fk.Symbol)
if !ok {
return fmt.Errorf("table %q.%q.%q was not found in realm", sname, t.Name, fk.Symbol)
}
for i, c := range fk.RefColumns {
if r, ok := byRef[cref{s: fk1.RefTable.Schema.Name, t: fk1.RefTable.Name}]; ok && r.Qualifier != "" {
fk.RefColumns[i] = qualifiedExternalColRef(fk1.RefColumns[i].Name, r.Name, r.Qualifier)
} else if r, ok := byRef[cref{t: fk1.RefTable.Name}]; ok && r.Qualifier == "" {
fk.RefColumns[i] = externalColRef(fk1.RefColumns[i].Name, r.Name)
} else {
return fmt.Errorf("missing reference for column %q in %q.%q.%q", c.V, sname, t.Name, fk.Symbol)
}
}
}
}
return nil
}
// HCLBytesFunc returns a helper that evaluates an HCL document from a byte slice instead
// of from an hclparse.Parser instance.
func HCLBytesFunc(ev schemahcl.Evaluator) func(b []byte, v any, inp map[string]cty.Value) error {
return func(b []byte, v any, inp map[string]cty.Value) error {
parser := hclparse.NewParser()
if _, diag := parser.ParseHCL(b, ""); diag.HasErrors() {
return diag
}
return ev.Eval(parser, v, inp)
}
}
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
package sqlx
import (
"context"
"fmt"
"ariga.io/atlas/sql/migrate"
"ariga.io/atlas/sql/schema"
)
// DevDriver is a driver that provides additional functionality
// to interact with the development database.
type DevDriver struct {
// A Driver connected to the dev database.
Driver interface {
migrate.Driver
migrate.CleanChecker
migrate.Snapshoter
}
// PathObject allows providing a custom function to patch
// objects that hold a schema reference.
PatchObject func(*schema.Schema, schema.Object)
}
// NormalizeRealm implements the schema.Normalizer interface.
//
// The implementation converts schema objects in "natural form" (e.g. HCL or DSL)
// to their "normal presentation" in the database, by creating them temporarily in
// a "dev database", and then inspects them from there.
func (d *DevDriver) NormalizeRealm(ctx context.Context, r *schema.Realm) (nr *schema.Realm, err error) {
if err := d.Driver.CheckClean(ctx, nil); err != nil {
return nil, err
}
restore, err := d.Driver.Snapshot(ctx)
if err != nil {
return nil, err
}
defer func() {
if rerr := restore(ctx); rerr != nil {
if err != nil {
rerr = fmt.Errorf("%w: %v", err, rerr)
}
err = rerr
}
}()
var (
changes []schema.Change
opts = &schema.InspectRealmOption{
Schemas: make([]string, 0, len(r.Schemas)),
}
)
for _, s := range r.Schemas {
opts.Schemas = append(opts.Schemas, s.Name)
changes = append(changes, &schema.AddSchema{
S: s,
Extra: []schema.Clause{
&schema.IfNotExists{},
},
})
for _, t := range s.Tables {
changes = append(changes, &schema.AddTable{
T: t,
})
}
for _, v := range s.Views {
changes = append(changes, &schema.AddView{V: v})
}
for _, o := range s.Objects {
changes = append(changes, &schema.AddObject{O: o})
}
}
if err := d.Driver.ApplyChanges(ctx, changes); err != nil {
return nil, err
}
nr, err = d.Driver.InspectRealm(ctx, opts)
return
}
// NormalizeSchema returns the normal representation of the given database. See NormalizeRealm for more info.
func (d *DevDriver) NormalizeSchema(ctx context.Context, s *schema.Schema) (*schema.Schema, error) {
if err := d.Driver.CheckClean(ctx, nil); err != nil {
return nil, err
}
restore, err := d.Driver.Snapshot(ctx)
if err != nil {
return nil, err
}
defer func() {
if rerr := restore(ctx); rerr != nil {
if err != nil {
rerr = fmt.Errorf("%w: %v", err, rerr)
}
err = rerr
}
}()
dev, err := d.Driver.InspectSchema(ctx, "", &schema.InspectOptions{
Mode: schema.InspectSchemas,
})
if err != nil {
return nil, err
}
// Modify dev-schema attributes if needed.
changes, err := d.Driver.SchemaDiff(
schema.New(dev.Name).AddAttrs(dev.Attrs...),
schema.New(dev.Name).AddAttrs(s.Attrs...),
)
if err != nil {
return nil, err
}
prevName := s.Name
s.Name = dev.Name
for _, t := range s.Tables {
// If objects are not strongly connected.
if t.Schema != s {
t.Schema = s
}
for _, c := range t.Columns {
if e, ok := c.Type.Type.(*schema.EnumType); ok && e.Schema != s {
e.Schema = s
}
}
changes = append(changes, &schema.AddTable{T: t})
}
for _, v := range s.Views {
// If objects are not strongly connected.
if v.Schema != s {
v.Schema = s
}
changes = append(changes, &schema.AddView{V: v})
}
for _, o := range s.Objects {
if d.PatchObject != nil {
d.PatchObject(s, o)
}
changes = append(changes, &schema.AddObject{O: o})
}
if err := d.Driver.ApplyChanges(ctx, changes, func(opts *migrate.PlanOptions) {
noQualifier := ""
opts.SchemaQualifier = &noQualifier
opts.Mode = migrate.PlanModeInPlace
}); err != nil {
return nil, err
}
ns, err := d.Driver.InspectSchema(ctx, "", nil)
if err != nil {
return nil, err
}
// Preserve the original schema name and attributes.
ns.Name = prevName
for _, a := range s.Attrs {
schema.ReplaceOrAppend(&ns.Attrs, a)
}
return ns, err
}
This diff is collapsed.
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
package sqlx
import (
"encoding/csv"
"fmt"
"path/filepath"
"regexp"
"strings"
"ariga.io/atlas/sql/schema"
)
// ExcludeRealm filters resources in the realm based on the given patterns.
func ExcludeRealm(r *schema.Realm, patterns []string) (*schema.Realm, error) {
if len(patterns) == 0 {
return r, nil
}
var schemas []*schema.Schema
globs, err := split(patterns)
if err != nil {
return nil, err
}
Filter:
for _, s := range r.Schemas {
for i, g := range globs {
if len(g) > 3 {
return nil, fmt.Errorf("too many parts in pattern: %q", patterns[i])
}
match, err := filepath.Match(g[0], s.Name)
if err != nil {
return nil, err
}
if match {
// In case there is a match, and it is
// a single glob we exclude this schema.
if len(g) == 1 {
continue Filter
}
if err := excludeS(s, g[1:]); err != nil {
return nil, err
}
}
}
schemas = append(schemas, s)
}
r.Schemas = schemas
return r, nil
}
// ExcludeSchema filters resources in the schema based on the given patterns.
func ExcludeSchema(s *schema.Schema, patterns []string) (*schema.Schema, error) {
if len(patterns) == 0 {
return s, nil
}
if s.Realm == nil {
return nil, fmt.Errorf("missing realm for schema %q", s.Name)
}
for i, p := range patterns {
patterns[i] = fmt.Sprintf("%s.%s", s.Name, p)
}
if _, err := ExcludeRealm(s.Realm, patterns); err != nil {
return nil, err
}
return s, nil
}
// split parses the list of patterns into chain of resource-globs.
// For example, 's*.t.*' is split to ['s*', 't', *].
func split(patterns []string) ([][]string, error) {
globs := make([][]string, len(patterns))
for i, p := range patterns {
r := csv.NewReader(strings.NewReader(p))
r.Comma = '.'
switch parts, err := r.ReadAll(); {
case err != nil:
return nil, err
case len(parts) != 1:
return nil, fmt.Errorf("unexpected pattern: %q", p)
case len(parts[0]) == 0:
return nil, fmt.Errorf("empty pattern: %q", p)
default:
globs[i] = parts[0]
}
}
return globs, nil
}
func excludeS(s *schema.Schema, glob []string) error {
if globT, exclude := excludeType(typeT, glob[0]); exclude {
var tables []*schema.Table
for _, t := range s.Tables {
match, err := filepath.Match(globT, t.Name)
if err != nil {
return err
}
if match {
// In case there is a match, and it is
// a single glob we exclude this table.
if len(glob) == 1 {
continue
}
if err := excludeT(t, glob[1]); err != nil {
return err
}
}
// No match or glob has more than one pattern.
tables = append(tables, t)
}
s.Tables = tables
}
if globV, exclude := excludeType(typeV, glob[0]); exclude {
var views []*schema.View
for _, v := range s.Views {
match, err := filepath.Match(globV, v.Name)
if err != nil {
return err
}
if match {
if len(glob) == 1 {
continue
}
if err := excludeV(v, glob[1]); err != nil {
return err
}
}
views = append(views, v)
}
s.Views = views
}
return nil
}
func excludeT(t *schema.Table, pattern string) (err error) {
ex := make(map[*schema.Index]struct{})
ef := make(map[*schema.ForeignKey]struct{})
if p, exclude := excludeType(typeC, pattern); exclude {
t.Columns, err = filter(t.Columns, func(c *schema.Column) (bool, error) {
match, err := filepath.Match(p, c.Name)
if !match || err != nil {
return false, err
}
for _, idx := range c.Indexes {
ex[idx] = struct{}{}
}
for _, fk := range c.ForeignKeys {
ef[fk] = struct{}{}
}
return true, nil
})
}
if p, exclude := excludeType(typeI, pattern); exclude {
t.Indexes, err = filter(t.Indexes, func(idx *schema.Index) (bool, error) {
if _, ok := ex[idx]; ok {
return true, nil
}
return filepath.Match(p, idx.Name)
})
}
if p, exclude := excludeType(typeF, pattern); exclude {
t.ForeignKeys, err = filter(t.ForeignKeys, func(fk *schema.ForeignKey) (bool, error) {
if _, ok := ef[fk]; ok {
return true, nil
}
return filepath.Match(p, fk.Symbol)
})
}
if p, exclude := excludeType(typeK, pattern); exclude {
t.Attrs, err = filter(t.Attrs, func(a schema.Attr) (bool, error) {
c, ok := a.(*schema.Check)
if !ok {
return false, nil
}
match, err := filepath.Match(p, c.Name)
if !match || err != nil {
return false, err
}
return true, nil
})
}
return
}
func excludeV(t *schema.View, pattern string) (err error) {
if p, exclude := excludeType(typeC, pattern); exclude {
t.Columns, err = filter(t.Columns, func(c *schema.Column) (bool, error) {
match, err := filepath.Match(p, c.Name)
if !match || err != nil {
return false, err
}
return true, nil
})
}
return
}
const (
typeV = "view"
typeT = "table"
typeC = "column"
typeI = "index"
typeF = "fk"
typeK = "check"
)
var reTypeVT = regexp.MustCompile(`\[type=([a-z|]+)+\]$`)
func excludeType(t, v string) (string, bool) {
matches := reTypeVT.FindStringSubmatch(v)
if len(matches) != 2 {
return v, true
}
v = strings.TrimSuffix(v, matches[0])
for _, m := range strings.Split(matches[1], "|") {
if m == t {
// Selector matches.
return v, true
}
}
// There is a selector with no match.
return v, false
}
func filter[T any](s []T, f func(T) (bool, error)) ([]T, error) {
r := make([]T, 0, len(s))
for i := range s {
match, err := f(s[i])
if err != nil {
return nil, err
}
if !match {
r = append(r, s[i])
}
}
return r, nil
}
This diff is collapsed.
This diff is collapsed.
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
//go:build !ent
package sqlx
import (
"ariga.io/atlas/sql/schema"
)
// PlanViewChanges (should) plan view changes in the current order they should be applied.
// It is unimplemented for community version as views are not supported there.
func PlanViewChanges(changes []schema.Change) ([]schema.Change, error) {
return changes, nil // unimplemented.
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
h1:M74RrNK69S2pj6C541LR1ew5O32/i0WoyNgsJmyuiUk=
1_initial.down.sql h1:0zypK43rgPbgvVUgVJABGN25VgM1QSeU+LJDBb8cEQI=
1_initial.up.sql h1:hFhs5XhRml4KTWGF5td6h1s7xNqAFnaEBbC5Y/NF7i4=
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Copyright 2021-present The Atlas Authors. All rights reserved.
// This source code is licensed under the Apache 2.0 license found
// in the LICENSE file in the root directory of this source tree.
//go:build !ent
package mysql
import (
"context"
"ariga.io/atlas/schemahcl"
"ariga.io/atlas/sql/schema"
)
var specOptions []schemahcl.Option
func (*inspect) inspectViews(context.Context, *schema.Realm, *schema.InspectOptions) error {
return nil // unimplemented.
}
func (*state) addView(*schema.AddView) error {
return nil // unimplemented.
}
func (*state) dropView(*schema.DropView) error {
return nil // unimplemented.
}
func (*state) modifyView(*schema.ModifyView) error {
return nil // unimplemented.
}
func (*state) renameView(*schema.RenameView) {
// unimplemented.
}
func (d *diff) ViewAttrChanged(_, _ *schema.View) bool {
return false // Not implemented.
}
This diff is collapsed.
{"gbk": "gbk_chinese_ci", "hp8": "hp8_english_ci", "big5": "big5_chinese_ci", "dec8": "dec8_swedish_ci", "sjis": "sjis_japanese_ci", "swe7": "swe7_swedish_ci", "ucs2": "ucs2_general_ci", "ujis": "ujis_japanese_ci", "ascii": "ascii_general_ci", "cp850": "cp850_general_ci", "cp852": "cp852_general_ci", "cp866": "cp866_general_ci", "cp932": "cp932_japanese_ci", "euckr": "euckr_korean_ci", "greek": "greek_general_ci", "koi8r": "koi8r_general_ci", "koi8u": "koi8u_general_ci", "macce": "macce_general_ci", "utf16": "utf16_general_ci", "utf32": "utf32_general_ci", "binary": "binary", "cp1250": "cp1250_general_ci", "cp1251": "cp1251_general_ci", "cp1256": "cp1256_general_ci", "cp1257": "cp1257_general_ci", "gb2312": "gb2312_chinese_ci", "hebrew": "hebrew_general_ci", "latin1": "latin1_swedish_ci", "latin2": "latin2_general_ci", "latin5": "latin5_turkish_ci", "latin7": "latin7_general_ci", "tis620": "tis620_thai_ci", "eucjpms": "eucjpms_japanese_ci", "gb18030": "gb18030_chinese_ci", "geostd8": "geostd8_general_ci", "keybcs2": "keybcs2_general_ci", "utf16le": "utf16le_general_ci", "utf8mb3": "utf8mb3_general_ci", "utf8mb4": "utf8mb4_0900_ai_ci", "armscii8": "armscii8_general_ci", "macroman": "macroman_general_ci","utf8": "utf8_general_ci"}
\ No newline at end of file
{"big5":"big5_chinese_ci", "dec8":"dec8_swedish_ci", "cp850":"cp850_general_ci", "hp8":"hp8_english_ci", "koi8r":"koi8r_general_ci", "latin1":"latin1_swedish_ci", "latin2":"latin2_general_ci", "swe7":"swe7_swedish_ci", "ascii":"ascii_general_ci", "ujis":"ujis_japanese_ci", "sjis":"sjis_japanese_ci", "hebrew":"hebrew_general_ci", "tis620":"tis620_thai_ci", "euckr":"euckr_korean_ci", "koi8u":"koi8u_general_ci", "gb2312":"gb2312_chinese_ci", "greek":"greek_general_ci", "cp1250":"cp1250_general_ci", "gbk":"gbk_chinese_ci", "latin5":"latin5_turkish_ci", "armscii8":"armscii8_general_ci", "utf8mb3":"utf8mb3_general_ci", "ucs2":"ucs2_general_ci", "cp866":"cp866_general_ci", "keybcs2":"keybcs2_general_ci", "macce":"macce_general_ci", "macroman":"macroman_general_ci", "cp852":"cp852_general_ci", "latin7":"latin7_general_ci", "utf8mb4":"utf8mb4_general_ci", "cp1251":"cp1251_general_ci", "utf16":"utf16_general_ci", "utf16le":"utf16le_general_ci", "cp1256":"cp1256_general_ci", "cp1257":"cp1257_general_ci", "utf32":"utf32_general_ci", "binary":"binary", "geostd8":"geostd8_general_ci", "cp932":"cp932_japanese_ci", "eucjpms":"eucjpms_japanese_ci"}
\ No newline at end of file
{"binary": "binary", "gbk_bin": "gbk", "hp8_bin": "hp8", "big5_bin": "big5", "dec8_bin": "dec8", "sjis_bin": "sjis", "swe7_bin": "swe7", "ucs2_bin": "ucs2", "ujis_bin": "ujis", "ascii_bin": "ascii", "cp850_bin": "cp850", "cp852_bin": "cp852", "cp866_bin": "cp866", "cp932_bin": "cp932", "euckr_bin": "euckr", "greek_bin": "greek", "koi8r_bin": "koi8r", "koi8u_bin": "koi8u", "macce_bin": "macce", "utf16_bin": "utf16", "utf32_bin": "utf32", "cp1250_bin": "cp1250", "cp1251_bin": "cp1251", "cp1256_bin": "cp1256", "cp1257_bin": "cp1257", "gb2312_bin": "gb2312", "hebrew_bin": "hebrew", "latin1_bin": "latin1", "latin2_bin": "latin2", "latin5_bin": "latin5", "latin7_bin": "latin7", "tis620_bin": "tis620", "eucjpms_bin": "eucjpms", "gb18030_bin": "gb18030", "geostd8_bin": "geostd8", "keybcs2_bin": "keybcs2", "utf16le_bin": "utf16le", "utf8mb3_bin": "utf8mb3", "utf8mb4_bin": "utf8mb4", "armscii8_bin": "armscii8", "macroman_bin": "macroman", "ucs2_czech_ci": "ucs2", "ucs2_roman_ci": "ucs2", "gbk_chinese_ci": "gbk", "hp8_english_ci": "hp8", "tis620_thai_ci": "tis620", "ucs2_danish_ci": "ucs2", "ucs2_polish_ci": "ucs2", "ucs2_slovak_ci": "ucs2", "utf16_czech_ci": "utf16", "utf16_roman_ci": "utf16", "utf32_czech_ci": "utf32", "utf32_roman_ci": "utf32", "big5_chinese_ci": "big5", "cp1250_czech_cs": "cp1250", "dec8_swedish_ci": "dec8", "euckr_korean_ci": "euckr", "latin2_czech_cs": "latin2", "swe7_swedish_ci": "swe7", "ucs2_general_ci": "ucs2", "ucs2_german2_ci": "ucs2", "ucs2_latvian_ci": "ucs2", "ucs2_persian_ci": "ucs2", "ucs2_sinhala_ci": "ucs2", "ucs2_spanish_ci": "ucs2", "ucs2_swedish_ci": "ucs2", "ucs2_turkish_ci": "ucs2", "ucs2_unicode_ci": "ucs2", "utf16_danish_ci": "utf16", "utf16_polish_ci": "utf16", "utf16_slovak_ci": "utf16", "utf32_danish_ci": "utf32", "utf32_polish_ci": "utf32", "utf32_slovak_ci": "utf32", "ascii_general_ci": "ascii", "cp1250_polish_ci": "cp1250", "cp850_general_ci": "cp850", "cp852_general_ci": "cp852", "cp866_general_ci": "cp866", "greek_general_ci": "greek", "koi8r_general_ci": "koi8r", "koi8u_general_ci": "koi8u", "latin1_danish_ci": "latin1", "macce_general_ci": "macce", "sjis_japanese_ci": "sjis", "ucs2_croatian_ci": "ucs2", "ucs2_estonian_ci": "ucs2", "ucs2_romanian_ci": "ucs2", "ucs2_spanish2_ci": "ucs2", "ujis_japanese_ci": "ujis", "utf16_general_ci": "utf16", "utf16_german2_ci": "utf16", "utf16_latvian_ci": "utf16", "utf16_persian_ci": "utf16", "utf16_sinhala_ci": "utf16", "utf16_spanish_ci": "utf16", "utf16_swedish_ci": "utf16", "utf16_turkish_ci": "utf16", "utf16_unicode_ci": "utf16", "utf32_general_ci": "utf32", "utf32_german2_ci": "utf32", "utf32_latvian_ci": "utf32", "utf32_persian_ci": "utf32", "utf32_sinhala_ci": "utf32", "utf32_spanish_ci": "utf32", "utf32_swedish_ci": "utf32", "utf32_turkish_ci": "utf32", "utf32_unicode_ci": "utf32", "utf8mb3_czech_ci": "utf8mb3", "utf8mb3_roman_ci": "utf8mb3", "utf8mb4_0900_bin": "utf8mb4", "utf8mb4_czech_ci": "utf8mb4", "utf8mb4_roman_ci": "utf8mb4", "cp1250_general_ci": "cp1250", "cp1251_general_ci": "cp1251", "cp1251_general_cs": "cp1251", "cp1256_general_ci": "cp1256", "cp1257_general_ci": "cp1257", "cp932_japanese_ci": "cp932", "gb2312_chinese_ci": "gb2312", "hebrew_general_ci": "hebrew", "latin1_general_ci": "latin1", "latin1_general_cs": "latin1", "latin1_german1_ci": "latin1", "latin1_german2_ci": "latin1", "latin1_spanish_ci": "latin1", "latin1_swedish_ci": "latin1", "latin2_general_ci": "latin2", "latin5_turkish_ci": "latin5", "latin7_general_ci": "latin7", "latin7_general_cs": "latin7", "ucs2_esperanto_ci": "ucs2", "ucs2_hungarian_ci": "ucs2", "ucs2_icelandic_ci": "ucs2", "ucs2_slovenian_ci": "ucs2", "utf16_croatian_ci": "utf16", "utf16_estonian_ci": "utf16", "utf16_romanian_ci": "utf16", "utf16_spanish2_ci": "utf16", "utf32_croatian_ci": "utf32", "utf32_estonian_ci": "utf32", "utf32_romanian_ci": "utf32", "utf32_spanish2_ci": "utf32", "utf8mb3_danish_ci": "utf8mb3", "utf8mb3_polish_ci": "utf8mb3", "utf8mb3_slovak_ci": "utf8mb3", "utf8mb4_danish_ci": "utf8mb4", "utf8mb4_polish_ci": "utf8mb4", "utf8mb4_slovak_ci": "utf8mb4", "cp1250_croatian_ci": "cp1250", "gb18030_chinese_ci": "gb18030", "geostd8_general_ci": "geostd8", "keybcs2_general_ci": "keybcs2", "latin2_croatian_ci": "latin2", "latin7_estonian_cs": "latin7", "ucs2_lithuanian_ci": "ucs2", "ucs2_vietnamese_ci": "ucs2", "utf16_esperanto_ci": "utf16", "utf16_hungarian_ci": "utf16", "utf16_icelandic_ci": "utf16", "utf16_slovenian_ci": "utf16", "utf16le_general_ci": "utf16le", "utf32_esperanto_ci": "utf32", "utf32_hungarian_ci": "utf32", "utf32_icelandic_ci": "utf32", "utf32_slovenian_ci": "utf32", "utf8mb3_general_ci": "utf8mb3", "utf8mb3_german2_ci": "utf8mb3", "utf8mb3_latvian_ci": "utf8mb3", "utf8mb3_persian_ci": "utf8mb3", "utf8mb3_sinhala_ci": "utf8mb3", "utf8mb3_spanish_ci": "utf8mb3", "utf8mb3_swedish_ci": "utf8mb3", "utf8mb3_tolower_ci": "utf8mb3", "utf8mb3_turkish_ci": "utf8mb3", "utf8mb3_unicode_ci": "utf8mb3", "utf8mb4_0900_ai_ci": "utf8mb4", "utf8mb4_0900_as_ci": "utf8mb4", "utf8mb4_0900_as_cs": "utf8mb4", "utf8mb4_general_ci": "utf8mb4", "utf8mb4_german2_ci": "utf8mb4", "utf8mb4_latvian_ci": "utf8mb4", "utf8mb4_persian_ci": "utf8mb4", "utf8mb4_sinhala_ci": "utf8mb4", "utf8mb4_spanish_ci": "utf8mb4", "utf8mb4_swedish_ci": "utf8mb4", "utf8mb4_turkish_ci": "utf8mb4", "utf8mb4_unicode_ci": "utf8mb4", "armscii8_general_ci": "armscii8", "cp1251_bulgarian_ci": "cp1251", "cp1251_ukrainian_ci": "cp1251", "eucjpms_japanese_ci": "eucjpms", "latin2_hungarian_ci": "latin2", "macroman_general_ci": "macroman", "ucs2_unicode_520_ci": "ucs2", "utf16_lithuanian_ci": "utf16", "utf16_vietnamese_ci": "utf16", "utf32_lithuanian_ci": "utf32", "utf32_vietnamese_ci": "utf32", "utf8mb3_croatian_ci": "utf8mb3", "utf8mb3_estonian_ci": "utf8mb3", "utf8mb3_romanian_ci": "utf8mb3", "utf8mb3_spanish2_ci": "utf8mb3", "utf8mb4_croatian_ci": "utf8mb4", "utf8mb4_estonian_ci": "utf8mb4", "utf8mb4_romanian_ci": "utf8mb4", "utf8mb4_spanish2_ci": "utf8mb4", "cp1257_lithuanian_ci": "cp1257", "utf16_unicode_520_ci": "utf16", "utf32_unicode_520_ci": "utf32", "utf8mb3_esperanto_ci": "utf8mb3", "utf8mb3_hungarian_ci": "utf8mb3", "utf8mb3_icelandic_ci": "utf8mb3", "utf8mb3_slovenian_ci": "utf8mb3", "utf8mb4_esperanto_ci": "utf8mb4", "utf8mb4_hungarian_ci": "utf8mb4", "utf8mb4_icelandic_ci": "utf8mb4", "utf8mb4_slovenian_ci": "utf8mb4", "utf8mb3_lithuanian_ci": "utf8mb3", "utf8mb3_vietnamese_ci": "utf8mb3", "utf8mb4_bg_0900_ai_ci": "utf8mb4", "utf8mb4_bg_0900_as_cs": "utf8mb4", "utf8mb4_bs_0900_ai_ci": "utf8mb4", "utf8mb4_bs_0900_as_cs": "utf8mb4", "utf8mb4_cs_0900_ai_ci": "utf8mb4", "utf8mb4_cs_0900_as_cs": "utf8mb4", "utf8mb4_da_0900_ai_ci": "utf8mb4", "utf8mb4_da_0900_as_cs": "utf8mb4", "utf8mb4_eo_0900_ai_ci": "utf8mb4", "utf8mb4_eo_0900_as_cs": "utf8mb4", "utf8mb4_es_0900_ai_ci": "utf8mb4", "utf8mb4_es_0900_as_cs": "utf8mb4", "utf8mb4_et_0900_ai_ci": "utf8mb4", "utf8mb4_et_0900_as_cs": "utf8mb4", "utf8mb4_gl_0900_ai_ci": "utf8mb4", "utf8mb4_gl_0900_as_cs": "utf8mb4", "utf8mb4_hr_0900_ai_ci": "utf8mb4", "utf8mb4_hr_0900_as_cs": "utf8mb4", "utf8mb4_hu_0900_ai_ci": "utf8mb4", "utf8mb4_hu_0900_as_cs": "utf8mb4", "utf8mb4_is_0900_ai_ci": "utf8mb4", "utf8mb4_is_0900_as_cs": "utf8mb4", "utf8mb4_ja_0900_as_cs": "utf8mb4", "utf8mb4_la_0900_ai_ci": "utf8mb4", "utf8mb4_la_0900_as_cs": "utf8mb4", "utf8mb4_lithuanian_ci": "utf8mb4", "utf8mb4_lt_0900_ai_ci": "utf8mb4", "utf8mb4_lt_0900_as_cs": "utf8mb4", "utf8mb4_lv_0900_ai_ci": "utf8mb4", "utf8mb4_lv_0900_as_cs": "utf8mb4", "utf8mb4_nb_0900_ai_ci": "utf8mb4", "utf8mb4_nb_0900_as_cs": "utf8mb4", "utf8mb4_nn_0900_ai_ci": "utf8mb4", "utf8mb4_nn_0900_as_cs": "utf8mb4", "utf8mb4_pl_0900_ai_ci": "utf8mb4", "utf8mb4_pl_0900_as_cs": "utf8mb4", "utf8mb4_ro_0900_ai_ci": "utf8mb4", "utf8mb4_ro_0900_as_cs": "utf8mb4", "utf8mb4_ru_0900_ai_ci": "utf8mb4", "utf8mb4_ru_0900_as_cs": "utf8mb4", "utf8mb4_sk_0900_ai_ci": "utf8mb4", "utf8mb4_sk_0900_as_cs": "utf8mb4", "utf8mb4_sl_0900_ai_ci": "utf8mb4", "utf8mb4_sl_0900_as_cs": "utf8mb4", "utf8mb4_sv_0900_ai_ci": "utf8mb4", "utf8mb4_sv_0900_as_cs": "utf8mb4", "utf8mb4_tr_0900_ai_ci": "utf8mb4", "utf8mb4_tr_0900_as_cs": "utf8mb4", "utf8mb4_vi_0900_ai_ci": "utf8mb4", "utf8mb4_vi_0900_as_cs": "utf8mb4", "utf8mb4_vietnamese_ci": "utf8mb4", "utf8mb4_zh_0900_as_cs": "utf8mb4", "gb18030_unicode_520_ci": "gb18030", "utf8mb3_unicode_520_ci": "utf8mb3", "utf8mb4_unicode_520_ci": "utf8mb4", "ucs2_general_mysql500_ci": "ucs2", "utf8mb4_de_pb_0900_ai_ci": "utf8mb4", "utf8mb4_de_pb_0900_as_cs": "utf8mb4", "utf8mb4_ja_0900_as_cs_ks": "utf8mb4", "utf8mb4_es_trad_0900_ai_ci": "utf8mb4", "utf8mb4_es_trad_0900_as_cs": "utf8mb4", "utf8mb4_mn_cyrl_0900_ai_ci": "utf8mb4", "utf8mb4_mn_cyrl_0900_as_cs": "utf8mb4", "utf8mb4_sr_latn_0900_ai_ci": "utf8mb4", "utf8mb4_sr_latn_0900_as_cs": "utf8mb4", "utf8mb3_general_mysql500_ci": "utf8mb3", "utf8_bin": "utf8", "utf8_croatian_ci": "utf8", "utf8_czech_ci": "utf8", "utf8_danish_ci": "utf8", "utf8_esperanto_ci": "utf8", "utf8_estonian_ci": "utf8", "utf8_general_ci": "utf8", "utf8_general_mysql500_ci": "utf8", "utf8_german2_ci": "utf8", "utf8_hungarian_ci": "utf8", "utf8_icelandic_ci": "utf8", "utf8_latvian_ci": "utf8", "utf8_lithuanian_ci": "utf8", "utf8_persian_ci": "utf8", "utf8_polish_ci": "utf8", "utf8_roman_ci": "utf8", "utf8_romanian_ci": "utf8", "utf8_sinhala_ci": "utf8", "utf8_slovak_ci": "utf8", "utf8_slovenian_ci": "utf8", "utf8_spanish_ci": "utf8", "utf8_spanish2_ci": "utf8", "utf8_swedish_ci": "utf8", "utf8_tolower_ci": "utf8", "utf8_turkish_ci": "utf8", "utf8_unicode_520_ci": "utf8", "utf8_unicode_ci": "utf8", "utf8_vietnamese_ci": "utf8"}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment