mirror of
https://github.com/astaxie/beego.git
synced 2024-11-24 03:00:54 +00:00
Resolve conflict
This commit is contained in:
commit
9f295067b7
127
log.go
127
log.go
@ -1,127 +0,0 @@
|
|||||||
// Copyright 2014 beego Author. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package beego
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/astaxie/beego/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Log levels to control the logging output.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
const (
|
|
||||||
LevelEmergency = iota
|
|
||||||
LevelAlert
|
|
||||||
LevelCritical
|
|
||||||
LevelError
|
|
||||||
LevelWarning
|
|
||||||
LevelNotice
|
|
||||||
LevelInformational
|
|
||||||
LevelDebug
|
|
||||||
)
|
|
||||||
|
|
||||||
// BeeLogger references the used application logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
var BeeLogger = logs.GetBeeLogger()
|
|
||||||
|
|
||||||
// SetLevel sets the global log level used by the simple logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func SetLevel(l int) {
|
|
||||||
logs.SetLevel(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLogFuncCall set the CallDepth, default is 3
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func SetLogFuncCall(b bool) {
|
|
||||||
logs.SetLogFuncCall(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLogger sets a new logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func SetLogger(adaptername string, config string) error {
|
|
||||||
return logs.SetLogger(adaptername, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emergency logs a message at emergency level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Emergency(v ...interface{}) {
|
|
||||||
logs.Emergency(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alert logs a message at alert level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Alert(v ...interface{}) {
|
|
||||||
logs.Alert(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Critical logs a message at critical level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Critical(v ...interface{}) {
|
|
||||||
logs.Critical(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error logs a message at error level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Error(v ...interface{}) {
|
|
||||||
logs.Error(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warning logs a message at warning level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Warning(v ...interface{}) {
|
|
||||||
logs.Warning(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Warn(v ...interface{}) {
|
|
||||||
logs.Warn(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notice logs a message at notice level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Notice(v ...interface{}) {
|
|
||||||
logs.Notice(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Informational logs a message at info level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Informational(v ...interface{}) {
|
|
||||||
logs.Informational(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Info(v ...interface{}) {
|
|
||||||
logs.Info(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug logs a message at debug level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Debug(v ...interface{}) {
|
|
||||||
logs.Debug(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trace logs a message at trace level.
|
|
||||||
// compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/logs instead.
|
|
||||||
func Trace(v ...interface{}) {
|
|
||||||
logs.Trace(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateFmtStr(n int) string {
|
|
||||||
return strings.Repeat("%v ", n)
|
|
||||||
}
|
|
@ -49,6 +49,12 @@ var (
|
|||||||
"eq": true,
|
"eq": true,
|
||||||
"nq": true,
|
"nq": true,
|
||||||
"ne": true,
|
"ne": true,
|
||||||
|
">": true,
|
||||||
|
">=": true,
|
||||||
|
"<": true,
|
||||||
|
"<=": true,
|
||||||
|
"=": true,
|
||||||
|
"!=": true,
|
||||||
"startswith": true,
|
"startswith": true,
|
||||||
"endswith": true,
|
"endswith": true,
|
||||||
"istartswith": true,
|
"istartswith": true,
|
||||||
|
@ -41,12 +41,14 @@ const (
|
|||||||
type driver string
|
type driver string
|
||||||
|
|
||||||
// get type constant int of current driver..
|
// get type constant int of current driver..
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d driver) Type() DriverType {
|
func (d driver) Type() DriverType {
|
||||||
a, _ := dataBaseCache.get(string(d))
|
a, _ := dataBaseCache.get(string(d))
|
||||||
return a.Driver
|
return a.Driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// get name of current driver
|
// get name of current driver
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d driver) Name() string {
|
func (d driver) Name() string {
|
||||||
return string(d)
|
return string(d)
|
||||||
}
|
}
|
||||||
@ -111,15 +113,19 @@ type DB struct {
|
|||||||
stmtDecorators *lru.Cache
|
stmtDecorators *lru.Cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Begin start a transaction
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) Begin() (*sql.Tx, error) {
|
func (d *DB) Begin() (*sql.Tx, error) {
|
||||||
return d.DB.Begin()
|
return d.DB.Begin()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BeginTx start a transaction with context and those options
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
|
func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
|
||||||
return d.DB.BeginTx(ctx, opts)
|
return d.DB.BeginTx(ctx, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
//su must call release to release *sql.Stmt after using
|
// su must call release to release *sql.Stmt after using
|
||||||
func (d *DB) getStmtDecorator(query string) (*stmtDecorator, error) {
|
func (d *DB) getStmtDecorator(query string) (*stmtDecorator, error) {
|
||||||
d.RLock()
|
d.RLock()
|
||||||
c, ok := d.stmtDecorators.Get(query)
|
c, ok := d.stmtDecorators.Get(query)
|
||||||
@ -151,14 +157,17 @@ func (d *DB) getStmtDecorator(query string) (*stmtDecorator, error) {
|
|||||||
return sd, nil
|
return sd, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) Prepare(query string) (*sql.Stmt, error) {
|
func (d *DB) Prepare(query string) (*sql.Stmt, error) {
|
||||||
return d.DB.Prepare(query)
|
return d.DB.Prepare(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) {
|
func (d *DB) PrepareContext(ctx context.Context, query string) (*sql.Stmt, error) {
|
||||||
return d.DB.PrepareContext(ctx, query)
|
return d.DB.PrepareContext(ctx, query)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
|
func (d *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -169,6 +178,7 @@ func (d *DB) Exec(query string, args ...interface{}) (sql.Result, error) {
|
|||||||
return stmt.Exec(args...)
|
return stmt.Exec(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
|
func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -179,6 +189,7 @@ func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{})
|
|||||||
return stmt.ExecContext(ctx, args...)
|
return stmt.ExecContext(ctx, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
|
func (d *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -189,6 +200,7 @@ func (d *DB) Query(query string, args ...interface{}) (*sql.Rows, error) {
|
|||||||
return stmt.Query(args...)
|
return stmt.Query(args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
|
func (d *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -199,6 +211,7 @@ func (d *DB) QueryContext(ctx context.Context, query string, args ...interface{}
|
|||||||
return stmt.QueryContext(ctx, args...)
|
return stmt.QueryContext(ctx, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) QueryRow(query string, args ...interface{}) *sql.Row {
|
func (d *DB) QueryRow(query string, args ...interface{}) *sql.Row {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -210,6 +223,7 @@ func (d *DB) QueryRow(query string, args ...interface{}) *sql.Row {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (d *DB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
|
func (d *DB) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
|
||||||
sd, err := d.getStmtDecorator(query)
|
sd, err := d.getStmtDecorator(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -319,12 +333,14 @@ func addAliasWthDB(aliasName, driverName string, db *sql.DB) (*alias, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AddAliasWthDB add a aliasName for the drivename
|
// AddAliasWthDB add a aliasName for the drivename
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func AddAliasWthDB(aliasName, driverName string, db *sql.DB) error {
|
func AddAliasWthDB(aliasName, driverName string, db *sql.DB) error {
|
||||||
_, err := addAliasWthDB(aliasName, driverName, db)
|
_, err := addAliasWthDB(aliasName, driverName, db)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterDataBase Setting the database connect params. Use the database driver self dataSource args.
|
// RegisterDataBase Setting the database connect params. Use the database driver self dataSource args.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func RegisterDataBase(aliasName, driverName, dataSource string, params ...int) error {
|
func RegisterDataBase(aliasName, driverName, dataSource string, params ...int) error {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
@ -368,6 +384,7 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RegisterDriver Register a database driver use specify driver name, this can be definition the driver is which database type.
|
// RegisterDriver Register a database driver use specify driver name, this can be definition the driver is which database type.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func RegisterDriver(driverName string, typ DriverType) error {
|
func RegisterDriver(driverName string, typ DriverType) error {
|
||||||
if t, ok := drivers[driverName]; !ok {
|
if t, ok := drivers[driverName]; !ok {
|
||||||
drivers[driverName] = typ
|
drivers[driverName] = typ
|
||||||
@ -380,6 +397,7 @@ func RegisterDriver(driverName string, typ DriverType) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetDataBaseTZ Change the database default used timezone
|
// SetDataBaseTZ Change the database default used timezone
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func SetDataBaseTZ(aliasName string, tz *time.Location) error {
|
func SetDataBaseTZ(aliasName string, tz *time.Location) error {
|
||||||
if al, ok := dataBaseCache.get(aliasName); ok {
|
if al, ok := dataBaseCache.get(aliasName); ok {
|
||||||
al.TZ = tz
|
al.TZ = tz
|
||||||
@ -390,6 +408,7 @@ func SetDataBaseTZ(aliasName string, tz *time.Location) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetMaxIdleConns Change the max idle conns for *sql.DB, use specify database alias name
|
// SetMaxIdleConns Change the max idle conns for *sql.DB, use specify database alias name
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func SetMaxIdleConns(aliasName string, maxIdleConns int) {
|
func SetMaxIdleConns(aliasName string, maxIdleConns int) {
|
||||||
al := getDbAlias(aliasName)
|
al := getDbAlias(aliasName)
|
||||||
al.MaxIdleConns = maxIdleConns
|
al.MaxIdleConns = maxIdleConns
|
||||||
@ -397,6 +416,7 @@ func SetMaxIdleConns(aliasName string, maxIdleConns int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetMaxOpenConns Change the max open conns for *sql.DB, use specify database alias name
|
// SetMaxOpenConns Change the max open conns for *sql.DB, use specify database alias name
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func SetMaxOpenConns(aliasName string, maxOpenConns int) {
|
func SetMaxOpenConns(aliasName string, maxOpenConns int) {
|
||||||
al := getDbAlias(aliasName)
|
al := getDbAlias(aliasName)
|
||||||
al.MaxOpenConns = maxOpenConns
|
al.MaxOpenConns = maxOpenConns
|
||||||
@ -409,6 +429,7 @@ func SetMaxOpenConns(aliasName string, maxOpenConns int) {
|
|||||||
|
|
||||||
// GetDB Get *sql.DB from registered database by db alias name.
|
// GetDB Get *sql.DB from registered database by db alias name.
|
||||||
// Use "default" as alias name if you not set.
|
// Use "default" as alias name if you not set.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func GetDB(aliasNames ...string) (*sql.DB, error) {
|
func GetDB(aliasNames ...string) (*sql.DB, error) {
|
||||||
var name string
|
var name string
|
||||||
if len(aliasNames) > 0 {
|
if len(aliasNames) > 0 {
|
||||||
|
@ -29,11 +29,17 @@ var mysqlOperators = map[string]string{
|
|||||||
// "regex": "REGEXP BINARY ?",
|
// "regex": "REGEXP BINARY ?",
|
||||||
// "iregex": "REGEXP ?",
|
// "iregex": "REGEXP ?",
|
||||||
"gt": "> ?",
|
"gt": "> ?",
|
||||||
|
">": "> ?",
|
||||||
"gte": ">= ?",
|
"gte": ">= ?",
|
||||||
|
">=": ">= ?",
|
||||||
"lt": "< ?",
|
"lt": "< ?",
|
||||||
|
"<": "< ?",
|
||||||
"lte": "<= ?",
|
"lte": "<= ?",
|
||||||
|
"<=": "<= ?",
|
||||||
"eq": "= ?",
|
"eq": "= ?",
|
||||||
|
"=": "= ?",
|
||||||
"ne": "!= ?",
|
"ne": "!= ?",
|
||||||
|
"!=": "!= ?",
|
||||||
"startswith": "LIKE BINARY ?",
|
"startswith": "LIKE BINARY ?",
|
||||||
"endswith": "LIKE BINARY ?",
|
"endswith": "LIKE BINARY ?",
|
||||||
"istartswith": "LIKE ?",
|
"istartswith": "LIKE ?",
|
||||||
|
@ -22,10 +22,15 @@ import (
|
|||||||
// oracle operators.
|
// oracle operators.
|
||||||
var oracleOperators = map[string]string{
|
var oracleOperators = map[string]string{
|
||||||
"exact": "= ?",
|
"exact": "= ?",
|
||||||
|
"=": "= ?",
|
||||||
"gt": "> ?",
|
"gt": "> ?",
|
||||||
|
">": "> ?",
|
||||||
"gte": ">= ?",
|
"gte": ">= ?",
|
||||||
|
">=": ">= ?",
|
||||||
"lt": "< ?",
|
"lt": "< ?",
|
||||||
|
"<": "< ?",
|
||||||
"lte": "<= ?",
|
"lte": "<= ?",
|
||||||
|
"<=": "<= ?",
|
||||||
"//iendswith": "LIKE ?",
|
"//iendswith": "LIKE ?",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,11 +26,17 @@ var postgresOperators = map[string]string{
|
|||||||
"contains": "LIKE ?",
|
"contains": "LIKE ?",
|
||||||
"icontains": "LIKE UPPER(?)",
|
"icontains": "LIKE UPPER(?)",
|
||||||
"gt": "> ?",
|
"gt": "> ?",
|
||||||
|
">": "> ?",
|
||||||
"gte": ">= ?",
|
"gte": ">= ?",
|
||||||
|
">=": ">= ?",
|
||||||
"lt": "< ?",
|
"lt": "< ?",
|
||||||
|
"<": "< ?",
|
||||||
"lte": "<= ?",
|
"lte": "<= ?",
|
||||||
|
"<=": "<= ?",
|
||||||
"eq": "= ?",
|
"eq": "= ?",
|
||||||
|
"=": "= ?",
|
||||||
"ne": "!= ?",
|
"ne": "!= ?",
|
||||||
|
"!=": "!= ?",
|
||||||
"startswith": "LIKE ?",
|
"startswith": "LIKE ?",
|
||||||
"endswith": "LIKE ?",
|
"endswith": "LIKE ?",
|
||||||
"istartswith": "LIKE UPPER(?)",
|
"istartswith": "LIKE UPPER(?)",
|
||||||
|
@ -28,11 +28,17 @@ var sqliteOperators = map[string]string{
|
|||||||
"contains": "LIKE ? ESCAPE '\\'",
|
"contains": "LIKE ? ESCAPE '\\'",
|
||||||
"icontains": "LIKE ? ESCAPE '\\'",
|
"icontains": "LIKE ? ESCAPE '\\'",
|
||||||
"gt": "> ?",
|
"gt": "> ?",
|
||||||
|
">": "> ?",
|
||||||
"gte": ">= ?",
|
"gte": ">= ?",
|
||||||
|
">=": ">= ?",
|
||||||
"lt": "< ?",
|
"lt": "< ?",
|
||||||
|
"<": "< ?",
|
||||||
"lte": "<= ?",
|
"lte": "<= ?",
|
||||||
|
"<=": "<= ?",
|
||||||
"eq": "= ?",
|
"eq": "= ?",
|
||||||
|
"=": "= ?",
|
||||||
"ne": "!= ?",
|
"ne": "!= ?",
|
||||||
|
"!=": "!= ?",
|
||||||
"startswith": "LIKE ? ESCAPE '\\'",
|
"startswith": "LIKE ? ESCAPE '\\'",
|
||||||
"endswith": "LIKE ? ESCAPE '\\'",
|
"endswith": "LIKE ? ESCAPE '\\'",
|
||||||
"istartswith": "LIKE ? ESCAPE '\\'",
|
"istartswith": "LIKE ? ESCAPE '\\'",
|
||||||
|
23
orm/orm.go
23
orm/orm.go
@ -124,18 +124,21 @@ func (o *orm) getFieldInfo(mi *modelInfo, name string) *fieldInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// read data to model
|
// read data to model
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Read(md interface{}, cols ...string) error {
|
func (o *orm) Read(md interface{}, cols ...string) error {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, false)
|
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// read data to model, like Read(), but use "SELECT FOR UPDATE" form
|
// read data to model, like Read(), but use "SELECT FOR UPDATE" form
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) ReadForUpdate(md interface{}, cols ...string) error {
|
func (o *orm) ReadForUpdate(md interface{}, cols ...string) error {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, true)
|
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to read a row from the database, or insert one if it doesn't exist
|
// Try to read a row from the database, or insert one if it doesn't exist
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) {
|
func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) {
|
||||||
cols = append([]string{col1}, cols...)
|
cols = append([]string{col1}, cols...)
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
@ -159,6 +162,7 @@ func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
// insert model data to database
|
// insert model data to database
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Insert(md interface{}) (int64, error) {
|
func (o *orm) Insert(md interface{}) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
id, err := o.alias.DbBaser.Insert(o.db, mi, ind, o.alias.TZ)
|
id, err := o.alias.DbBaser.Insert(o.db, mi, ind, o.alias.TZ)
|
||||||
@ -183,6 +187,7 @@ func (o *orm) setPk(mi *modelInfo, ind reflect.Value, id int64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// insert some models to database
|
// insert some models to database
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) InsertMulti(bulk int, mds interface{}) (int64, error) {
|
func (o *orm) InsertMulti(bulk int, mds interface{}) (int64, error) {
|
||||||
var cnt int64
|
var cnt int64
|
||||||
|
|
||||||
@ -218,6 +223,7 @@ func (o *orm) InsertMulti(bulk int, mds interface{}) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// InsertOrUpdate data to database
|
// InsertOrUpdate data to database
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) {
|
func (o *orm) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
id, err := o.alias.DbBaser.InsertOrUpdate(o.db, mi, ind, o.alias, colConflitAndArgs...)
|
id, err := o.alias.DbBaser.InsertOrUpdate(o.db, mi, ind, o.alias, colConflitAndArgs...)
|
||||||
@ -232,6 +238,7 @@ func (o *orm) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64
|
|||||||
|
|
||||||
// update model to database.
|
// update model to database.
|
||||||
// cols set the columns those want to update.
|
// cols set the columns those want to update.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Update(md interface{}, cols ...string) (int64, error) {
|
func (o *orm) Update(md interface{}, cols ...string) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
return o.alias.DbBaser.Update(o.db, mi, ind, o.alias.TZ, cols)
|
return o.alias.DbBaser.Update(o.db, mi, ind, o.alias.TZ, cols)
|
||||||
@ -239,6 +246,7 @@ func (o *orm) Update(md interface{}, cols ...string) (int64, error) {
|
|||||||
|
|
||||||
// delete model in database
|
// delete model in database
|
||||||
// cols shows the delete conditions values read from. default is pk
|
// cols shows the delete conditions values read from. default is pk
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Delete(md interface{}, cols ...string) (int64, error) {
|
func (o *orm) Delete(md interface{}, cols ...string) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
num, err := o.alias.DbBaser.Delete(o.db, mi, ind, o.alias.TZ, cols)
|
num, err := o.alias.DbBaser.Delete(o.db, mi, ind, o.alias.TZ, cols)
|
||||||
@ -252,6 +260,7 @@ func (o *orm) Delete(md interface{}, cols ...string) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a models to models queryer
|
// create a models to models queryer
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) QueryM2M(md interface{}, name string) QueryM2Mer {
|
func (o *orm) QueryM2M(md interface{}, name string) QueryM2Mer {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
fi := o.getFieldInfo(mi, name)
|
fi := o.getFieldInfo(mi, name)
|
||||||
@ -274,6 +283,7 @@ func (o *orm) QueryM2M(md interface{}, name string) QueryM2Mer {
|
|||||||
// for _,tag := range post.Tags{...}
|
// for _,tag := range post.Tags{...}
|
||||||
//
|
//
|
||||||
// make sure the relation is defined in model struct tags.
|
// make sure the relation is defined in model struct tags.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) LoadRelated(md interface{}, name string, args ...interface{}) (int64, error) {
|
func (o *orm) LoadRelated(md interface{}, name string, args ...interface{}) (int64, error) {
|
||||||
_, fi, ind, qseter := o.queryRelated(md, name)
|
_, fi, ind, qseter := o.queryRelated(md, name)
|
||||||
|
|
||||||
@ -341,6 +351,7 @@ func (o *orm) LoadRelated(md interface{}, name string, args ...interface{}) (int
|
|||||||
// qs := orm.QueryRelated(post,"Tag")
|
// qs := orm.QueryRelated(post,"Tag")
|
||||||
// qs.All(&[]*Tag{})
|
// qs.All(&[]*Tag{})
|
||||||
//
|
//
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) QueryRelated(md interface{}, name string) QuerySeter {
|
func (o *orm) QueryRelated(md interface{}, name string) QuerySeter {
|
||||||
// is this api needed ?
|
// is this api needed ?
|
||||||
_, _, _, qs := o.queryRelated(md, name)
|
_, _, _, qs := o.queryRelated(md, name)
|
||||||
@ -423,6 +434,7 @@ func (o *orm) getRelQs(md interface{}, mi *modelInfo, fi *fieldInfo) *querySet {
|
|||||||
// return a QuerySeter for table operations.
|
// return a QuerySeter for table operations.
|
||||||
// table name can be string or struct.
|
// table name can be string or struct.
|
||||||
// e.g. QueryTable("user"), QueryTable(&user{}) or QueryTable((*User)(nil)),
|
// e.g. QueryTable("user"), QueryTable(&user{}) or QueryTable((*User)(nil)),
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) QueryTable(ptrStructOrTableName interface{}) (qs QuerySeter) {
|
func (o *orm) QueryTable(ptrStructOrTableName interface{}) (qs QuerySeter) {
|
||||||
var name string
|
var name string
|
||||||
if table, ok := ptrStructOrTableName.(string); ok {
|
if table, ok := ptrStructOrTableName.(string); ok {
|
||||||
@ -443,6 +455,8 @@ func (o *orm) QueryTable(ptrStructOrTableName interface{}) (qs QuerySeter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// switch to another registered database driver by given name.
|
// switch to another registered database driver by given name.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
|
// Using NewOrmUsingDB(name)
|
||||||
func (o *orm) Using(name string) error {
|
func (o *orm) Using(name string) error {
|
||||||
if o.isTx {
|
if o.isTx {
|
||||||
panic(fmt.Errorf("<Ormer.Using> transaction has been start, cannot change db"))
|
panic(fmt.Errorf("<Ormer.Using> transaction has been start, cannot change db"))
|
||||||
@ -461,10 +475,12 @@ func (o *orm) Using(name string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// begin transaction
|
// begin transaction
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Begin() error {
|
func (o *orm) Begin() error {
|
||||||
return o.BeginTx(context.Background(), nil)
|
return o.BeginTx(context.Background(), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) BeginTx(ctx context.Context, opts *sql.TxOptions) error {
|
func (o *orm) BeginTx(ctx context.Context, opts *sql.TxOptions) error {
|
||||||
if o.isTx {
|
if o.isTx {
|
||||||
return ErrTxHasBegan
|
return ErrTxHasBegan
|
||||||
@ -484,6 +500,7 @@ func (o *orm) BeginTx(ctx context.Context, opts *sql.TxOptions) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// commit transaction
|
// commit transaction
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Commit() error {
|
func (o *orm) Commit() error {
|
||||||
if !o.isTx {
|
if !o.isTx {
|
||||||
return ErrTxDone
|
return ErrTxDone
|
||||||
@ -499,6 +516,7 @@ func (o *orm) Commit() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rollback transaction
|
// rollback transaction
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Rollback() error {
|
func (o *orm) Rollback() error {
|
||||||
if !o.isTx {
|
if !o.isTx {
|
||||||
return ErrTxDone
|
return ErrTxDone
|
||||||
@ -514,16 +532,19 @@ func (o *orm) Rollback() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// return a raw query seter for raw sql string.
|
// return a raw query seter for raw sql string.
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Raw(query string, args ...interface{}) RawSeter {
|
func (o *orm) Raw(query string, args ...interface{}) RawSeter {
|
||||||
return newRawSet(o, query, args)
|
return newRawSet(o, query, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return current using database Driver
|
// return current using database Driver
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) Driver() Driver {
|
func (o *orm) Driver() Driver {
|
||||||
return driver(o.alias.Name)
|
return driver(o.alias.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return sql.DBStats for current database
|
// return sql.DBStats for current database
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func (o *orm) DBStats() *sql.DBStats {
|
func (o *orm) DBStats() *sql.DBStats {
|
||||||
if o.alias != nil && o.alias.DB != nil {
|
if o.alias != nil && o.alias.DB != nil {
|
||||||
stats := o.alias.DB.DB.Stats()
|
stats := o.alias.DB.DB.Stats()
|
||||||
@ -533,6 +554,7 @@ func (o *orm) DBStats() *sql.DBStats {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewOrm create new orm
|
// NewOrm create new orm
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func NewOrm() Ormer {
|
func NewOrm() Ormer {
|
||||||
BootStrap() // execute only once
|
BootStrap() // execute only once
|
||||||
|
|
||||||
@ -545,6 +567,7 @@ func NewOrm() Ormer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewOrmWithDB create a new ormer object with specify *sql.DB for query
|
// NewOrmWithDB create a new ormer object with specify *sql.DB for query
|
||||||
|
// Deprecated: using pkg/orm. We will remove this method in v2.1.0
|
||||||
func NewOrmWithDB(driverName, aliasName string, db *sql.DB) (Ormer, error) {
|
func NewOrmWithDB(driverName, aliasName string, db *sql.DB) (Ormer, error) {
|
||||||
var al *alias
|
var al *alias
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Driver define database driver
|
// Driver define database driver
|
||||||
|
|
||||||
type Driver interface {
|
type Driver interface {
|
||||||
Name() string
|
Name() string
|
||||||
Type() DriverType
|
Type() DriverType
|
||||||
|
127
pkg/log.go
127
pkg/log.go
@ -1,127 +0,0 @@
|
|||||||
// Copyright 2014 beego Author. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package beego
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/astaxie/beego/pkg/logs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Log levels to control the logging output.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
const (
|
|
||||||
LevelEmergency = iota
|
|
||||||
LevelAlert
|
|
||||||
LevelCritical
|
|
||||||
LevelError
|
|
||||||
LevelWarning
|
|
||||||
LevelNotice
|
|
||||||
LevelInformational
|
|
||||||
LevelDebug
|
|
||||||
)
|
|
||||||
|
|
||||||
// BeeLogger references the used application logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
var BeeLogger = logs.GetBeeLogger()
|
|
||||||
|
|
||||||
// SetLevel sets the global log level used by the simple logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func SetLevel(l int) {
|
|
||||||
logs.SetLevel(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLogFuncCall set the CallDepth, default is 3
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func SetLogFuncCall(b bool) {
|
|
||||||
logs.SetLogFuncCall(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLogger sets a new logger.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func SetLogger(adaptername string, config string) error {
|
|
||||||
return logs.SetLogger(adaptername, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emergency logs a message at emergency level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Emergency(v ...interface{}) {
|
|
||||||
logs.Emergency(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alert logs a message at alert level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Alert(v ...interface{}) {
|
|
||||||
logs.Alert(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Critical logs a message at critical level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Critical(v ...interface{}) {
|
|
||||||
logs.Critical(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Error logs a message at error level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Error(v ...interface{}) {
|
|
||||||
logs.Error(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warning logs a message at warning level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Warning(v ...interface{}) {
|
|
||||||
logs.Warning(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Warn(v ...interface{}) {
|
|
||||||
logs.Warn(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notice logs a message at notice level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Notice(v ...interface{}) {
|
|
||||||
logs.Notice(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Informational logs a message at info level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Informational(v ...interface{}) {
|
|
||||||
logs.Informational(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Info(v ...interface{}) {
|
|
||||||
logs.Info(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Debug logs a message at debug level.
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Debug(v ...interface{}) {
|
|
||||||
logs.Debug(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trace logs a message at trace level.
|
|
||||||
// compatibility alias for Warning()
|
|
||||||
// Deprecated: use github.com/astaxie/beego/pkg/logs instead.
|
|
||||||
func Trace(v ...interface{}) {
|
|
||||||
logs.Trace(generateFmtStr(len(v)), v...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateFmtStr(n int) string {
|
|
||||||
return strings.Repeat("%v ", n)
|
|
||||||
}
|
|
@ -75,3 +75,13 @@ func TestRegisterDataBase_MaxStmtCacheSize841(t *testing.T) {
|
|||||||
assert.Equal(t, al.DB.stmtDecoratorsLimit, 841)
|
assert.Equal(t, al.DB.stmtDecoratorsLimit, 841)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestDBCache(t *testing.T) {
|
||||||
|
dataBaseCache.add("test1", &alias{})
|
||||||
|
dataBaseCache.add("default", &alias{})
|
||||||
|
al := dataBaseCache.getDefault()
|
||||||
|
assert.NotNil(t, al)
|
||||||
|
al, ok := dataBaseCache.get("test1")
|
||||||
|
assert.NotNil(t, al)
|
||||||
|
assert.True(t, ok)
|
||||||
|
}
|
||||||
|
62
pkg/orm/model_utils_test.go
Normal file
62
pkg/orm/model_utils_test.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// Copyright 2020
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package orm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Interface struct {
|
||||||
|
Id int
|
||||||
|
Name string
|
||||||
|
|
||||||
|
Index1 string
|
||||||
|
Index2 string
|
||||||
|
|
||||||
|
Unique1 string
|
||||||
|
Unique2 string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) TableIndex() [][]string {
|
||||||
|
return [][]string{{"index1"}, {"index2"}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) TableUnique() [][]string {
|
||||||
|
return [][]string{{"unique1"}, {"unique2"}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) TableName() string {
|
||||||
|
return "INTERFACE_"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Interface) TableEngine() string {
|
||||||
|
return "innodb"
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDbBase_GetTables(t *testing.T) {
|
||||||
|
RegisterModel(&Interface{})
|
||||||
|
mi, ok := modelCache.get("INTERFACE_")
|
||||||
|
assert.True(t, ok)
|
||||||
|
assert.NotNil(t, mi)
|
||||||
|
|
||||||
|
engine := getTableEngine(mi.addrField)
|
||||||
|
assert.Equal(t, "innodb", engine)
|
||||||
|
uniques := getTableUnique(mi.addrField)
|
||||||
|
assert.Equal(t, [][]string{{"unique1"}, {"unique2"}}, uniques)
|
||||||
|
indexes := getTableIndex(mi.addrField)
|
||||||
|
assert.Equal(t, [][]string{{"index1"}, {"index2"}}, indexes)
|
||||||
|
}
|
@ -29,7 +29,7 @@ type modelInfo struct {
|
|||||||
model interface{}
|
model interface{}
|
||||||
fields *fields
|
fields *fields
|
||||||
manual bool
|
manual bool
|
||||||
addrField reflect.Value //store the original struct value
|
addrField reflect.Value // store the original struct value
|
||||||
uniques []string
|
uniques []string
|
||||||
isThrough bool
|
isThrough bool
|
||||||
}
|
}
|
||||||
|
@ -305,6 +305,7 @@ func (o *ormBase) QueryM2MWithCtx(ctx context.Context, md interface{}, name stri
|
|||||||
func (o *ormBase) LoadRelated(md interface{}, name string, args ...interface{}) (int64, error) {
|
func (o *ormBase) LoadRelated(md interface{}, name string, args ...interface{}) (int64, error) {
|
||||||
return o.LoadRelatedWithCtx(context.Background(), md, name, args...)
|
return o.LoadRelatedWithCtx(context.Background(), md, name, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *ormBase) LoadRelatedWithCtx(ctx context.Context, md interface{}, name string, args ...interface{}) (int64, error) {
|
func (o *ormBase) LoadRelatedWithCtx(ctx context.Context, md interface{}, name string, args ...interface{}) (int64, error) {
|
||||||
_, fi, ind, qseter := o.queryRelated(md, name)
|
_, fi, ind, qseter := o.queryRelated(md, name)
|
||||||
|
|
||||||
@ -366,21 +367,6 @@ func (o *ormBase) LoadRelatedWithCtx(ctx context.Context, md interface{}, name s
|
|||||||
return nums, err
|
return nums, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// return a QuerySeter for related models to md model.
|
|
||||||
// it can do all, update, delete in QuerySeter.
|
|
||||||
// example:
|
|
||||||
// qs := orm.QueryRelated(post,"Tag")
|
|
||||||
// qs.All(&[]*Tag{})
|
|
||||||
//
|
|
||||||
func (o *ormBase) QueryRelated(md interface{}, name string) QuerySeter {
|
|
||||||
return o.QueryRelatedWithCtx(context.Background(), md, name)
|
|
||||||
}
|
|
||||||
func (o *ormBase) QueryRelatedWithCtx(ctx context.Context, md interface{}, name string) QuerySeter {
|
|
||||||
// is this api needed ?
|
|
||||||
_, _, _, qs := o.queryRelated(md, name)
|
|
||||||
return qs
|
|
||||||
}
|
|
||||||
|
|
||||||
// get QuerySeter for related models to md model
|
// get QuerySeter for related models to md model
|
||||||
func (o *ormBase) queryRelated(md interface{}, name string) (*modelInfo, *fieldInfo, reflect.Value, QuerySeter) {
|
func (o *ormBase) queryRelated(md interface{}, name string) (*modelInfo, *fieldInfo, reflect.Value, QuerySeter) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
@ -591,10 +577,13 @@ func (t *txOrm) Rollback() error {
|
|||||||
// NewOrm create new orm
|
// NewOrm create new orm
|
||||||
func NewOrm() Ormer {
|
func NewOrm() Ormer {
|
||||||
BootStrap() // execute only once
|
BootStrap() // execute only once
|
||||||
|
return NewOrmUsingDB(`default`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewOrmUsingDB create new orm with the name
|
||||||
|
func NewOrmUsingDB(aliasName string) Ormer {
|
||||||
o := new(orm)
|
o := new(orm)
|
||||||
name := `default`
|
if al, ok := dataBaseCache.get(aliasName); ok {
|
||||||
if al, ok := dataBaseCache.get(name); ok {
|
|
||||||
o.alias = al
|
o.alias = al
|
||||||
if Debug {
|
if Debug {
|
||||||
o.db = newDbQueryLog(al, al.DB)
|
o.db = newDbQueryLog(al, al.DB)
|
||||||
@ -602,9 +591,8 @@ func NewOrm() Ormer {
|
|||||||
o.db = al.DB
|
o.db = al.DB
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
panic(fmt.Errorf("<Ormer.Using> unknown db alias name `%s`", name))
|
panic(fmt.Errorf("<Ormer.Using> unknown db alias name `%s`", aliasName))
|
||||||
}
|
}
|
||||||
|
|
||||||
return o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,16 +297,13 @@ func TestDataTypes(t *testing.T) {
|
|||||||
vu := e.Interface()
|
vu := e.Interface()
|
||||||
switch name {
|
switch name {
|
||||||
case "Date":
|
case "Date":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
case "DateTime":
|
case "DateTime":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
|
||||||
case "Time":
|
case "Time":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
assert.True(t, vu.(time.Time).In(DefaultTimeLoc).Sub(value.(time.Time).In(DefaultTimeLoc)) <= time.Second)
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
break
|
||||||
|
default:
|
||||||
|
assert.Equal(t, value, vu)
|
||||||
}
|
}
|
||||||
throwFail(t, AssertIs(vu == value, true), value, vu)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1662,18 +1659,14 @@ func TestRawQueryRow(t *testing.T) {
|
|||||||
switch col {
|
switch col {
|
||||||
case "id":
|
case "id":
|
||||||
throwFail(t, AssertIs(id, 1))
|
throwFail(t, AssertIs(id, 1))
|
||||||
|
break
|
||||||
case "time":
|
case "time":
|
||||||
v = v.(time.Time).In(DefaultTimeLoc)
|
|
||||||
value := dataValues[col].(time.Time).In(DefaultTimeLoc)
|
|
||||||
throwFail(t, AssertIs(v, value, testTime))
|
|
||||||
case "date":
|
case "date":
|
||||||
v = v.(time.Time).In(DefaultTimeLoc)
|
|
||||||
value := dataValues[col].(time.Time).In(DefaultTimeLoc)
|
|
||||||
throwFail(t, AssertIs(v, value, testDate))
|
|
||||||
case "datetime":
|
case "datetime":
|
||||||
v = v.(time.Time).In(DefaultTimeLoc)
|
v = v.(time.Time).In(DefaultTimeLoc)
|
||||||
value := dataValues[col].(time.Time).In(DefaultTimeLoc)
|
value := dataValues[col].(time.Time).In(DefaultTimeLoc)
|
||||||
throwFail(t, AssertIs(v, value, testDateTime))
|
assert.True(t, v.(time.Time).Sub(value) <= time.Second)
|
||||||
|
break
|
||||||
default:
|
default:
|
||||||
throwFail(t, AssertIs(v, dataValues[col]))
|
throwFail(t, AssertIs(v, dataValues[col]))
|
||||||
}
|
}
|
||||||
@ -1746,16 +1739,13 @@ func TestQueryRows(t *testing.T) {
|
|||||||
vu := e.Interface()
|
vu := e.Interface()
|
||||||
switch name {
|
switch name {
|
||||||
case "Time":
|
case "Time":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
|
||||||
case "Date":
|
case "Date":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
case "DateTime":
|
case "DateTime":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
assert.True(t, vu.(time.Time).In(DefaultTimeLoc).Sub(value.(time.Time).In(DefaultTimeLoc)) <= time.Second)
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
break
|
||||||
|
default:
|
||||||
|
assert.Equal(t, value, vu)
|
||||||
}
|
}
|
||||||
throwFail(t, AssertIs(vu == value, true), value, vu)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var datas2 []Data
|
var datas2 []Data
|
||||||
@ -1773,16 +1763,14 @@ func TestQueryRows(t *testing.T) {
|
|||||||
vu := e.Interface()
|
vu := e.Interface()
|
||||||
switch name {
|
switch name {
|
||||||
case "Time":
|
case "Time":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testTime)
|
|
||||||
case "Date":
|
case "Date":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDate)
|
|
||||||
case "DateTime":
|
case "DateTime":
|
||||||
vu = vu.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
assert.True(t, vu.(time.Time).In(DefaultTimeLoc).Sub(value.(time.Time).In(DefaultTimeLoc)) <= time.Second)
|
||||||
value = value.(time.Time).In(DefaultTimeLoc).Format(testDateTime)
|
break
|
||||||
|
default:
|
||||||
|
assert.Equal(t, value, vu)
|
||||||
}
|
}
|
||||||
throwFail(t, AssertIs(vu == value, true), value, vu)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ids []int
|
var ids []int
|
||||||
@ -2193,8 +2181,8 @@ func TestInLine(t *testing.T) {
|
|||||||
|
|
||||||
throwFail(t, AssertIs(il.Name, name))
|
throwFail(t, AssertIs(il.Name, name))
|
||||||
throwFail(t, AssertIs(il.Email, email))
|
throwFail(t, AssertIs(il.Email, email))
|
||||||
throwFail(t, AssertIs(il.Created.In(DefaultTimeLoc), inline.Created.In(DefaultTimeLoc), testDate))
|
assert.True(t, il.Created.In(DefaultTimeLoc).Sub(inline.Created.In(DefaultTimeLoc)) <= time.Second)
|
||||||
throwFail(t, AssertIs(il.Updated.In(DefaultTimeLoc), inline.Updated.In(DefaultTimeLoc), testDateTime))
|
assert.True(t, il.Updated.In(DefaultTimeLoc).Sub(inline.Updated.In(DefaultTimeLoc)) <= time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInLineOneToOne(t *testing.T) {
|
func TestInLineOneToOne(t *testing.T) {
|
||||||
|
@ -21,6 +21,58 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TableNaming is usually used by model
|
||||||
|
// when you custom your table name, please implement this interfaces
|
||||||
|
// for example:
|
||||||
|
// type User struct {
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// func (u *User) TableName() string {
|
||||||
|
// return "USER_TABLE"
|
||||||
|
// }
|
||||||
|
type TableNameI interface {
|
||||||
|
TableName() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableEngineI is usually used by model
|
||||||
|
// when you want to use specific engine, like myisam, you can implement this interface
|
||||||
|
// for example:
|
||||||
|
// type User struct {
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// func (u *User) TableEngine() string {
|
||||||
|
// return "myisam"
|
||||||
|
// }
|
||||||
|
type TableEngineI interface {
|
||||||
|
TableEngine() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableIndexI is usually used by model
|
||||||
|
// when you want to create indexes, you can implement this interface
|
||||||
|
// for example:
|
||||||
|
// type User struct {
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// func (u *User) TableIndex() [][]string {
|
||||||
|
// return [][]string{{"Name"}}
|
||||||
|
// }
|
||||||
|
type TableIndexI interface {
|
||||||
|
TableIndex() [][]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableUniqueI is usually used by model
|
||||||
|
// when you want to create unique indexes, you can implement this interface
|
||||||
|
// for example:
|
||||||
|
// type User struct {
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// func (u *User) TableUnique() [][]string {
|
||||||
|
// return [][]string{{"Email"}}
|
||||||
|
// }
|
||||||
|
type TableUniqueI interface {
|
||||||
|
TableUnique() [][]string
|
||||||
|
}
|
||||||
|
|
||||||
// Driver define database driver
|
// Driver define database driver
|
||||||
type Driver interface {
|
type Driver interface {
|
||||||
Name() string
|
Name() string
|
||||||
@ -145,9 +197,6 @@ type DQL interface {
|
|||||||
QueryTable(ptrStructOrTableName interface{}) QuerySeter
|
QueryTable(ptrStructOrTableName interface{}) QuerySeter
|
||||||
QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) QuerySeter
|
QueryTableWithCtx(ctx context.Context, ptrStructOrTableName interface{}) QuerySeter
|
||||||
|
|
||||||
// switch to another registered database driver by given name.
|
|
||||||
// Using(name string) error
|
|
||||||
|
|
||||||
DBStats() *sql.DBStats
|
DBStats() *sql.DBStats
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
docker-compose -f test_docker_compose.yaml up -d
|
docker-compose -f "$(pwd)/scripts/test_docker_compose.yaml" up -d
|
||||||
|
|
||||||
export ORM_DRIVER=mysql
|
export ORM_DRIVER=mysql
|
||||||
export TZ=UTC
|
export TZ=UTC
|
||||||
export ORM_SOURCE="beego:test@tcp(localhost:13306)/orm_test?charset=utf8"
|
export ORM_SOURCE="beego:test@tcp(localhost:13306)/orm_test?charset=utf8"
|
||||||
|
|
||||||
go test ../...
|
go test "$(pwd)/..."
|
||||||
|
|
||||||
# clear all container
|
# clear all container
|
||||||
docker-compose -f test_docker_compose.yaml down
|
docker-compose -f "$(pwd)/scripts/test_docker_compose.yaml" down
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user