diff --git a/restlet/curd.go b/restlet/curd.go index 3d24780..52d4519 100755 --- a/restlet/curd.go +++ b/restlet/curd.go @@ -194,35 +194,94 @@ func _make_put_or_patch_handle(table *xql.Table, entity interface{}, updatefunc entityType := reflect.TypeOf(entity) log.Debugln("_make_put_or_patch_handle> ", table.TableName, entityType) if nil == post_data || len(post_data) < 1 { + log.Warnln("_make_put_or_patch_handle:> Empty DATA.") return Failure_Response(ERROR_INVALID_DATA, "Empty Data!") } entityObj := reflect.New(entityType) var entityMap map[string]interface{} = make(map[string]interface{}) err = json.Unmarshal(post_data, entityObj.Elem().Addr().Interface()) - e1 := json.Unmarshal(post_data, entityMap) + e1 := json.Unmarshal(post_data, &entityMap) if nil != err || nil != e1 { + log.Warnln("_make_put_or_patch_handle:> Invalid DATA:", err, e1) return Failure_Response(ERROR_INVALID_DATA, "Invalid Data!") } - for _, k := range pks { - if _, ok := url_params.GetString(k); ok { - //entityMap[table.PrimaryKey[i]] = _build_column_query_value(table, table.PrimaryKey[i], "=", v) - return Failure_Response(ERROR_FORBIDDEN, "Not Allowed to Change Primary Key(s).") + if updatefunc != nil { + cols, err := updatefunc(entityObj.Elem().Addr().Interface()) + if nil != err { + log.Warnln("_make_put_or_patch_handle:> Invalid DATA:", err, e1) + return Failure_Response(ERROR_INVALID_DATA, "Invalid Data!") + } + for _, k := range cols { + entityMap[k] = true } } - var pk_mapping map[string]interface{} = _build_params_map(table, url_params, pks...) - if nil != pk_mapping { + //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 + for _, c := range table.Columns { + if _, ok := entityMap[c.FieldName]; ok { - } - session := xql.MakeSession(ctx.SQL(), "postgres", true) - defer session.Close() - result = &RestletResult{} + }else if _, ok := entityMap[c.JTAG]; ok { + }else if _, ok := entityMap[c.PropertyName]; ok { + + }else{ + continue + } + if c.PrimaryKey { + return Failure_Response(ERROR_FORBIDDEN, "Not Allowed to Change Primary Key(s).") + } + uc := xql.UpdateColumn{Field:c.FieldName, Operator:"="} + val := entityObj.Elem().FieldByName(c.PropertyName) + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + uc.Value = val.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + uc.Value = val.Uint() + case reflect.String: + uc.Value = val.String() + case reflect.Bool: + uc.Value = val.Bool() + case reflect.Float32, reflect.Float64: + uc.Value = val.Float() + default: + uc.Value = val.Interface() + } + //uc.Value = + updateCols = append(updateCols, uc) + } qc, err := Build_QueryControl(queries, table) if nil != err { log.Errorln("_make_put_or_patch_handle:> failure:", err) return Failure_Response(ERROR_BAD_REQUEST, fmt.Sprintf("%s", err)) } log.Debugln("_make_put_or_patch_handle> QueryControl:", qc) + var pk_mapping map[string]interface{} = _build_params_map(table, url_params, pks...) + if nil != pk_mapping { + qc.Filters = append(qc.Filters, pk_mapping) + } + session := xql.MakeSession(ctx.SQL(), "postgres", true) + defer session.Close() + n, e := session.Query(table).Filter(qc.Filters...).Update(updateCols) + if nil != e { + log.Errorln("_make_put_or_patch_handle:> failure:", e) + return Failure_Response(FATAL_DB_WRITE_FAILED, fmt.Sprintf("%s", e)) + } + result = &RestletResult{ + Code:SUCCESS_OK, + Model:entityType.Name(), + Data: map[string]interface{}{"Updated": n}, + } return result, nil } return f