Browse Source

Improved: post support multiple objects in slice mode.

develop
Mingcai SHEN 8 years ago
parent
commit
214b388c2c
2 changed files with 45 additions and 31 deletions
  1. +36
    -31
      restlet/curd.go
  2. +9
    -0
      utils/deviceid.go

+ 36
- 31
restlet/curd.go View File

@ -235,18 +235,6 @@ func _make_put_or_patch_handle(table *xql.Table, entity interface{}, updatefunc
entityMap[k] = true entityMap[k] = true
} }
} }
//for i, _ := range pks {
// pk, _ := table.Columns[table.PrimaryKey[i]]
// if _, ok := entityMap[pk.FieldName]; ok {
// return Failure_Response(ERROR_FORBIDDEN, "Not Allowed to Change Primary Key(s).")
// }
// if _, ok := entityMap[pk.JTAG]; ok {
// return Failure_Response(ERROR_FORBIDDEN, "Not Allowed to Change Primary Key(s).")
// }
// if _, ok := entityMap[pk.PropertyName]; ok {
// return Failure_Response(ERROR_FORBIDDEN, "Not Allowed to Change Primary Key(s).")
// }
//}
var updateCols []xql.UpdateColumn var updateCols []xql.UpdateColumn
for _, c := range table.Columns { for _, c := range table.Columns {
if _, ok := entityMap[c.FieldName]; ok { if _, ok := entityMap[c.FieldName]; ok {
@ -317,9 +305,22 @@ func _make_post_handle(table *xql.Table, entity interface{}, inertfunc InsertEnt
if nil == post_data || len(post_data) < 1 { if nil == post_data || len(post_data) < 1 {
return Failure_Response(ERROR_INVALID_DATA, "Empty Data!") return Failure_Response(ERROR_INVALID_DATA, "Empty Data!")
} }
entityObj := reflect.New(entityType)
err = json.Unmarshal(post_data, entityObj.Elem().Addr().Interface())
if nil != err {
//entityObj := reflect.New(entityType)
entityObjs := reflect.MakeSlice(reflect.SliceOf(entityType), 1,2)
//p := reflect.PtrTo(reflect.SliceOf(entityType))
//reflect.Indirect(entityObjs).Addr().Interface()
//err = json.Unmarshal(post_data, entityObj.Elem().Addr().Interface())
//if nil != err {
// return Failure_Response(ERROR_INVALID_DATA, "Invalid Data!")
//}
p := reflect.New(reflect.SliceOf(entityType))
reflect.Indirect(p).Set(entityObjs)
if err = json.Unmarshal(post_data, entityObjs.Index(0).Addr().Interface()); nil == err {
log.Debugln("_make_post_handle>>>: Single Object")
}else if err = json.Unmarshal(post_data, p.Interface()); nil == err {
log.Debugln("_make_post_handle>>>: Slice Objects")
}else{
log.Warnln("Invalid Data:", err)
return Failure_Response(ERROR_INVALID_DATA, "Invalid Data!") return Failure_Response(ERROR_INVALID_DATA, "Invalid Data!")
} }
var pk_mapping map[string]interface{} = _build_params_map(table, url_params, pks...) var pk_mapping map[string]interface{} = _build_params_map(table, url_params, pks...)
@ -333,15 +334,6 @@ func _make_post_handle(table *xql.Table, entity interface{}, inertfunc InsertEnt
pk_mapping[k] = _build_column_query_value(table, k, "=", v) pk_mapping[k] = _build_column_query_value(table, k, "=", v)
} }
} }
if nil != pk_mapping {
_assign_entity_from_map(entityObj.Elem().Addr().Interface(), pk_mapping, false)
}
if nil != inertfunc {
e := inertfunc(entityObj.Elem().Addr().Interface())
if nil != e {
return Failure_Response(ERROR_INVALID_DATA, fmt.Sprint(e))
}
}
session := xql.MakeSession(ctx.SQL(), "postgres", true) session := xql.MakeSession(ctx.SQL(), "postgres", true)
defer session.Close() defer session.Close()
result = &RestletResult{} result = &RestletResult{}
@ -350,12 +342,25 @@ func _make_post_handle(table *xql.Table, entity interface{}, inertfunc InsertEnt
log.Errorln("_make_post_handle:> failure:", err) log.Errorln("_make_post_handle:> failure:", err)
return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err)) return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err))
} }
log.Debugln("_make_post_handle:> Inserting :", entityObj.Elem().Addr().Interface())
_, err = session.Query(table).Insert(entityObj.Elem().Addr().Interface())
if nil != err {
log.Errorln("_make_post_handle:> failure:", err)
session.Rollback()
return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err))
//n := 0
for i := 0; i < entityObjs.Len(); i++ {
obj := entityObjs.Index(i)
if nil != pk_mapping {
_assign_entity_from_map(obj.Addr().Interface(), pk_mapping, false)
}
if nil != inertfunc {
e := inertfunc(obj.Addr().Interface())
if nil != e {
return Failure_Response(ERROR_INVALID_DATA, fmt.Sprint(e))
}
}
log.Debugln("_make_post_handle:> Inserting :", obj.Addr().Interface())
_, err = session.Query(table).Insert(obj.Addr().Interface())
if nil != err {
log.Errorln("_make_post_handle:> failure:", err)
session.Rollback()
return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err))
}
} }
err = session.Commit() err = session.Commit()
if nil != err { if nil != err {
@ -363,7 +368,7 @@ func _make_post_handle(table *xql.Table, entity interface{}, inertfunc InsertEnt
session.Rollback() session.Rollback()
return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err)) return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", err))
} }
result.Data = entityObj.Elem().Addr().Interface()
result.Data = entityObjs.Interface()
result.Code = SUCCESS_CREATED result.Code = SUCCESS_CREATED
return result, nil return result, nil
} }

+ 9
- 0
utils/deviceid.go View File

@ -4,6 +4,7 @@ import (
"encoding/binary" "encoding/binary"
"github.com/archsh/go.uuid" "github.com/archsh/go.uuid"
"crypto/md5" "crypto/md5"
"reflect"
) )
// Generate DeviceId according given prefix and mac, model // Generate DeviceId according given prefix and mac, model
@ -80,6 +81,14 @@ func Validate_DeviceId_Simple(s string) bool {
} }
func MakeObjectId(entity interface{}, refs ...interface{}) string {
refIds := []interface{}{reflect.TypeOf(entity).Name()}
refIds = append(refIds, refs...)
uid := MakeResourceId(refIds...)
return uid.String()
}
func MakeResourceId(refIds ...interface{}) uuid.UUID { func MakeResourceId(refIds ...interface{}) uuid.UUID {
var args []interface{} var args []interface{}
for _, s := range refIds { for _, s := range refIds {

Loading…
Cancel
Save