Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit c68531d

Browse files
authored
Add lasterror on statement to return errors when chain operations (#1151)
* add lasterror on statement to return errors when chain operations * add tests for last error * refactor error
1 parent 58b4f7f commit c68531d

9 files changed

+49
-3
lines changed

error.go

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ var (
2626
ErrNotImplemented = errors.New("Not implemented")
2727
// ErrConditionType condition type unsupported
2828
ErrConditionType = errors.New("Unsupported condition type")
29+
// ErrUnSupportedSQLType parameter of SQL is not supported
30+
ErrUnSupportedSQLType = errors.New("unsupported sql type")
2931
)
3032

3133
// ErrFieldIsNotExist columns does not exist

session_delete.go

+4
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
7979
defer session.Close()
8080
}
8181

82+
if session.statement.lastError != nil {
83+
return 0, session.statement.lastError
84+
}
85+
8286
if err := session.statement.setRefBean(bean); err != nil {
8387
return 0, err
8488
}

session_exist.go

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) {
1919
defer session.Close()
2020
}
2121

22+
if session.statement.lastError != nil {
23+
return false, session.statement.lastError
24+
}
25+
2226
var sqlStr string
2327
var args []interface{}
2428
var err error

session_find.go

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...inte
6363
}
6464

6565
func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error {
66+
if session.statement.lastError != nil {
67+
return session.statement.lastError
68+
}
69+
6670
sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr))
6771
if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map {
6872
return errors.New("needs a pointer to a slice or a map")

session_get.go

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ func (session *Session) Get(bean interface{}) (bool, error) {
2424
}
2525

2626
func (session *Session) get(bean interface{}) (bool, error) {
27+
if session.statement.lastError != nil {
28+
return false, session.statement.lastError
29+
}
30+
2731
beanValue := reflect.ValueOf(bean)
2832
if beanValue.Kind() != reflect.Ptr {
2933
return false, errors.New("needs a pointer to a value")

session_iterate.go

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error {
2323
defer session.Close()
2424
}
2525

26+
if session.statement.lastError != nil {
27+
return session.statement.lastError
28+
}
29+
2630
if session.statement.bufferSize > 0 {
2731
return session.bufferIterate(bean, fun)
2832
}

session_update.go

+4
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
147147
defer session.Close()
148148
}
149149

150+
if session.statement.lastError != nil {
151+
return 0, session.statement.lastError
152+
}
153+
150154
v := rValue(bean)
151155
t := v.Type()
152156

session_update_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -1331,3 +1331,21 @@ func TestUpdateCondiBean(t *testing.T) {
13311331
assert.NoError(t, err)
13321332
assert.True(t, has)
13331333
}
1334+
1335+
func TestWhereCondErrorWhenUpdate(t *testing.T) {
1336+
type AuthRequestError struct {
1337+
ChallengeToken string
1338+
RequestToken string
1339+
}
1340+
1341+
assert.NoError(t, prepareEngine())
1342+
assertSync(t, new(AuthRequestError))
1343+
1344+
_, err := testEngine.Cols("challenge_token", "request_token", "challenge_agent", "status").
1345+
Where(&AuthRequestError{ChallengeToken: "1"}).
1346+
Update(&AuthRequestError{
1347+
ChallengeToken: "2",
1348+
})
1349+
assert.Error(t, err)
1350+
assert.EqualValues(t, ErrConditionType, err)
1351+
}

statement.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type Statement struct {
6060
cond builder.Cond
6161
bufferSize int
6262
context ContextCache
63+
lastError error
6364
}
6465

6566
// Init reset all the statement's fields
@@ -101,6 +102,7 @@ func (statement *Statement) Init() {
101102
statement.cond = builder.NewCond()
102103
statement.bufferSize = 0
103104
statement.context = nil
105+
statement.lastError = nil
104106
}
105107

106108
// NoAutoCondition if you do not want convert bean's field as query condition, then use this function
@@ -125,13 +127,13 @@ func (statement *Statement) SQL(query interface{}, args ...interface{}) *Stateme
125127
var err error
126128
statement.RawSQL, statement.RawParams, err = query.(*builder.Builder).ToSQL()
127129
if err != nil {
128-
statement.Engine.logger.Error(err)
130+
statement.lastError = err
129131
}
130132
case string:
131133
statement.RawSQL = query.(string)
132134
statement.RawParams = args
133135
default:
134-
statement.Engine.logger.Error("unsupported sql type")
136+
statement.lastError = ErrUnSupportedSQLType
135137
}
136138

137139
return statement
@@ -160,7 +162,7 @@ func (statement *Statement) And(query interface{}, args ...interface{}) *Stateme
160162
}
161163
}
162164
default:
163-
// TODO: not support condition type
165+
statement.lastError = ErrConditionType
164166
}
165167

166168
return statement

0 commit comments

Comments
 (0)