mirror of
https://github.com/hkmadao/rtsp2rtmp.git
synced 2025-09-26 19:31:19 +08:00
模板代码改造
This commit is contained in:
@@ -82,7 +82,7 @@ func (rfw *RtmpFlvWriter) createConn() error {
|
||||
logs.Error("not found camera : %s", rfw.code)
|
||||
return err
|
||||
}
|
||||
rtmpConn, err := rtmp.Dial(camera.RtmpURL)
|
||||
rtmpConn, err := rtmp.Dial(camera.RtmpUrl)
|
||||
if err != nil {
|
||||
logs.Error("rtmp client connection error : %v", err)
|
||||
return err
|
||||
|
@@ -128,9 +128,9 @@ func (s *RtspClientManager) connRtsp(code string) {
|
||||
logs.Error("camera [%s] disabled : %v", code)
|
||||
return
|
||||
}
|
||||
logs.Info(c.Code, "connect", c.RtspURL)
|
||||
logs.Info(c.Code, "connect", c.RtspUrl)
|
||||
rtspClientOptions := rtspv2.RTSPClientOptions{
|
||||
URL: c.RtspURL,
|
||||
URL: c.RtspUrl,
|
||||
Debug: false,
|
||||
DialTimeout: 10 * time.Second,
|
||||
ReadWriteTimeout: 10 * time.Second,
|
||||
|
48
src/rtsp2rtmp/web/common/aq.go
Normal file
48
src/rtsp2rtmp/web/common/aq.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package common
|
||||
|
||||
type AqPageInfoInput struct {
|
||||
/// 当前页码
|
||||
PageIndex uint64 `json:"pageIndex"`
|
||||
/// 分页大小
|
||||
PageSize uint64 `json:"pageSize"`
|
||||
/// 总记录数
|
||||
TotalCount uint64 `json:"totalCount"`
|
||||
/// 查询条件
|
||||
LogicNode *AqLogicNode `json:"logicNode"`
|
||||
/// 排序设置
|
||||
Orders []AqOrder `json:"orders"`
|
||||
}
|
||||
|
||||
type AqCondition struct {
|
||||
// 查询条件
|
||||
LogicNode *AqLogicNode `json:"logicNode"`
|
||||
// 分页信息
|
||||
Orders []AqOrder `json:"orders"`
|
||||
}
|
||||
|
||||
type AqLogicNode struct {
|
||||
// 逻辑操作编码
|
||||
LogicOperatorCode ELogicOperatorCode `json:"logicOperatorCode"`
|
||||
//子节点
|
||||
LogicNode *AqLogicNode `json:"logicNode"`
|
||||
//查询条件集合
|
||||
FilterNodes []AqFilterNode `json:"filterNodes"`
|
||||
}
|
||||
|
||||
type AqOrder struct {
|
||||
// 排序方向
|
||||
Direction EOrderDirection `json:"direction"`
|
||||
// 排序属性
|
||||
Property string `json:"property"`
|
||||
// 是否忽略
|
||||
IgnoreCase bool `json:"ignoreCase"`
|
||||
}
|
||||
|
||||
type AqFilterNode struct {
|
||||
// 查询条件名称
|
||||
Name string `json:"name"`
|
||||
// 比较操作符编码
|
||||
OperatorCode EOperatorCode `json:"operatorCode"`
|
||||
// 查询参数
|
||||
FilterParams []interface{} `json:"filterParams"`
|
||||
}
|
44
src/rtsp2rtmp/web/common/aq_const.go
Normal file
44
src/rtsp2rtmp/web/common/aq_const.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package common
|
||||
|
||||
type EDoStatus = uint32
|
||||
|
||||
// do_status const
|
||||
const (
|
||||
DO_UNCHANGE = 1
|
||||
DO_UPDATE = 2
|
||||
DO_NEW = 3
|
||||
DO_DELETE = 4
|
||||
)
|
||||
|
||||
type ELogicOperatorCode = string
|
||||
|
||||
// logic operator code const
|
||||
const (
|
||||
LOGIC_OPERATOR_CODE_AND = "and"
|
||||
LOGIC_OPERATOR_CODE_OR = "or"
|
||||
)
|
||||
|
||||
type EOperatorCode = string
|
||||
|
||||
// operator code const
|
||||
const (
|
||||
OPERATOR_CODE_EQUAL = "equal"
|
||||
OPERATOR_CODE_NOT_EQUAL = "notEqual"
|
||||
OPERATOR_CODE_IN = "in"
|
||||
OPERATOR_CODE_NOT_IN = "notIn"
|
||||
OPERATOR_CODE_LT = "lt"
|
||||
OPERATOR_CODE_LTE = "lte"
|
||||
OPERATOR_CODE_GT = "gt"
|
||||
OPERATOR_CODE_GTE = "gte"
|
||||
OPERATOR_CODE_LIKE = "like"
|
||||
OPERATOR_CODE_LEFT_LIKE = "leftLike"
|
||||
OPERATOR_CODE_RIGHT_LIKE = "rightLike"
|
||||
)
|
||||
|
||||
type EOrderDirection = string
|
||||
|
||||
// order direction const
|
||||
const (
|
||||
ORDER_DIRECTION_ASC = "ASC"
|
||||
ORDER_DIRECTION_DESC = "DESC"
|
||||
)
|
92
src/rtsp2rtmp/web/common/desc.go
Normal file
92
src/rtsp2rtmp/web/common/desc.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package common
|
||||
|
||||
type EValueType = string
|
||||
|
||||
const (
|
||||
// 字符串
|
||||
VALUE_TYPE_STRING = "string"
|
||||
// 数值
|
||||
VALUE_TYPE_NUMBER = "number"
|
||||
// 布尔
|
||||
VALUE_TYPE_BOOL = "bool"
|
||||
)
|
||||
|
||||
type EDataType = string
|
||||
|
||||
const (
|
||||
// 主键
|
||||
DATA_TYPE_INTERNAL_PK = "InternalPK"
|
||||
// 外键
|
||||
DATA_TYPE_INTERNAL_FK = "InternalFK"
|
||||
// 1对多关系 子实体的引用属性
|
||||
DATA_TYPE_REF = "InternalRef"
|
||||
// 1对1关系 子实体的引用属性
|
||||
DATA_TYPE_SINGLE_REF = "InternalSingleRef"
|
||||
// 1对1关系 主实体的子属性
|
||||
DATA_TYPE_SINGLE = "InternalSingle"
|
||||
// 1对多关系 主实体的子属性
|
||||
DATA_TYPE_ARRAY = "InternalArray"
|
||||
// agg 外键
|
||||
DATA_TYPE_AGG_FK = "InternalAggFK"
|
||||
// 1对多关系 子实体的引用属性
|
||||
DATA_TYPE_AGG_REF = "InternalAggRef"
|
||||
// agg 1对1关系 子实体的引用属性
|
||||
DATA_TYPE_AGG_SINGLE_REF = "InternalAggSingleRef"
|
||||
// agg 1对1关系 主实体的子属性
|
||||
DATA_TYPE_AGG_SINGLE = "InternalAggSingle"
|
||||
// agg 1对多关系 主实体的子属性
|
||||
DATA_TYPE_AGG_ARRAY = "InternalAggArray"
|
||||
)
|
||||
|
||||
type EntityInfo struct {
|
||||
// 实体名称
|
||||
Name string
|
||||
// 实体显示名称
|
||||
DisplayName string
|
||||
// 类名
|
||||
ClassName string
|
||||
// 表名
|
||||
TableName string
|
||||
// 服务路径
|
||||
BasePath string
|
||||
}
|
||||
|
||||
type AttributeInfo struct {
|
||||
// 属性名称
|
||||
Name string
|
||||
// 属性显示名称
|
||||
DisplayName string
|
||||
// 数据库字段名
|
||||
ColumnName string
|
||||
// 值类型
|
||||
ValueType EValueType
|
||||
// 数据类型
|
||||
DataType EDataType
|
||||
// 关联的内部属性名称(外键属性,外键引用属性)
|
||||
InnerAttributeName string
|
||||
// 外部实体名
|
||||
OutEntityName string
|
||||
// 外部实体主属性名
|
||||
OutEntityPkAttributeName string
|
||||
// 外部实体引用本实体的属性名称
|
||||
OutEntityReversalAttributeName string
|
||||
// 外部实体引用本实体的外键属性名称
|
||||
OutEntityIdReversalAttributeName string
|
||||
}
|
||||
|
||||
type EntityDesc struct {
|
||||
// 实体信息
|
||||
EntityInfo EntityInfo
|
||||
// 属性信息
|
||||
AttributeInfoMap map[string]*AttributeInfo
|
||||
// 获取主键属性描述
|
||||
PkAttributeInfo *AttributeInfo
|
||||
// 获取不在同一个聚合根下的外键Id属性描述
|
||||
NormalFkIdAttributeInfos []*AttributeInfo
|
||||
// 获取不在同一个聚合根下的外键属性描述
|
||||
NormalFkAttributeInfos []*AttributeInfo
|
||||
// 获取不在同一个聚合根下子属性描述
|
||||
NormalChildren []*AttributeInfo
|
||||
// 1对1情况的子属性
|
||||
NormalOne2OneChildren []*AttributeInfo
|
||||
}
|
43
src/rtsp2rtmp/web/common/result.go
Normal file
43
src/rtsp2rtmp/web/common/result.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package common
|
||||
|
||||
type Page struct {
|
||||
Total int `json:"total"`
|
||||
Page interface{} `json:"page"`
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
Code int `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
type AppResult struct {
|
||||
Status uint32 `json:"status"`
|
||||
Message string `json:"message"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
type PageInfoInput struct {
|
||||
// 当前页码
|
||||
PageIndex uint64 `json:"pageIndex"`
|
||||
// 分页大小
|
||||
PageSize uint64 `json:"pageSize"`
|
||||
// 总记录数
|
||||
TotalCount uint64 `json:"totalCount"`
|
||||
}
|
||||
|
||||
type PageInfo struct {
|
||||
PageInfoInput PageInfoInput `json:"pageInfoInput"`
|
||||
DataList []interface{} `json:"dataList"`
|
||||
}
|
||||
|
||||
type DeleteRefErrorMessageVO struct {
|
||||
// 被引用id
|
||||
IdData string `json:"idData"`
|
||||
// 错误信息
|
||||
Message string `json:"Message"`
|
||||
// 被引用类名
|
||||
SourceClassName string `json:"sourceClassName"`
|
||||
// 引用类名
|
||||
RefClassName string `json:"refClassName"`
|
||||
}
|
@@ -8,14 +8,14 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/result"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
|
||||
)
|
||||
|
||||
func CameraList(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
cameras, err := service.CameraSelectAll()
|
||||
if err != nil {
|
||||
logs.Error("no camera found : %v", err)
|
||||
@@ -24,14 +24,14 @@ func CameraList(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, r)
|
||||
return
|
||||
}
|
||||
page := result.Page{Total: len(cameras), Page: cameras}
|
||||
page := common.Page{Total: len(cameras), Page: cameras}
|
||||
r.Data = page
|
||||
c.JSON(http.StatusOK, r)
|
||||
}
|
||||
|
||||
func CameraDetail(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
cameraId := c.Query("id")
|
||||
if cameraId == "" {
|
||||
logs.Error("no cameraId found")
|
||||
@@ -54,7 +54,7 @@ func CameraDetail(c *gin.Context) {
|
||||
|
||||
func CameraEdit(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{
|
||||
r := common.Result{
|
||||
Code: 1,
|
||||
Msg: "",
|
||||
}
|
||||
@@ -117,8 +117,8 @@ func CameraEdit(c *gin.Context) {
|
||||
}
|
||||
camera, _ := service.CameraSelectById(q.Id)
|
||||
camera.Code = q.Code
|
||||
camera.RtspURL = q.RtspURL
|
||||
camera.RtmpURL = q.RtmpURL
|
||||
camera.RtspUrl = q.RtspUrl
|
||||
camera.RtmpUrl = q.RtmpUrl
|
||||
// camera.Enabled = q.Enabled
|
||||
_, err = service.CameraUpdate(camera)
|
||||
if err != nil {
|
||||
@@ -133,7 +133,7 @@ func CameraEdit(c *gin.Context) {
|
||||
|
||||
func CameraDelete(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
id, b := c.Params.Get("id")
|
||||
if !b {
|
||||
r.Code = 0
|
||||
@@ -162,7 +162,7 @@ func CameraDelete(c *gin.Context) {
|
||||
|
||||
func CameraEnabled(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.Camera{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
@@ -206,7 +206,7 @@ func CameraEnabled(c *gin.Context) {
|
||||
|
||||
func RtmpPushChange(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.Camera{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
@@ -248,7 +248,7 @@ func RtmpPushChange(c *gin.Context) {
|
||||
|
||||
func CameraSaveVideoChange(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.Camera{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
@@ -290,7 +290,7 @@ func CameraSaveVideoChange(c *gin.Context) {
|
||||
|
||||
func CameraLiveChange(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.Camera{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
@@ -330,7 +330,7 @@ func CameraLiveChange(c *gin.Context) {
|
||||
|
||||
func CameraPlayAuthCodeReset(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.Camera{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
|
@@ -7,14 +7,14 @@ import (
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/result"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
|
||||
)
|
||||
|
||||
func CameraShareList(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
cameraId := c.Query("cameraId")
|
||||
if cameraId == "" {
|
||||
logs.Error("no cameraId found")
|
||||
@@ -31,14 +31,14 @@ func CameraShareList(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, r)
|
||||
return
|
||||
}
|
||||
page := result.Page{Total: len(cameraShares), Page: cameraShares}
|
||||
page := common.Page{Total: len(cameraShares), Page: cameraShares}
|
||||
r.Data = page
|
||||
c.JSON(http.StatusOK, r)
|
||||
}
|
||||
|
||||
func CameraShareEdit(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{
|
||||
r := common.Result{
|
||||
Code: 1,
|
||||
Msg: "",
|
||||
}
|
||||
@@ -96,7 +96,7 @@ func CameraShareEdit(c *gin.Context) {
|
||||
|
||||
func CameraShareDelete(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
id, b := c.Params.Get("id")
|
||||
if !b {
|
||||
r.Code = 0
|
||||
@@ -120,7 +120,7 @@ func CameraShareDelete(c *gin.Context) {
|
||||
|
||||
func CameraShareEnabled(c *gin.Context) {
|
||||
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
r := result.Result{Code: 1, Msg: ""}
|
||||
r := common.Result{Code: 1, Msg: ""}
|
||||
q := entity.CameraShare{}
|
||||
err := c.BindJSON(&q)
|
||||
if err != nil {
|
||||
|
@@ -9,8 +9,8 @@ import (
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/result"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service"
|
||||
)
|
||||
|
||||
@@ -31,7 +31,7 @@ func HttpFlvPlay(c *gin.Context) {
|
||||
method := uris[1]
|
||||
code := uris[2]
|
||||
authCode := uris[3]
|
||||
r := result.Result{
|
||||
r := common.Result{
|
||||
Code: 1,
|
||||
Msg: "",
|
||||
}
|
||||
|
129
src/rtsp2rtmp/web/dao/desc/camera_desc.go
Normal file
129
src/rtsp2rtmp/web/dao/desc/camera_desc.go
Normal file
@@ -0,0 +1,129 @@
|
||||
package desc
|
||||
|
||||
import (
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
)
|
||||
|
||||
func GetCameraDesc() *common.EntityDesc {
|
||||
var entityInfo = common.EntityInfo{
|
||||
Name: "Camera",
|
||||
DisplayName: "摄像头",
|
||||
ClassName: "Camera",
|
||||
TableName: "camera",
|
||||
BasePath: "entity::camera",
|
||||
}
|
||||
var idAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "id",
|
||||
Name: "id",
|
||||
DisplayName: "摄像头主属性",
|
||||
DataType: "InternalPK",
|
||||
ValueType: "string",
|
||||
}
|
||||
var codeAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "code",
|
||||
Name: "code",
|
||||
DisplayName: "code",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var rtspUrlAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "rtsp_url",
|
||||
Name: "rtspUrl",
|
||||
DisplayName: "rtsp地址",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var rtmpUrlAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "rtmp_url",
|
||||
Name: "rtmpUrl",
|
||||
DisplayName: "rtmp推送地址",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var playAuthCodeAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "play_auth_code",
|
||||
Name: "playAuthCode",
|
||||
DisplayName: "播放权限码",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var onlineStatusAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "online_status",
|
||||
Name: "onlineStatus",
|
||||
DisplayName: "在线状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var enabledAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "enabled",
|
||||
Name: "enabled",
|
||||
DisplayName: "启用状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var rtmpPushStatusAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "rtmp_push_status",
|
||||
Name: "rtmpPushStatus",
|
||||
DisplayName: "rtmp推送状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var saveVideoAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "save_video",
|
||||
Name: "saveVideo",
|
||||
DisplayName: "保存录像状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var liveAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "live",
|
||||
Name: "live",
|
||||
DisplayName: "直播状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var createdAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "created",
|
||||
Name: "created",
|
||||
DisplayName: "创建时间",
|
||||
DataType: "DateTime",
|
||||
ValueType: "string",
|
||||
}
|
||||
var cameraSharesAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "camera_shares",
|
||||
Name: "cameraShares",
|
||||
DisplayName: "摄像头分享",
|
||||
DataType: "InternalArray",
|
||||
ValueType: "",
|
||||
OutEntityName: "CameraShare",
|
||||
OutEntityPkAttributeName: "id",
|
||||
OutEntityReversalAttributeName: "camera",
|
||||
OutEntityIdReversalAttributeName: "cameraId",
|
||||
}
|
||||
var entityDesc = &common.EntityDesc{
|
||||
EntityInfo: entityInfo,
|
||||
PkAttributeInfo: idAttributeInfo,
|
||||
NormalFkIdAttributeInfos: []*common.AttributeInfo{},
|
||||
NormalFkAttributeInfos: []*common.AttributeInfo{},
|
||||
NormalChildren: []*common.AttributeInfo{
|
||||
cameraSharesAttributeInfo,
|
||||
},
|
||||
NormalOne2OneChildren: []*common.AttributeInfo{},
|
||||
AttributeInfoMap: map[string]*common.AttributeInfo{
|
||||
"id": idAttributeInfo,
|
||||
"code": codeAttributeInfo,
|
||||
"rtspUrl": rtspUrlAttributeInfo,
|
||||
"rtmpUrl": rtmpUrlAttributeInfo,
|
||||
"playAuthCode": playAuthCodeAttributeInfo,
|
||||
"onlineStatus": onlineStatusAttributeInfo,
|
||||
"enabled": enabledAttributeInfo,
|
||||
"rtmpPushStatus": rtmpPushStatusAttributeInfo,
|
||||
"saveVideo": saveVideoAttributeInfo,
|
||||
"live": liveAttributeInfo,
|
||||
"created": createdAttributeInfo,
|
||||
"cameraShares": cameraSharesAttributeInfo,
|
||||
},
|
||||
}
|
||||
|
||||
return entityDesc
|
||||
}
|
111
src/rtsp2rtmp/web/dao/desc/camerashare_desc.go
Normal file
111
src/rtsp2rtmp/web/dao/desc/camerashare_desc.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package desc
|
||||
|
||||
import (
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
)
|
||||
|
||||
func GetCameraShareDesc() *common.EntityDesc {
|
||||
var entityInfo = common.EntityInfo{
|
||||
Name: "CameraShare",
|
||||
DisplayName: "摄像头分享",
|
||||
ClassName: "CameraShare",
|
||||
TableName: "camera_share",
|
||||
BasePath: "entity::camera_share",
|
||||
}
|
||||
var idAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "id",
|
||||
Name: "id",
|
||||
DisplayName: "摄像头分享主属性",
|
||||
DataType: "InternalPK",
|
||||
ValueType: "string",
|
||||
}
|
||||
var nameAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "name",
|
||||
Name: "name",
|
||||
DisplayName: "名称",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var authCodeAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "auth_code",
|
||||
Name: "authCode",
|
||||
DisplayName: "权限码",
|
||||
DataType: "String",
|
||||
ValueType: "string",
|
||||
}
|
||||
var enabledAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "enabled",
|
||||
Name: "enabled",
|
||||
DisplayName: "启用状态",
|
||||
DataType: "Boolean",
|
||||
ValueType: "bool",
|
||||
}
|
||||
var createdAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "created",
|
||||
Name: "created",
|
||||
DisplayName: "创建时间",
|
||||
DataType: "DateTime",
|
||||
ValueType: "string",
|
||||
}
|
||||
var startTimeAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "start_time",
|
||||
Name: "startTime",
|
||||
DisplayName: "开始时间",
|
||||
DataType: "DateTime",
|
||||
ValueType: "string",
|
||||
}
|
||||
var deadlineAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "deadline",
|
||||
Name: "deadline",
|
||||
DisplayName: "结束时间",
|
||||
DataType: "DateTime",
|
||||
ValueType: "string",
|
||||
}
|
||||
var cameraIdAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "camera_id",
|
||||
Name: "cameraId",
|
||||
DisplayName: "摄像头id",
|
||||
DataType: "InternalFK",
|
||||
ValueType: "string",
|
||||
InnerAttributeName: "camera",
|
||||
OutEntityName: "Camera",
|
||||
OutEntityPkAttributeName: "id",
|
||||
OutEntityReversalAttributeName: "cameraShares",
|
||||
}
|
||||
var cameraAttributeInfo = &common.AttributeInfo{
|
||||
ColumnName: "camera",
|
||||
Name: "camera",
|
||||
DisplayName: "摄像头",
|
||||
DataType: "InternalRef",
|
||||
ValueType: "",
|
||||
InnerAttributeName: "cameraId",
|
||||
OutEntityName: "Camera",
|
||||
OutEntityPkAttributeName: "id",
|
||||
OutEntityReversalAttributeName: "cameraShares",
|
||||
}
|
||||
var entityDesc = &common.EntityDesc{
|
||||
EntityInfo: entityInfo,
|
||||
PkAttributeInfo: idAttributeInfo,
|
||||
NormalFkIdAttributeInfos: []*common.AttributeInfo{
|
||||
cameraIdAttributeInfo,
|
||||
},
|
||||
NormalFkAttributeInfos: []*common.AttributeInfo{
|
||||
cameraAttributeInfo,
|
||||
},
|
||||
NormalChildren: []*common.AttributeInfo{},
|
||||
NormalOne2OneChildren: []*common.AttributeInfo{},
|
||||
AttributeInfoMap: map[string]*common.AttributeInfo{
|
||||
"id": idAttributeInfo,
|
||||
"name": nameAttributeInfo,
|
||||
"authCode": authCodeAttributeInfo,
|
||||
"enabled": enabledAttributeInfo,
|
||||
"created": createdAttributeInfo,
|
||||
"startTime": startTimeAttributeInfo,
|
||||
"deadline": deadlineAttributeInfo,
|
||||
"cameraId": cameraIdAttributeInfo,
|
||||
"camera": cameraAttributeInfo,
|
||||
},
|
||||
}
|
||||
|
||||
return entityDesc
|
||||
}
|
@@ -4,17 +4,30 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// 摄像头
|
||||
type Camera struct {
|
||||
Id string `orm:"pk;column(id)" json:"id"`
|
||||
Code string `orm:"column(code)" json:"code"`
|
||||
RtspURL string `orm:"column(rtsp_url)" json:"rtspURL"`
|
||||
RtmpURL string `orm:"column(rtmp_url)" json:"rtmpURL"`
|
||||
PlayAuthCode string `orm:"column(play_auth_code)" json:"playAuthCode"`
|
||||
OnlineStatus int `orm:"column(online_status)" json:"onlineStatus"`
|
||||
Enabled int `orm:"column(enabled)" json:"enabled"`
|
||||
RtmpPushStatus int `orm:"column(rtmp_push_status)" json:"rtmpPushStatus"`
|
||||
SaveVideo int `orm:"column(save_video)" json:"saveVideo"`
|
||||
Live int `orm:"column(live)" json:"live"`
|
||||
Created time.Time `orm:"column(created)" json:"created"`
|
||||
CameraShares []CameraShare `orm:"-" json:"cameraShares"`
|
||||
// 摄像头主属性
|
||||
Id string `orm:"pk;column(id)" json:"id"`
|
||||
// code:
|
||||
Code string `orm:"column(code)" json:"code"`
|
||||
// rtsp地址:
|
||||
RtspUrl string `orm:"column(rtsp_url)" json:"rtspUrl"`
|
||||
// rtmp推送地址:
|
||||
RtmpUrl string `orm:"column(rtmp_url)" json:"rtmpUrl"`
|
||||
// 播放权限码:
|
||||
PlayAuthCode string `orm:"column(play_auth_code)" json:"playAuthCode"`
|
||||
// 在线状态:
|
||||
OnlineStatus int `orm:"column(online_status)" json:"onlineStatus"`
|
||||
// 启用状态:
|
||||
Enabled int `orm:"column(enabled)" json:"enabled"`
|
||||
// rtmp推送状态:
|
||||
RtmpPushStatus int `orm:"column(rtmp_push_status)" json:"rtmpPushStatus"`
|
||||
// 保存录像状态:
|
||||
SaveVideo int `orm:"column(save_video)" json:"saveVideo"`
|
||||
// 直播状态:
|
||||
Live int `orm:"column(live)" json:"live"`
|
||||
// 创建时间:
|
||||
Created time.Time `orm:"column(created)" json:"created"`
|
||||
// 摄像头分享
|
||||
CameraShares []CameraShare `orm:"-" json:"cameraShares"`
|
||||
}
|
||||
|
@@ -4,14 +4,24 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// 摄像头分享
|
||||
type CameraShare struct {
|
||||
Id string `orm:"pk;column(id)" json:"id"`
|
||||
Name string `orm:"column(name)" json:"name"`
|
||||
AuthCode string `orm:"column(auth_code)" json:"authCode"`
|
||||
Enabled int `orm:"column(enabled)" json:"enabled"`
|
||||
Created time.Time `orm:"column(created)" json:"created"`
|
||||
// 摄像头分享主属性
|
||||
Id string `orm:"pk;column(id)" json:"id"`
|
||||
// 名称:
|
||||
Name string `orm:"column(name)" json:"name"`
|
||||
// 权限码:
|
||||
AuthCode string `orm:"column(auth_code)" json:"authCode"`
|
||||
// 启用状态:
|
||||
Enabled bool `orm:"column(enabled)" json:"enabled"`
|
||||
// 创建时间:
|
||||
Created time.Time `orm:"column(created)" json:"created"`
|
||||
// 开始时间:
|
||||
StartTime time.Time `orm:"column(start_time)" json:"startTime"`
|
||||
Deadline time.Time `orm:"column(deadline)" json:"deadline"`
|
||||
CameraId string `orm:"column(camera_id)" json:"cameraId"`
|
||||
Camera Camera `orm:"-" json:"camera"`
|
||||
// 结束时间:
|
||||
Deadline time.Time `orm:"column(deadline)" json:"deadline"`
|
||||
// 摄像头id:
|
||||
CameraId string `orm:"column(camera_id)" json:"cameraId"`
|
||||
// 摄像头:
|
||||
Camera Camera `orm:"-" json:"camera"`
|
||||
}
|
||||
|
@@ -4,6 +4,8 @@ import (
|
||||
"github.com/beego/beego/v2/client/orm"
|
||||
"github.com/beego/beego/v2/core/config"
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/desc"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
@@ -42,3 +44,13 @@ func init() {
|
||||
orm.RegisterModel(new(entity.Camera))
|
||||
orm.RegisterModel(new(entity.CameraShare))
|
||||
}
|
||||
|
||||
var descMap = make(map[string]*common.EntityDesc)
|
||||
|
||||
func init() {
|
||||
descMap["Camera"] = desc.GetCameraDesc()
|
||||
}
|
||||
|
||||
func GetDescMapByKey(key string) *common.EntityDesc {
|
||||
return descMap[key]
|
||||
}
|
||||
|
@@ -4,8 +4,8 @@ type SelectStatement struct {
|
||||
Selects []SelectExpr
|
||||
From []TableRef
|
||||
Join []JoinExpr
|
||||
SqlWhere []ConditionExpression
|
||||
Having []ConditionExpression
|
||||
SqlWhere *ConditionExpression
|
||||
Having *ConditionExpression
|
||||
Orders []OrderExpr
|
||||
}
|
||||
|
||||
@@ -24,12 +24,13 @@ type TableRef struct {
|
||||
type JoinExpr struct {
|
||||
JoinType EJoinType
|
||||
TableRef
|
||||
On []ConditionExpression
|
||||
On *ConditionExpression
|
||||
}
|
||||
|
||||
type ConditionExpression struct {
|
||||
ConditionType EConditionType
|
||||
SimpleExprs []SimpleExpr
|
||||
Child *ConditionExpression
|
||||
}
|
||||
|
||||
type SimpleExpr struct {
|
||||
@@ -49,6 +50,7 @@ type EValueType = uint32
|
||||
const (
|
||||
String = iota
|
||||
Number
|
||||
Bool
|
||||
)
|
||||
|
||||
type EOrderType = uint32
|
||||
@@ -110,13 +112,13 @@ func (selectStatemet *SelectStatement) BuildJoin(joinExprs ...JoinExpr) *SelectS
|
||||
return selectStatemet
|
||||
}
|
||||
|
||||
func (selectStatemet *SelectStatement) BuildWhere(conditions ...ConditionExpression) *SelectStatement {
|
||||
selectStatemet.SqlWhere = append(selectStatemet.SqlWhere, conditions...)
|
||||
func (selectStatemet *SelectStatement) BuildWhere(conditionExpr ConditionExpression) *SelectStatement {
|
||||
selectStatemet.SqlWhere = &conditionExpr
|
||||
return selectStatemet
|
||||
}
|
||||
|
||||
func (selectStatemet *SelectStatement) BuildHaving(conditions ...ConditionExpression) *SelectStatement {
|
||||
selectStatemet.Having = append(selectStatemet.Having, conditions...)
|
||||
func (selectStatemet *SelectStatement) BuildHaving(conditionExpr ConditionExpression) *SelectStatement {
|
||||
selectStatemet.Having = &conditionExpr
|
||||
return selectStatemet
|
||||
}
|
||||
|
22
src/rtsp2rtmp/web/dyn_query/dq_generator.go
Normal file
22
src/rtsp2rtmp/web/dyn_query/dq_generator.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package dyn_query
|
||||
|
||||
import "errors"
|
||||
|
||||
type DynQuery interface {
|
||||
BuildSql(selectStatement SelectStatement) (string, error)
|
||||
}
|
||||
|
||||
func NewDynQuery(driver string) (qb DynQuery, err error) {
|
||||
if driver == "mysql" {
|
||||
qb = new(DynQueryMysql)
|
||||
// } else if driver == "tidb" {
|
||||
// qb = new(TiDBQueryBuilder)
|
||||
// } else if driver == "postgres" {
|
||||
// qb = new(PostgresQueryBuilder)
|
||||
// } else if driver == "sqlite" {
|
||||
// err = errors.New("sqlite query builder is not supported yet")
|
||||
} else {
|
||||
err = errors.New("unknown driver for query builder")
|
||||
}
|
||||
return
|
||||
}
|
217
src/rtsp2rtmp/web/dyn_query/dq_mysql_generator.go
Normal file
217
src/rtsp2rtmp/web/dyn_query/dq_mysql_generator.go
Normal file
@@ -0,0 +1,217 @@
|
||||
package dyn_query
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type DynQueryMysql struct {
|
||||
}
|
||||
|
||||
func (dynQueryMysql *DynQueryMysql) BuildSql(selectStatement SelectStatement) (sqlStr string, err error) {
|
||||
if len(selectStatement.From) == 0 {
|
||||
err = fmt.Errorf("from is empty")
|
||||
return
|
||||
}
|
||||
var tokens = make([]string, 0)
|
||||
|
||||
// select expr
|
||||
var selectTokens = make([]string, 0)
|
||||
if len(selectStatement.Selects) == 0 {
|
||||
var mainTable = selectStatement.From[0]
|
||||
selectTokens = append(selectTokens, "`"+mainTable.AliasName+"`.*")
|
||||
} else {
|
||||
for _, selectExpr := range selectStatement.Selects {
|
||||
selectTokens = append(selectTokens, "`"+selectExpr.TableAliasName+"`.`"+selectExpr.ColumnName+"`")
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, "SELECT", strings.Join(selectTokens, ","))
|
||||
|
||||
// from expr
|
||||
var fromTokens = make([]string, 0)
|
||||
for _, tableRef := range selectStatement.From {
|
||||
fromTokens = append(fromTokens, "`"+tableRef.TableName+"` `"+tableRef.AliasName+"`")
|
||||
}
|
||||
tokens = append(tokens, "FROM", strings.Join(fromTokens, ","))
|
||||
|
||||
// join expr
|
||||
var fullJoinTokens = make([]string, 0)
|
||||
if len(selectStatement.Join) > 0 {
|
||||
for _, joinExpr := range selectStatement.Join {
|
||||
var joinTokens = make([]string, 0)
|
||||
if joinExpr.JoinType == InnerJoin {
|
||||
joinTokens = append(joinTokens, "INNER JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditionExpr = joinExpr.On
|
||||
conditionToken, makeErr := makeConditionsToken(*conditionExpr)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make inner join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, conditionToken)
|
||||
} else if joinExpr.JoinType == LeftJoin {
|
||||
joinTokens = append(joinTokens, "LEFT JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditionExpr = joinExpr.On
|
||||
conditionToken, makeErr := makeConditionsToken(*conditionExpr)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make left join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, conditionToken)
|
||||
} else if joinExpr.JoinType == RightJoin {
|
||||
joinTokens = append(joinTokens, "RIGHT JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditionExpr = joinExpr.On
|
||||
conditionToken, makeErr := makeConditionsToken(*conditionExpr)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make right join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, conditionToken)
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport join: %d", joinExpr.JoinType)
|
||||
return
|
||||
}
|
||||
fullJoinTokens = append(fullJoinTokens, strings.Join(joinTokens, " "))
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, strings.Join(fullJoinTokens, " "))
|
||||
|
||||
// where expr
|
||||
var whereTokens = make([]string, 0)
|
||||
if nil != selectStatement.SqlWhere {
|
||||
var conditionExpr = selectStatement.SqlWhere
|
||||
conditionToken, makeErr := makeConditionsToken(*conditionExpr)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make where token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
whereTokens = append(whereTokens, conditionToken)
|
||||
tokens = append(tokens, "WHERE", strings.Join(whereTokens, " "))
|
||||
}
|
||||
|
||||
// having expr
|
||||
var havingTokens = make([]string, 0)
|
||||
if nil != selectStatement.Having {
|
||||
var conditionExpr = selectStatement.Having
|
||||
conditionToken, makeErr := makeConditionsToken(*conditionExpr)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make having token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
havingTokens = append(havingTokens, conditionToken)
|
||||
tokens = append(tokens, "HAVING", strings.Join(havingTokens, " "))
|
||||
}
|
||||
|
||||
// order expr
|
||||
var orderTokens = make([]string, 0)
|
||||
if len(selectStatement.Orders) > 0 {
|
||||
for _, orderExpr := range selectStatement.Orders {
|
||||
if orderExpr.OrderType == ASC {
|
||||
orderTokens = append(orderTokens, "`"+orderExpr.TableAliasName+"`.`"+orderExpr.ColumnName+"` ASC")
|
||||
} else if orderExpr.OrderType == DESC {
|
||||
orderTokens = append(orderTokens, "`"+orderExpr.TableAliasName+"`.`"+orderExpr.ColumnName+"` DESC")
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport OrderType: %d", orderExpr.OrderType)
|
||||
return
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, "ORDER BY", strings.Join(orderTokens, ","))
|
||||
}
|
||||
|
||||
sqlStr = strings.Join(tokens, " ")
|
||||
return
|
||||
}
|
||||
|
||||
func makeConditionsToken(conditionExpr ConditionExpression) (conditionToken string, err error) {
|
||||
var logicCode = "AND"
|
||||
if conditionExpr.ConditionType == OR {
|
||||
logicCode = "OR"
|
||||
}
|
||||
var andTokens = make([]string, 0)
|
||||
if len(conditionExpr.SimpleExprs) > 0 {
|
||||
for _, simpleExpr := range conditionExpr.SimpleExprs {
|
||||
var simpleExprTokens = make([]string, 0)
|
||||
simpleExprTokens = append(simpleExprTokens, "`"+simpleExpr.TableAliasName+"` `"+simpleExpr.ColumnName+"`")
|
||||
if simpleExpr.ExprType == IsNull {
|
||||
simpleExprTokens = append(simpleExprTokens, "IS NULL")
|
||||
} else if simpleExpr.ExprType == NotNull {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT NULL")
|
||||
} else if simpleExpr.ExprType == Like {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'%"+simpleExpr.Values[0]+"%'")
|
||||
} else if simpleExpr.ExprType == LeftLike {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'%"+simpleExpr.Values[0]+"'")
|
||||
} else if simpleExpr.ExprType == RightJoin {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'"+simpleExpr.Values[0]+"%'")
|
||||
} else if simpleExpr.ExprType == Equal {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == NotEqual {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "!=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "!=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == GT {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, ">", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, ">", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == GTE {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, ">=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, ">=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == LT {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "<", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "<", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == LTE {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "<=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "<=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == In {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "IN(", "'"+strings.Join(simpleExpr.Values, "','")+"')")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "IN(", strings.Join(simpleExpr.Values, ","), ")")
|
||||
}
|
||||
} else if simpleExpr.ExprType == NotIn {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT IN(", "'"+strings.Join(simpleExpr.Values, "','")+"')")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT IN(", strings.Join(simpleExpr.Values, ","), ")")
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport expr type: %d", simpleExpr.ExprType)
|
||||
return
|
||||
}
|
||||
|
||||
andTokens = append(andTokens, strings.Join(simpleExprTokens, " "))
|
||||
}
|
||||
var child = conditionExpr.Child
|
||||
if nil != child && len(child.SimpleExprs) > 0 {
|
||||
childConditionToken, child_err := makeConditionsToken(*child)
|
||||
if child_err != nil {
|
||||
err = child_err
|
||||
return
|
||||
}
|
||||
var childLogicCode = "AND"
|
||||
if child.ConditionType == OR {
|
||||
childLogicCode = "OR"
|
||||
}
|
||||
|
||||
conditionToken = childLogicCode + "( " + childConditionToken + " )"
|
||||
} else {
|
||||
conditionToken = strings.Join(andTokens, logicCode)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
649
src/rtsp2rtmp/web/dyn_query/dq_util.go
Normal file
649
src/rtsp2rtmp/web/dyn_query/dq_util.go
Normal file
@@ -0,0 +1,649 @@
|
||||
package dyn_query
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/register"
|
||||
)
|
||||
|
||||
func mergeMaps(map1, map2 map[string]uint32) map[string]uint32 {
|
||||
for k, v := range map2 {
|
||||
map1[k] = v
|
||||
}
|
||||
return map1
|
||||
}
|
||||
|
||||
func Md5(unMd5Str string) (md5Str string) {
|
||||
md5Str = fmt.Sprintf("%x", md5.Sum([]byte(unMd5Str)))
|
||||
return
|
||||
}
|
||||
|
||||
func getJoinNamesFromLogicNodes(
|
||||
logic_node *common.AqLogicNode,
|
||||
) (result_map map[string]uint32) {
|
||||
result_map = make(map[string]uint32)
|
||||
if logic_node != nil {
|
||||
var filter_nodes = logic_node.FilterNodes
|
||||
for _, filter_node := range filter_nodes {
|
||||
var names []string = strings.Split(filter_node.Name, ".")
|
||||
if len(names) > 1 {
|
||||
names = names[:len(names)-1]
|
||||
result_map[strings.Join(names, ".")] = 1
|
||||
}
|
||||
}
|
||||
|
||||
var child_result = getJoinNamesFromLogicNodes(logic_node.LogicNode)
|
||||
result_map = mergeMaps(result_map, child_result)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getJoinNamesFromOrders(
|
||||
result_map map[string]uint32,
|
||||
orders []common.AqOrder,
|
||||
) map[string]uint32 {
|
||||
for _, order := range orders {
|
||||
var names []string = strings.Split(order.Property, ",")
|
||||
if len(names) > 1 {
|
||||
names = names[:len(names)-1]
|
||||
result_map[strings.Join(names, ".")] = 1
|
||||
}
|
||||
}
|
||||
return result_map
|
||||
}
|
||||
|
||||
func getDescAttr(
|
||||
attrs []string,
|
||||
parent_name string,
|
||||
index int,
|
||||
) (attr_info common.AttributeInfo, err error) {
|
||||
var parent_desc = register.GetDescMapByKey(parent_name)
|
||||
if parent_desc == nil {
|
||||
err = fmt.Errorf("can not get description info: %s", parent_name)
|
||||
return
|
||||
}
|
||||
attr_info_pt := parent_desc.AttributeInfoMap[attrs[index]]
|
||||
if nil == attr_info_pt {
|
||||
err = fmt.Errorf("%s can not get attribute info: %s", parent_name, attrs[index])
|
||||
return
|
||||
}
|
||||
|
||||
if len(attrs)-1 == index {
|
||||
attr_info = *attr_info_pt
|
||||
return
|
||||
} else {
|
||||
return getDescAttr(attrs, attr_info_pt.OutEntityName, index+1)
|
||||
}
|
||||
}
|
||||
|
||||
func makeJoinSelect(
|
||||
joinExprs []JoinExpr,
|
||||
attrs []string,
|
||||
refEntityName string,
|
||||
refEntityAliasName string,
|
||||
index int,
|
||||
) (err error) {
|
||||
if len(attrs) < 1 {
|
||||
return
|
||||
}
|
||||
var parent_desc = register.GetDescMapByKey(refEntityName)
|
||||
if parent_desc == nil {
|
||||
err = fmt.Errorf("can not get description info: %s", refEntityName)
|
||||
return
|
||||
}
|
||||
attr_info := parent_desc.AttributeInfoMap[attrs[index]]
|
||||
if nil == attr_info {
|
||||
err = fmt.Errorf("%s can not get attribute info: %s", refEntityName, attrs[index])
|
||||
return
|
||||
}
|
||||
var ref_desc = register.GetDescMapByKey(attr_info.OutEntityName)
|
||||
if ref_desc == nil {
|
||||
err = fmt.Errorf("can not get description info: %s", attr_info.OutEntityName)
|
||||
return
|
||||
}
|
||||
var joinExpr = new(JoinExpr)
|
||||
joinExpr.JoinType = LeftJoin
|
||||
joinExpr.TableName = ref_desc.EntityInfo.TableName
|
||||
var alias_name = strings.Join(attrs[:index], ".")
|
||||
var aliasNameMd5 = Md5(alias_name)
|
||||
joinExpr.AliasName = aliasNameMd5
|
||||
if attr_info.DataType == common.DATA_TYPE_REF || attr_info.DataType == common.DATA_TYPE_SINGLE_REF || attr_info.DataType == common.DATA_TYPE_AGG_REF || attr_info.DataType == common.DATA_TYPE_AGG_SINGLE_REF {
|
||||
fk_attr_info := ref_desc.AttributeInfoMap[attr_info.InnerAttributeName]
|
||||
if nil == fk_attr_info {
|
||||
err = fmt.Errorf("%s can not get out entity InnerAttributeName attribute info: %s", ref_desc.EntityInfo.ClassName, attr_info.InnerAttributeName)
|
||||
return
|
||||
}
|
||||
var on = new(ConditionExpression)
|
||||
on.ConditionType = AND
|
||||
var simpleExprs = []SimpleExpr{SimpleExpr{}, SimpleExpr{}}
|
||||
simpleExprs[0].TableAliasName = refEntityAliasName
|
||||
simpleExprs[0].ColumnName = parent_desc.PkAttributeInfo.ColumnName
|
||||
simpleExprs[1].TableAliasName = aliasNameMd5
|
||||
simpleExprs[1].ColumnName = fk_attr_info.ColumnName
|
||||
on.SimpleExprs = simpleExprs
|
||||
joinExpr.On = on
|
||||
} else {
|
||||
out_entity_id_reversal_attr_info := ref_desc.AttributeInfoMap[attr_info.OutEntityIdReversalAttributeName]
|
||||
if nil == out_entity_id_reversal_attr_info {
|
||||
err = fmt.Errorf("entity desc: %s can not get out entity id reversal attribute info: %s", ref_desc.EntityInfo.ClassName, attr_info.OutEntityIdReversalAttributeName)
|
||||
return
|
||||
}
|
||||
var on = new(ConditionExpression)
|
||||
on.ConditionType = AND
|
||||
var simpleExprs = []SimpleExpr{SimpleExpr{}, SimpleExpr{}}
|
||||
simpleExprs[0].TableAliasName = refEntityAliasName
|
||||
simpleExprs[0].ColumnName = parent_desc.PkAttributeInfo.ColumnName
|
||||
simpleExprs[1].TableAliasName = aliasNameMd5
|
||||
simpleExprs[1].ColumnName = out_entity_id_reversal_attr_info.ColumnName
|
||||
on.SimpleExprs = simpleExprs
|
||||
joinExpr.On = on
|
||||
}
|
||||
joinExprs = append(joinExprs, *joinExpr)
|
||||
var next_index = index + 1
|
||||
if len(attrs) > next_index {
|
||||
makeJoinSelect(joinExprs, attrs, attr_info.OutEntityName, aliasNameMd5, next_index)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func makeColumnOrderBy(
|
||||
orderExprs []OrderExpr,
|
||||
orders []common.AqOrder,
|
||||
main_entity_name string,
|
||||
) (err error) {
|
||||
for _, order := range orders {
|
||||
if strings.ToUpper(order.Direction) == common.ORDER_DIRECTION_ASC {
|
||||
var names = strings.Split(order.Property, ".")
|
||||
if len(names) < 2 {
|
||||
var attr_info, err_get = getDescAttr(names, main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("make_column_order_by error: %v", err_get)
|
||||
}
|
||||
var orderExpr = OrderExpr{
|
||||
OrderType: ASC,
|
||||
}
|
||||
orderExpr.ColumnName = attr_info.ColumnName
|
||||
orderExprs = append(orderExprs, orderExpr)
|
||||
} else {
|
||||
var alias_name = strings.Join(names[:len(names)-2], ".")
|
||||
var attr_info, err_get = getDescAttr(names, main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("make_column_order_by error: %v", err_get)
|
||||
}
|
||||
var orderExpr = OrderExpr{
|
||||
OrderType: ASC,
|
||||
}
|
||||
orderExpr.TableAliasName = Md5(alias_name)
|
||||
orderExpr.ColumnName = attr_info.ColumnName
|
||||
orderExprs = append(orderExprs, orderExpr)
|
||||
}
|
||||
} else {
|
||||
var names = strings.Split(order.Property, ".")
|
||||
if len(names) < 2 {
|
||||
var attr_info, err_get = getDescAttr(names, main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("make_column_order_by error: %v", err_get)
|
||||
}
|
||||
var orderExpr = OrderExpr{
|
||||
OrderType: DESC,
|
||||
}
|
||||
orderExpr.ColumnName = attr_info.ColumnName
|
||||
orderExprs = append(orderExprs, orderExpr)
|
||||
} else {
|
||||
var alias_name = strings.Join(names[:len(names)-2], ".")
|
||||
var attr_info, err_get = getDescAttr(names, main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("make_column_order_by error: %v", err_get)
|
||||
}
|
||||
var orderExpr = OrderExpr{
|
||||
OrderType: DESC,
|
||||
}
|
||||
orderExpr.TableAliasName = Md5(alias_name)
|
||||
orderExpr.ColumnName = attr_info.ColumnName
|
||||
orderExprs = append(orderExprs, orderExpr)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func makeCondition(
|
||||
logic_node *common.AqLogicNode,
|
||||
conditionExpr *ConditionExpression,
|
||||
main_table_alias string,
|
||||
main_entity_name string,
|
||||
) (err error) {
|
||||
conditionExpr.ConditionType = AND
|
||||
if logic_node.LogicOperatorCode == common.LOGIC_OPERATOR_CODE_OR {
|
||||
conditionExpr.ConditionType = OR
|
||||
}
|
||||
|
||||
// parent level node
|
||||
var simple_exprs, err_make = makeSimpleExpr(
|
||||
logic_node,
|
||||
logic_node.LogicOperatorCode == common.LOGIC_OPERATOR_CODE_AND,
|
||||
main_table_alias,
|
||||
main_entity_name,
|
||||
)
|
||||
if err_make != nil {
|
||||
err = fmt.Errorf("Make_condition error: %v", err_make)
|
||||
return
|
||||
}
|
||||
|
||||
conditionExpr.SimpleExprs = append(conditionExpr.SimpleExprs, simple_exprs...)
|
||||
// children level node
|
||||
var sub_logic_node = logic_node.LogicNode
|
||||
if nil != sub_logic_node && len(sub_logic_node.FilterNodes) > 0 {
|
||||
conditionExpr.Child = new(ConditionExpression)
|
||||
recursionMakeSimpleExpr(
|
||||
sub_logic_node,
|
||||
main_table_alias,
|
||||
main_entity_name,
|
||||
conditionExpr.Child,
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func recursionMakeSimpleExpr(
|
||||
sub_logic_node *common.AqLogicNode,
|
||||
main_table_alias string,
|
||||
main_entity_name string,
|
||||
conditionExpr *ConditionExpression,
|
||||
) (err error) {
|
||||
//has children logic node
|
||||
if nil != sub_logic_node {
|
||||
if len(sub_logic_node.FilterNodes) == 0 {
|
||||
return
|
||||
}
|
||||
conditionExpr = &ConditionExpression{
|
||||
SimpleExprs: make([]SimpleExpr, 0),
|
||||
}
|
||||
conditionExpr.ConditionType = AND
|
||||
if sub_logic_node.LogicOperatorCode == common.LOGIC_OPERATOR_CODE_OR {
|
||||
conditionExpr.ConditionType = OR
|
||||
}
|
||||
var sub_simple_exprs, err_make = makeSimpleExpr(
|
||||
sub_logic_node,
|
||||
sub_logic_node.LogicOperatorCode == common.LOGIC_OPERATOR_CODE_AND,
|
||||
main_table_alias,
|
||||
main_entity_name,
|
||||
)
|
||||
if err_make != nil {
|
||||
err = fmt.Errorf("recursion_make_simple_expr error: %v", err_make)
|
||||
return
|
||||
}
|
||||
|
||||
conditionExpr.SimpleExprs = append(conditionExpr.SimpleExprs, sub_simple_exprs...)
|
||||
recursionMakeSimpleExpr(
|
||||
sub_logic_node.LogicNode,
|
||||
main_table_alias,
|
||||
main_entity_name,
|
||||
conditionExpr.Child,
|
||||
)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func makeSimpleExpr(
|
||||
logic_node *common.AqLogicNode,
|
||||
fg_and bool,
|
||||
main_table_alias string,
|
||||
main_entity_name string,
|
||||
) (simpleExprs []SimpleExpr, err error) {
|
||||
simpleExprs = make([]SimpleExpr, 0)
|
||||
for _, filter_node := range logic_node.FilterNodes {
|
||||
var simpleExpr, err_build = buildFilter(
|
||||
filter_node,
|
||||
main_entity_name,
|
||||
fg_and,
|
||||
main_table_alias,
|
||||
filter_node.OperatorCode,
|
||||
)
|
||||
if err_build != nil {
|
||||
err = fmt.Errorf("make_simple_expr error: %v", err_build)
|
||||
return
|
||||
}
|
||||
simpleExprs = append(simpleExprs, simpleExpr)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func buildFilter(
|
||||
filter_node common.AqFilterNode,
|
||||
main_entity_name string,
|
||||
fg_and bool,
|
||||
main_table_alias string,
|
||||
operator_code common.EOperatorCode,
|
||||
) (simpleExpr SimpleExpr, err error) {
|
||||
if strings.Contains(filter_node.Name, ".") {
|
||||
var names = strings.Split(filter_node.Name, ".")
|
||||
var alias_name = strings.Join(names[:len(names)-2], ".")
|
||||
var attr_info, err_get = getDescAttr(names, main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("build_filter error: %v", err_get)
|
||||
return
|
||||
}
|
||||
var expr_temp, err_build = buildFilterByOperatorCode(
|
||||
operator_code,
|
||||
filter_node,
|
||||
alias_name,
|
||||
attr_info,
|
||||
true,
|
||||
)
|
||||
if err_build != nil {
|
||||
err = fmt.Errorf("build_filter error: %v", err_build)
|
||||
return
|
||||
}
|
||||
simpleExpr = expr_temp
|
||||
} else {
|
||||
attr_info, err_get := getDescAttr(strings.Split(filter_node.Name, "."), main_entity_name, 0)
|
||||
if err_get != nil {
|
||||
err = fmt.Errorf("build_filter error: %v", err_get)
|
||||
return
|
||||
}
|
||||
expr_temp, err_build := buildFilterByOperatorCode(
|
||||
operator_code,
|
||||
filter_node,
|
||||
main_table_alias,
|
||||
attr_info,
|
||||
false,
|
||||
)
|
||||
if err_build != nil {
|
||||
err = fmt.Errorf("build_filter error: %v", err_build)
|
||||
return
|
||||
}
|
||||
simpleExpr = expr_temp
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func buildFilterByOperatorCode(
|
||||
operator_code common.EOperatorCode,
|
||||
filter_node common.AqFilterNode,
|
||||
alias_name string,
|
||||
attr_info common.AttributeInfo,
|
||||
fg_md5_alias_name bool,
|
||||
) (simpleExpr SimpleExpr, err error) {
|
||||
if operator_code == common.OPERATOR_CODE_EQUAL {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
Equal,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_NOT_EQUAL {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
NotEqual,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_LT {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
LT,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_LTE {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
LTE,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_GT {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
GT,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_GTE {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
GTE,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_IN {
|
||||
simpleExpr, err = makeManyParamCondition(In, alias_name, attr_info, filter_node.FilterParams, fg_md5_alias_name)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_LIKE {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
Like,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_LEFT_LIKE {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
LeftLike,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else if operator_code == common.OPERATOR_CODE_RIGHT_LIKE {
|
||||
var param = filter_node.FilterParams[0]
|
||||
simpleExpr, err = makeOneParamCondition(
|
||||
RightLike,
|
||||
alias_name,
|
||||
attr_info,
|
||||
param,
|
||||
fg_md5_alias_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("build_filter_by_operator_code error: %v", err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport operator code: %s", operator_code)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func makeOneParamCondition(
|
||||
exprType EExprType,
|
||||
alias_name string,
|
||||
attr_info common.AttributeInfo,
|
||||
v interface{},
|
||||
fg_md5_alias_name bool,
|
||||
) (expr_temp SimpleExpr, err error) {
|
||||
if fg_md5_alias_name {
|
||||
alias_name = Md5(alias_name)
|
||||
}
|
||||
valueType, err := GetValueType(attr_info)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("make condition error: attr: %s unsupport value type: %s", attr_info.Name, attr_info.ValueType)
|
||||
return
|
||||
}
|
||||
|
||||
expr_temp = SimpleExpr{
|
||||
ExprType: exprType,
|
||||
ValueType: valueType,
|
||||
Values: []string{fmt.Sprintf("%s", v)},
|
||||
}
|
||||
expr_temp.TableAliasName = alias_name
|
||||
expr_temp.ColumnName = attr_info.ColumnName
|
||||
return
|
||||
}
|
||||
|
||||
func makeManyParamCondition(
|
||||
exprType EExprType,
|
||||
alias_name string,
|
||||
attr_info common.AttributeInfo,
|
||||
values []interface{},
|
||||
fg_md5_alias_name bool,
|
||||
) (expr_temp SimpleExpr, err error) {
|
||||
if fg_md5_alias_name {
|
||||
alias_name = Md5(alias_name)
|
||||
}
|
||||
valueType, err := GetValueType(attr_info)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("make condition error: attr: %s unsupport value type: %s", attr_info.Name, attr_info.ValueType)
|
||||
return
|
||||
}
|
||||
|
||||
var strValues = make([]string, len(values))
|
||||
for _, v := range values {
|
||||
strValues = append(strValues, fmt.Sprintf("%s", v))
|
||||
}
|
||||
|
||||
expr_temp = SimpleExpr{
|
||||
ExprType: exprType,
|
||||
ValueType: valueType,
|
||||
Values: strValues,
|
||||
}
|
||||
expr_temp.TableAliasName = alias_name
|
||||
expr_temp.ColumnName = attr_info.ColumnName
|
||||
return
|
||||
}
|
||||
|
||||
func GetValueType(attr_info common.AttributeInfo) (valueType EValueType, err error) {
|
||||
if attr_info.ValueType == common.VALUE_TYPE_STRING {
|
||||
valueType = String
|
||||
return
|
||||
} else if attr_info.ValueType == common.VALUE_TYPE_NUMBER {
|
||||
valueType = Number
|
||||
return
|
||||
} else if attr_info.ValueType == common.VALUE_TYPE_BOOL {
|
||||
valueType = Bool
|
||||
return
|
||||
} else {
|
||||
err = fmt.Errorf("attr: %s unsupport value type: %s", attr_info.Name, attr_info.ValueType)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func MakeSqlByCondition(
|
||||
aq_condition common.AqCondition,
|
||||
main_entity_name string,
|
||||
) (sqlStr string, err error) {
|
||||
var mainDesc = register.GetDescMapByKey(main_entity_name)
|
||||
var main_table_name = mainDesc.EntityInfo.TableName
|
||||
var main_table_alias = mainDesc.EntityInfo.TableName
|
||||
var selectStatemet = SelectStatement{}
|
||||
var root_logic_node = aq_condition.LogicNode
|
||||
var orders = aq_condition.Orders
|
||||
var join_name_map = getJoinNamesFromLogicNodes(root_logic_node)
|
||||
var join_name_map1 = getJoinNamesFromOrders(join_name_map, orders)
|
||||
var join_names = make([]string, 0)
|
||||
for key := range join_name_map1 {
|
||||
join_names = append(join_names, key)
|
||||
}
|
||||
sort.Sort(ByLength(join_names))
|
||||
|
||||
// var selectExpr = SelectExpr{}
|
||||
// selectExpr.TableAliasName = main_table_alias
|
||||
// selectExpr.ColumnName = "*"
|
||||
selectStatemet.Selects = make([]SelectExpr, 0)
|
||||
|
||||
var from = make([]TableRef, 0)
|
||||
from[0] = TableRef{TableName: main_table_name, AliasName: main_table_alias}
|
||||
selectStatemet.From = from
|
||||
|
||||
var jonExprs = make([]JoinExpr, 0)
|
||||
makeJoinSelect(jonExprs, join_names, main_entity_name, main_table_alias, 0)
|
||||
selectStatemet.Join = jonExprs
|
||||
|
||||
var conditionExpr = ConditionExpression{}
|
||||
if root_logic_node != nil && len(root_logic_node.FilterNodes) > 0 {
|
||||
err = makeCondition(
|
||||
root_logic_node,
|
||||
&conditionExpr,
|
||||
main_table_alias,
|
||||
main_entity_name,
|
||||
)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("makeSqlByCondition error: %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
selectStatemet.SqlWhere = &conditionExpr
|
||||
|
||||
var orderExprs = make([]OrderExpr, 0)
|
||||
err = makeColumnOrderBy(orderExprs, orders, main_entity_name)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("makeSqlByCondition error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
var dynQuery, err_dyn_query = NewDynQuery("mysql")
|
||||
if nil != err_dyn_query {
|
||||
err = fmt.Errorf("makeSqlByCondition error: %v", err_dyn_query)
|
||||
return
|
||||
}
|
||||
|
||||
sqlStr, err = dynQuery.BuildSql(selectStatemet)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("makeSqlByCondition error: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
type ByLength []string
|
||||
|
||||
func (s ByLength) Len() int { return len(s) }
|
||||
func (s ByLength) Less(i, j int) bool {
|
||||
return len(strings.Split(s[i], ".")) < len(strings.Split(s[j], "."))
|
||||
}
|
||||
func (s ByLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
@@ -1,5 +0,0 @@
|
||||
package dyn_query
|
||||
|
||||
type DynQuery interface {
|
||||
BuildSql(selectStatement SelectStatement) (string, error)
|
||||
}
|
@@ -1,207 +0,0 @@
|
||||
package dyn_query
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type DynQueryMysql struct {
|
||||
}
|
||||
|
||||
func (dynQueryMysql *DynQueryMysql) BuildSql(selectStatement SelectStatement) (sqlStr string, err error) {
|
||||
if len(selectStatement.From) == 0 {
|
||||
err = fmt.Errorf("from is empty")
|
||||
return
|
||||
}
|
||||
var tokens = make([]string, 0)
|
||||
|
||||
// select expr
|
||||
var selectTokens = make([]string, 0)
|
||||
if len(selectStatement.Selects) == 0 {
|
||||
var mainTable = selectStatement.From[0]
|
||||
selectTokens = append(selectTokens, "`"+mainTable.AliasName+"`.*")
|
||||
} else {
|
||||
for _, selectExpr := range selectStatement.Selects {
|
||||
selectTokens = append(selectTokens, "`"+selectExpr.TableAliasName+"`.`"+selectExpr.ColumnName+"`")
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, "SELECT", strings.Join(selectTokens, ","))
|
||||
|
||||
// from expr
|
||||
var fromTokens = make([]string, 0)
|
||||
for _, tableRef := range selectStatement.From {
|
||||
fromTokens = append(fromTokens, "`"+tableRef.TableName+"` `"+tableRef.AliasName+"`")
|
||||
}
|
||||
tokens = append(tokens, "FROM", strings.Join(fromTokens, ","))
|
||||
|
||||
// join expr
|
||||
var fullJoinTokens = make([]string, 0)
|
||||
if len(selectStatement.Join) > 0 {
|
||||
for _, joinExpr := range selectStatement.Join {
|
||||
var joinTokens = make([]string, 0)
|
||||
if joinExpr.JoinType == InnerJoin {
|
||||
joinTokens = append(joinTokens, "INNER JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditions = joinExpr.On
|
||||
conditionTokens, makeErr := makeConditionsToken(conditions)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make inner join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, strings.Join(conditionTokens, " "))
|
||||
} else if joinExpr.JoinType == LeftJoin {
|
||||
joinTokens = append(joinTokens, "LEFT JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditions = joinExpr.On
|
||||
conditionTokens, makeErr := makeConditionsToken(conditions)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make left join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, strings.Join(conditionTokens, " "))
|
||||
} else if joinExpr.JoinType == RightJoin {
|
||||
joinTokens = append(joinTokens, "RIGHT JION `"+joinExpr.TableName+"` `"+joinExpr.AliasName+"`")
|
||||
var conditions = joinExpr.On
|
||||
conditionTokens, makeErr := makeConditionsToken(conditions)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make right join token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
joinTokens = append(joinTokens, strings.Join(conditionTokens, " "))
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport join: %d", joinExpr.JoinType)
|
||||
return
|
||||
}
|
||||
fullJoinTokens = append(fullJoinTokens, strings.Join(joinTokens, " "))
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, strings.Join(fullJoinTokens, " "))
|
||||
|
||||
// where expr
|
||||
var whereTokens = make([]string, 0)
|
||||
if len(selectStatement.SqlWhere) > 0 {
|
||||
var conditions = selectStatement.SqlWhere
|
||||
conditionTokens, makeErr := makeConditionsToken(conditions)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make where token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
whereTokens = append(whereTokens, strings.Join(conditionTokens, " "))
|
||||
tokens = append(tokens, "WHERE", strings.Join(whereTokens, " "))
|
||||
}
|
||||
|
||||
// having expr
|
||||
var havingTokens = make([]string, 0)
|
||||
if len(selectStatement.Having) > 0 {
|
||||
var conditions = selectStatement.Having
|
||||
conditionTokens, makeErr := makeConditionsToken(conditions)
|
||||
if makeErr != nil {
|
||||
err = fmt.Errorf("make having token error: %v", makeErr)
|
||||
return
|
||||
}
|
||||
havingTokens = append(havingTokens, strings.Join(conditionTokens, " "))
|
||||
tokens = append(tokens, "HAVING", strings.Join(havingTokens, " "))
|
||||
}
|
||||
|
||||
// order expr
|
||||
var orderTokens = make([]string, 0)
|
||||
if len(selectStatement.Orders) > 0 {
|
||||
for _, orderExpr := range selectStatement.Orders {
|
||||
if orderExpr.OrderType == ASC {
|
||||
orderTokens = append(orderTokens, "`"+orderExpr.TableAliasName+"`.`"+orderExpr.ColumnName+"` ASC")
|
||||
} else if orderExpr.OrderType == DESC {
|
||||
orderTokens = append(orderTokens, "`"+orderExpr.TableAliasName+"`.`"+orderExpr.ColumnName+"` DESC")
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport OrderType: %d", orderExpr.OrderType)
|
||||
return
|
||||
}
|
||||
}
|
||||
tokens = append(tokens, "ORDER BY", strings.Join(orderTokens, ","))
|
||||
}
|
||||
|
||||
sqlStr = strings.Join(tokens, " ")
|
||||
return
|
||||
}
|
||||
|
||||
func makeConditionsToken(conditionExprs []ConditionExpression) (conditionTokens []string, err error) {
|
||||
conditionTokens = make([]string, 0)
|
||||
if len(conditionExprs) > 0 {
|
||||
for _, conditionExpr := range conditionExprs {
|
||||
var logicCode = "AND"
|
||||
if conditionExpr.ConditionType == OR {
|
||||
logicCode = "OR"
|
||||
}
|
||||
var andTokens = make([]string, 0)
|
||||
if len(conditionExpr.SimpleExprs) > 0 {
|
||||
for _, simpleExpr := range conditionExpr.SimpleExprs {
|
||||
var simpleExprTokens = make([]string, 0)
|
||||
simpleExprTokens = append(simpleExprTokens, "`"+simpleExpr.TableAliasName+"` `"+simpleExpr.ColumnName+"`")
|
||||
if simpleExpr.ExprType == IsNull {
|
||||
simpleExprTokens = append(simpleExprTokens, "IS NULL")
|
||||
} else if simpleExpr.ExprType == NotNull {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT NULL")
|
||||
} else if simpleExpr.ExprType == Like {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'%"+simpleExpr.Values[0]+"%'")
|
||||
} else if simpleExpr.ExprType == LeftLike {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'%"+simpleExpr.Values[0]+"'")
|
||||
} else if simpleExpr.ExprType == RightJoin {
|
||||
simpleExprTokens = append(simpleExprTokens, "LIKE", "'"+simpleExpr.Values[0]+"%'")
|
||||
} else if simpleExpr.ExprType == Equal {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == NotEqual {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "!=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "!=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == GT {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, ">", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, ">", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == GTE {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, ">=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, ">=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == LT {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "<", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "<", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == LTE {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "<=", "'"+simpleExpr.Values[0]+"'")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "<=", simpleExpr.Values[0])
|
||||
}
|
||||
} else if simpleExpr.ExprType == In {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "IN(", "'"+strings.Join(simpleExpr.Values, "','")+"')")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "IN(", strings.Join(simpleExpr.Values, ","), ")")
|
||||
}
|
||||
} else if simpleExpr.ExprType == NotIn {
|
||||
if simpleExpr.ValueType == String {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT IN(", "'"+strings.Join(simpleExpr.Values, "','")+"')")
|
||||
} else {
|
||||
simpleExprTokens = append(simpleExprTokens, "NOT IN(", strings.Join(simpleExpr.Values, ","), ")")
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("unsupport expr type: %d", simpleExpr.ExprType)
|
||||
return
|
||||
}
|
||||
|
||||
andTokens = append(andTokens, strings.Join(simpleExprTokens, " "))
|
||||
}
|
||||
}
|
||||
conditionTokens = append(conditionTokens, strings.Join(andTokens, logicCode))
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
package result
|
||||
|
||||
type Page struct {
|
||||
Total int `json:"total"`
|
||||
Page interface{} `json:"page"`
|
||||
}
|
@@ -1,7 +0,0 @@
|
||||
package result
|
||||
|
||||
type Result struct {
|
||||
Code int `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
@@ -12,8 +12,8 @@ import (
|
||||
"github.com/beego/beego/v2/core/logs"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controllers"
|
||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/result"
|
||||
)
|
||||
|
||||
var tokens sync.Map
|
||||
@@ -132,7 +132,7 @@ func Validate() gin.HandlerFunc {
|
||||
c.Next()
|
||||
return
|
||||
}
|
||||
r := result.Result{
|
||||
r := common.Result{
|
||||
Code: 1,
|
||||
Msg: "",
|
||||
}
|
||||
@@ -169,7 +169,7 @@ func Validate() gin.HandlerFunc {
|
||||
}
|
||||
|
||||
func login(c *gin.Context) {
|
||||
r := result.Result{
|
||||
r := common.Result{
|
||||
Code: 1,
|
||||
Msg: "",
|
||||
}
|
||||
|
Reference in New Issue
Block a user