模板代码改造

This commit is contained in:
madao
2024-12-09 00:13:50 +08:00
parent de872cc2c8
commit 037e2e1f64
23 changed files with 1446 additions and 279 deletions

View File

@@ -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

View File

@@ -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,

View 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"`
}

View 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"
)

View 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
}

View 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"`
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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: "",
}

View 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
}

View 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
}

View File

@@ -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"`
}

View File

@@ -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"`
}

View File

@@ -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]
}

View File

@@ -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
}

View 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
}

View 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
}

View 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] }

View File

@@ -1,5 +0,0 @@
package dyn_query
type DynQuery interface {
BuildSql(selectStatement SelectStatement) (string, error)
}

View File

@@ -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
}

View File

@@ -1,6 +0,0 @@
package result
type Page struct {
Total int `json:"total"`
Page interface{} `json:"page"`
}

View File

@@ -1,7 +0,0 @@
package result
type Result struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}

View File

@@ -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: "",
}