some fix
Showing
9 changed files
with
226 additions
and
235 deletions
| ... | @@ -406,7 +406,7 @@ func (d *dbTables) getLimitSql(offset int64, limit int) (limits string) { | ... | @@ -406,7 +406,7 @@ func (d *dbTables) getLimitSql(offset int64, limit int) (limits string) { |
| 406 | if limit < 0 { | 406 | if limit < 0 { |
| 407 | // no limit | 407 | // no limit |
| 408 | if offset > 0 { | 408 | if offset > 0 { |
| 409 | limits = fmt.Sprintf("OFFSET %d", offset) | 409 | limits = fmt.Sprintf("LIMIT 18446744073709551615 OFFSET %d", offset) |
| 410 | } | 410 | } |
| 411 | } else if offset <= 0 { | 411 | } else if offset <= 0 { |
| 412 | limits = fmt.Sprintf("LIMIT %d", limit) | 412 | limits = fmt.Sprintf("LIMIT %d", limit) |
| ... | @@ -732,7 +732,7 @@ func (d *dbBase) DeleteBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Con | ... | @@ -732,7 +732,7 @@ func (d *dbBase) DeleteBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Con |
| 732 | 732 | ||
| 733 | refs := make([]interface{}, colsNum) | 733 | refs := make([]interface{}, colsNum) |
| 734 | for i, _ := range refs { | 734 | for i, _ := range refs { |
| 735 | var ref string | 735 | var ref interface{} |
| 736 | refs[i] = &ref | 736 | refs[i] = &ref |
| 737 | } | 737 | } |
| 738 | 738 | ||
| ... | @@ -842,7 +842,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi | ... | @@ -842,7 +842,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi |
| 842 | 842 | ||
| 843 | refs := make([]interface{}, colsNum) | 843 | refs := make([]interface{}, colsNum) |
| 844 | for i, _ := range refs { | 844 | for i, _ := range refs { |
| 845 | var ref string | 845 | var ref interface{} |
| 846 | refs[i] = &ref | 846 | refs[i] = &ref |
| 847 | } | 847 | } |
| 848 | 848 | ||
| ... | @@ -882,18 +882,20 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi | ... | @@ -882,18 +882,20 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi |
| 882 | lastm := mmi | 882 | lastm := mmi |
| 883 | mmi := fi.relModelInfo | 883 | mmi := fi.relModelInfo |
| 884 | field := reflect.Indirect(last.Field(fi.fieldIndex)) | 884 | field := reflect.Indirect(last.Field(fi.fieldIndex)) |
| 885 | d.setColsValues(mmi, &field, mmi.fields.dbcols, trefs[:len(mmi.fields.dbcols)]) | 885 | if field.IsValid() { |
| 886 | for _, fi := range mmi.fields.fieldsReverse { | 886 | d.setColsValues(mmi, &field, mmi.fields.dbcols, trefs[:len(mmi.fields.dbcols)]) |
| 887 | if fi.reverseFieldInfo.mi == lastm { | 887 | for _, fi := range mmi.fields.fieldsReverse { |
| 888 | if fi.reverseFieldInfo != nil { | 888 | if fi.reverseFieldInfo.mi == lastm { |
| 889 | field.Field(fi.fieldIndex).Set(last.Addr()) | 889 | if fi.reverseFieldInfo != nil { |
| 890 | field.Field(fi.fieldIndex).Set(last.Addr()) | ||
| 891 | } | ||
| 890 | } | 892 | } |
| 891 | } | 893 | } |
| 894 | cacheV[names] = &field | ||
| 895 | cacheM[names] = mmi | ||
| 896 | last = field | ||
| 892 | } | 897 | } |
| 893 | trefs = trefs[len(mmi.fields.dbcols):] | 898 | trefs = trefs[len(mmi.fields.dbcols):] |
| 894 | cacheV[names] = &field | ||
| 895 | cacheM[names] = mmi | ||
| 896 | last = field | ||
| 897 | } | 899 | } |
| 898 | } | 900 | } |
| 899 | } | 901 | } |
| ... | @@ -961,10 +963,15 @@ func (d *dbBase) GetOperatorSql(mi *modelInfo, operator string, args []interface | ... | @@ -961,10 +963,15 @@ func (d *dbBase) GetOperatorSql(mi *modelInfo, operator string, args []interface |
| 961 | sql = operatorsSQL[operator] | 963 | sql = operatorsSQL[operator] |
| 962 | arg := params[0] | 964 | arg := params[0] |
| 963 | switch operator { | 965 | switch operator { |
| 966 | case "exact": | ||
| 967 | if arg == nil { | ||
| 968 | params[0] = "IS NULL" | ||
| 969 | } | ||
| 964 | case "iexact", "contains", "icontains", "startswith", "endswith", "istartswith", "iendswith": | 970 | case "iexact", "contains", "icontains", "startswith", "endswith", "istartswith", "iendswith": |
| 965 | param := strings.Replace(ToStr(arg), `%`, `\%`, -1) | 971 | param := strings.Replace(ToStr(arg), `%`, `\%`, -1) |
| 966 | switch operator { | 972 | switch operator { |
| 967 | case "iexact", "contains", "icontains": | 973 | case "iexact": |
| 974 | case "contains", "icontains": | ||
| 968 | param = fmt.Sprintf("%%%s%%", param) | 975 | param = fmt.Sprintf("%%%s%%", param) |
| 969 | case "startswith", "istartswith": | 976 | case "startswith", "istartswith": |
| 970 | param = fmt.Sprintf("%s%%", param) | 977 | param = fmt.Sprintf("%s%%", param) |
| ... | @@ -1143,203 +1150,59 @@ setValue: | ... | @@ -1143,203 +1150,59 @@ setValue: |
| 1143 | switch { | 1150 | switch { |
| 1144 | case fieldType == TypeBooleanField: | 1151 | case fieldType == TypeBooleanField: |
| 1145 | if isNative { | 1152 | if isNative { |
| 1153 | if value == nil { | ||
| 1154 | value = false | ||
| 1155 | } | ||
| 1146 | field.SetBool(value.(bool)) | 1156 | field.SetBool(value.(bool)) |
| 1147 | } | 1157 | } |
| 1148 | case fieldType == TypeCharField || fieldType == TypeTextField: | 1158 | case fieldType == TypeCharField || fieldType == TypeTextField: |
| 1149 | if isNative { | 1159 | if isNative { |
| 1160 | if value == nil { | ||
| 1161 | value = "" | ||
| 1162 | } | ||
| 1150 | field.SetString(value.(string)) | 1163 | field.SetString(value.(string)) |
| 1151 | } | 1164 | } |
| 1152 | case fieldType == TypeDateField || fieldType == TypeDateTimeField: | 1165 | case fieldType == TypeDateField || fieldType == TypeDateTimeField: |
| 1153 | if isNative { | 1166 | if isNative { |
| 1167 | if value == nil { | ||
| 1168 | value = time.Time{} | ||
| 1169 | } | ||
| 1154 | field.Set(reflect.ValueOf(value)) | 1170 | field.Set(reflect.ValueOf(value)) |
| 1155 | } | 1171 | } |
| 1156 | case fieldType&IsIntegerField > 0: | 1172 | case fieldType&IsIntegerField > 0: |
| 1157 | if fieldType&IsPostiveIntegerField > 0 { | 1173 | if fieldType&IsPostiveIntegerField > 0 { |
| 1158 | if isNative { | 1174 | if isNative { |
| 1175 | if value == nil { | ||
| 1176 | value = uint64(0) | ||
| 1177 | } | ||
| 1159 | field.SetUint(value.(uint64)) | 1178 | field.SetUint(value.(uint64)) |
| 1160 | } | 1179 | } |
| 1161 | } else { | 1180 | } else { |
| 1162 | if isNative { | 1181 | if isNative { |
| 1182 | if value == nil { | ||
| 1183 | value = int64(0) | ||
| 1184 | } | ||
| 1163 | field.SetInt(value.(int64)) | 1185 | field.SetInt(value.(int64)) |
| 1164 | } | 1186 | } |
| 1165 | } | 1187 | } |
| 1166 | case fieldType == TypeFloatField || fieldType == TypeDecimalField: | 1188 | case fieldType == TypeFloatField || fieldType == TypeDecimalField: |
| 1167 | if isNative { | 1189 | if isNative { |
| 1190 | if value == nil { | ||
| 1191 | value = float64(0) | ||
| 1192 | } | ||
| 1168 | field.SetFloat(value.(float64)) | 1193 | field.SetFloat(value.(float64)) |
| 1169 | } | 1194 | } |
| 1170 | case fieldType&IsRelField > 0: | 1195 | case fieldType&IsRelField > 0: |
| 1171 | fieldType = fi.relModelInfo.fields.pk[0].fieldType | 1196 | if value != nil { |
| 1172 | mf := reflect.New(fi.relModelInfo.addrField.Elem().Type()) | 1197 | fieldType = fi.relModelInfo.fields.pk[0].fieldType |
| 1173 | md := mf.Interface().(Modeler) | 1198 | mf := reflect.New(fi.relModelInfo.addrField.Elem().Type()) |
| 1174 | md.Init(md) | 1199 | md := mf.Interface().(Modeler) |
| 1175 | field.Set(mf) | 1200 | md.Init(md) |
| 1176 | f := mf.Elem().Field(fi.relModelInfo.fields.pk[0].fieldIndex) | 1201 | field.Set(mf) |
| 1177 | field = &f | 1202 | f := mf.Elem().Field(fi.relModelInfo.fields.pk[0].fieldIndex) |
| 1178 | goto setValue | 1203 | field = &f |
| 1179 | } | 1204 | goto setValue |
| 1180 | |||
| 1181 | if isNative == false { | ||
| 1182 | fd := field.Addr().Interface().(Fielder) | ||
| 1183 | err := fd.SetRaw(value) | ||
| 1184 | if err != nil { | ||
| 1185 | return nil, err | ||
| 1186 | } | ||
| 1187 | } | ||
| 1188 | |||
| 1189 | return value, nil | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | func (d *dbBase) xsetValue(fi *fieldInfo, val interface{}, field *reflect.Value) (interface{}, error) { | ||
| 1193 | if val == nil { | ||
| 1194 | return nil, nil | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | var value interface{} | ||
| 1198 | |||
| 1199 | var str *StrTo | ||
| 1200 | switch v := val.(type) { | ||
| 1201 | case []byte: | ||
| 1202 | s := StrTo(string(v)) | ||
| 1203 | str = &s | ||
| 1204 | case string: | ||
| 1205 | s := StrTo(v) | ||
| 1206 | str = &s | ||
| 1207 | } | ||
| 1208 | |||
| 1209 | fieldType := fi.fieldType | ||
| 1210 | isNative := fi.isFielder == false | ||
| 1211 | |||
| 1212 | setValue: | ||
| 1213 | switch { | ||
| 1214 | case fieldType == TypeBooleanField: | ||
| 1215 | if str == nil { | ||
| 1216 | switch v := val.(type) { | ||
| 1217 | case int64: | ||
| 1218 | b := v == 1 | ||
| 1219 | if isNative { | ||
| 1220 | field.SetBool(b) | ||
| 1221 | } | ||
| 1222 | value = b | ||
| 1223 | default: | ||
| 1224 | s := StrTo(ToStr(v)) | ||
| 1225 | str = &s | ||
| 1226 | } | ||
| 1227 | } | ||
| 1228 | if str != nil { | ||
| 1229 | b, err := str.Bool() | ||
| 1230 | if err != nil { | ||
| 1231 | return nil, err | ||
| 1232 | } | ||
| 1233 | if isNative { | ||
| 1234 | field.SetBool(b) | ||
| 1235 | } | ||
| 1236 | value = b | ||
| 1237 | } | ||
| 1238 | case fieldType == TypeCharField || fieldType == TypeTextField: | ||
| 1239 | s := str.String() | ||
| 1240 | if str == nil { | ||
| 1241 | s = ToStr(val) | ||
| 1242 | } | ||
| 1243 | if isNative { | ||
| 1244 | field.SetString(s) | ||
| 1245 | } | ||
| 1246 | value = s | ||
| 1247 | case fieldType == TypeDateField || fieldType == TypeDateTimeField: | ||
| 1248 | if str == nil { | ||
| 1249 | switch v := val.(type) { | ||
| 1250 | case time.Time: | ||
| 1251 | if isNative { | ||
| 1252 | field.Set(reflect.ValueOf(v)) | ||
| 1253 | } | ||
| 1254 | value = v | ||
| 1255 | default: | ||
| 1256 | s := StrTo(ToStr(v)) | ||
| 1257 | str = &s | ||
| 1258 | } | ||
| 1259 | } | ||
| 1260 | if str != nil { | ||
| 1261 | format := format_DateTime | ||
| 1262 | if fi.fieldType == TypeDateField { | ||
| 1263 | format = format_Date | ||
| 1264 | } | ||
| 1265 | |||
| 1266 | t, err := timeParse(str.String(), format) | ||
| 1267 | if err != nil { | ||
| 1268 | return nil, err | ||
| 1269 | } | ||
| 1270 | if isNative { | ||
| 1271 | field.Set(reflect.ValueOf(t)) | ||
| 1272 | } | ||
| 1273 | value = t | ||
| 1274 | } | ||
| 1275 | case fieldType&IsIntegerField > 0: | ||
| 1276 | if str == nil { | ||
| 1277 | s := StrTo(ToStr(val)) | ||
| 1278 | str = &s | ||
| 1279 | } | ||
| 1280 | if str != nil { | ||
| 1281 | var err error | ||
| 1282 | switch fieldType { | ||
| 1283 | case TypeSmallIntegerField: | ||
| 1284 | value, err = str.Int16() | ||
| 1285 | case TypeIntegerField: | ||
| 1286 | value, err = str.Int32() | ||
| 1287 | case TypeBigIntegerField: | ||
| 1288 | value, err = str.Int64() | ||
| 1289 | case TypePositiveSmallIntegerField: | ||
| 1290 | value, err = str.Uint16() | ||
| 1291 | case TypePositiveIntegerField: | ||
| 1292 | value, err = str.Uint32() | ||
| 1293 | case TypePositiveBigIntegerField: | ||
| 1294 | value, err = str.Uint64() | ||
| 1295 | } | ||
| 1296 | if err != nil { | ||
| 1297 | return nil, err | ||
| 1298 | } | ||
| 1299 | if fieldType&IsPostiveIntegerField > 0 { | ||
| 1300 | v, _ := str.Uint64() | ||
| 1301 | if isNative { | ||
| 1302 | field.SetUint(v) | ||
| 1303 | } | ||
| 1304 | } else { | ||
| 1305 | v, _ := str.Int64() | ||
| 1306 | if isNative { | ||
| 1307 | field.SetInt(v) | ||
| 1308 | } | ||
| 1309 | } | ||
| 1310 | } | ||
| 1311 | case fieldType == TypeFloatField || fieldType == TypeDecimalField: | ||
| 1312 | if str == nil { | ||
| 1313 | switch v := val.(type) { | ||
| 1314 | case float64: | ||
| 1315 | if isNative { | ||
| 1316 | field.SetFloat(v) | ||
| 1317 | } | ||
| 1318 | value = v | ||
| 1319 | default: | ||
| 1320 | s := StrTo(ToStr(v)) | ||
| 1321 | str = &s | ||
| 1322 | } | ||
| 1323 | } | ||
| 1324 | if str != nil { | ||
| 1325 | v, err := str.Float64() | ||
| 1326 | if err != nil { | ||
| 1327 | return nil, err | ||
| 1328 | } | ||
| 1329 | if isNative { | ||
| 1330 | field.SetFloat(v) | ||
| 1331 | } | ||
| 1332 | value = v | ||
| 1333 | } | 1205 | } |
| 1334 | case fieldType&IsRelField > 0: | ||
| 1335 | fieldType = fi.relModelInfo.fields.pk[0].fieldType | ||
| 1336 | mf := reflect.New(fi.relModelInfo.addrField.Elem().Type()) | ||
| 1337 | md := mf.Interface().(Modeler) | ||
| 1338 | md.Init(md) | ||
| 1339 | field.Set(mf) | ||
| 1340 | f := mf.Elem().Field(fi.relModelInfo.fields.pk[0].fieldIndex) | ||
| 1341 | field = &f | ||
| 1342 | goto setValue | ||
| 1343 | } | 1206 | } |
| 1344 | 1207 | ||
| 1345 | if isNative == false { | 1208 | if isNative == false { |
| ... | @@ -1420,7 +1283,7 @@ func (d *dbBase) ReadValues(q dbQuerier, qs *querySet, mi *modelInfo, cond *Cond | ... | @@ -1420,7 +1283,7 @@ func (d *dbBase) ReadValues(q dbQuerier, qs *querySet, mi *modelInfo, cond *Cond |
| 1420 | 1283 | ||
| 1421 | refs := make([]interface{}, len(cols)) | 1284 | refs := make([]interface{}, len(cols)) |
| 1422 | for i, _ := range refs { | 1285 | for i, _ := range refs { |
| 1423 | var ref string | 1286 | var ref interface{} |
| 1424 | refs[i] = &ref | 1287 | refs[i] = &ref |
| 1425 | } | 1288 | } |
| 1426 | 1289 | ... | ... |
| ... | @@ -113,15 +113,18 @@ end: | ... | @@ -113,15 +113,18 @@ end: |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | func RegisterDriver(name string, typ driverType) { | 115 | func RegisterDriver(name string, typ driverType) { |
| 116 | if _, ok := drivers[name]; ok == false { | 116 | if t, ok := drivers[name]; ok == false { |
| 117 | drivers[name] = typ | 117 | drivers[name] = typ |
| 118 | } else { | 118 | } else { |
| 119 | fmt.Println("name `%s` db driver already registered") | 119 | if t != typ { |
| 120 | os.Exit(2) | 120 | fmt.Println("name `%s` db driver already registered and is other type") |
| 121 | os.Exit(2) | ||
| 122 | } | ||
| 121 | } | 123 | } |
| 122 | } | 124 | } |
| 123 | 125 | ||
| 124 | func init() { | 126 | func init() { |
| 125 | // RegisterDriver("mysql", DR_MySQL) | 127 | RegisterDriver("mysql", DR_MySQL) |
| 126 | RegisterDriver("mymysql", DR_MySQL) | 128 | RegisterDriver("postgres", DR_Postgres) |
| 129 | RegisterDriver("sqlite3", DR_Sqlite) | ||
| 127 | } | 130 | } | ... | ... |
| ... | @@ -26,7 +26,7 @@ var ( | ... | @@ -26,7 +26,7 @@ var ( |
| 26 | "auto": 1, | 26 | "auto": 1, |
| 27 | "auto_now": 1, | 27 | "auto_now": 1, |
| 28 | "auto_now_add": 1, | 28 | "auto_now_add": 1, |
| 29 | "max_length": 2, | 29 | "size": 2, |
| 30 | "choices": 2, | 30 | "choices": 2, |
| 31 | "column": 2, | 31 | "column": 2, |
| 32 | "default": 2, | 32 | "default": 2, |
| ... | @@ -37,6 +37,7 @@ var ( | ... | @@ -37,6 +37,7 @@ var ( |
| 37 | "digits": 2, | 37 | "digits": 2, |
| 38 | "decimals": 2, | 38 | "decimals": 2, |
| 39 | "on_delete": 2, | 39 | "on_delete": 2, |
| 40 | "type": 2, | ||
| 40 | } | 41 | } |
| 41 | ) | 42 | ) |
| 42 | 43 | ... | ... |
| ... | @@ -93,10 +93,16 @@ func (e *BooleanField) RawValue() interface{} { | ... | @@ -93,10 +93,16 @@ func (e *BooleanField) RawValue() interface{} { |
| 93 | return e.Value() | 93 | return e.Value() |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | func (e *BooleanField) Clean() error { | ||
| 97 | return nil | ||
| 98 | } | ||
| 99 | |||
| 100 | var _ Fielder = new(BooleanField) | ||
| 101 | |||
| 96 | // A string field | 102 | // A string field |
| 97 | // required values tag: max_length | 103 | // required values tag: size |
| 98 | // The max_length is enforced at the database level and in models’s validation. | 104 | // The size is enforced at the database level and in models’s validation. |
| 99 | // eg: `max_length:"120"` | 105 | // eg: `orm:"size(120)"` |
| 100 | type CharField string | 106 | type CharField string |
| 101 | 107 | ||
| 102 | func (e CharField) Value() string { | 108 | func (e CharField) Value() string { |
| ... | @@ -129,6 +135,12 @@ func (e *CharField) RawValue() interface{} { | ... | @@ -129,6 +135,12 @@ func (e *CharField) RawValue() interface{} { |
| 129 | return e.Value() | 135 | return e.Value() |
| 130 | } | 136 | } |
| 131 | 137 | ||
| 138 | func (e *CharField) Clean() error { | ||
| 139 | return nil | ||
| 140 | } | ||
| 141 | |||
| 142 | var _ Fielder = new(CharField) | ||
| 143 | |||
| 132 | // A date, represented in go by a time.Time instance. | 144 | // A date, represented in go by a time.Time instance. |
| 133 | // only date values like 2006-01-02 | 145 | // only date values like 2006-01-02 |
| 134 | // Has a few extra, optional attr tag: | 146 | // Has a few extra, optional attr tag: |
| ... | @@ -141,7 +153,7 @@ func (e *CharField) RawValue() interface{} { | ... | @@ -141,7 +153,7 @@ func (e *CharField) RawValue() interface{} { |
| 141 | // Automatically set the field to now when the object is first created. Useful for creation of timestamps. | 153 | // Automatically set the field to now when the object is first created. Useful for creation of timestamps. |
| 142 | // Note that the current date is always used; it’s not just a default value that you can override. | 154 | // Note that the current date is always used; it’s not just a default value that you can override. |
| 143 | // | 155 | // |
| 144 | // eg: `attr:"auto_now"` or `attr:"auto_now_add"` | 156 | // eg: `orm:"auto_now"` or `orm:"auto_now_add"` |
| 145 | type DateField time.Time | 157 | type DateField time.Time |
| 146 | 158 | ||
| 147 | func (e DateField) Value() time.Time { | 159 | func (e DateField) Value() time.Time { |
| ... | @@ -180,6 +192,12 @@ func (e *DateField) RawValue() interface{} { | ... | @@ -180,6 +192,12 @@ func (e *DateField) RawValue() interface{} { |
| 180 | return e.Value() | 192 | return e.Value() |
| 181 | } | 193 | } |
| 182 | 194 | ||
| 195 | func (e *DateField) Clean() error { | ||
| 196 | return nil | ||
| 197 | } | ||
| 198 | |||
| 199 | var _ Fielder = new(DateField) | ||
| 200 | |||
| 183 | // A date, represented in go by a time.Time instance. | 201 | // A date, represented in go by a time.Time instance. |
| 184 | // datetime values like 2006-01-02 15:04:05 | 202 | // datetime values like 2006-01-02 15:04:05 |
| 185 | // Takes the same extra arguments as DateField. | 203 | // Takes the same extra arguments as DateField. |
| ... | @@ -221,6 +239,12 @@ func (e *DateTimeField) RawValue() interface{} { | ... | @@ -221,6 +239,12 @@ func (e *DateTimeField) RawValue() interface{} { |
| 221 | return e.Value() | 239 | return e.Value() |
| 222 | } | 240 | } |
| 223 | 241 | ||
| 242 | func (e *DateTimeField) Clean() error { | ||
| 243 | return nil | ||
| 244 | } | ||
| 245 | |||
| 246 | var _ Fielder = new(DateTimeField) | ||
| 247 | |||
| 224 | // A floating-point number represented in go by a float32 value. | 248 | // A floating-point number represented in go by a float32 value. |
| 225 | type FloatField float64 | 249 | type FloatField float64 |
| 226 | 250 | ||
| ... | @@ -261,6 +285,12 @@ func (e *FloatField) RawValue() interface{} { | ... | @@ -261,6 +285,12 @@ func (e *FloatField) RawValue() interface{} { |
| 261 | return e.Value() | 285 | return e.Value() |
| 262 | } | 286 | } |
| 263 | 287 | ||
| 288 | func (e *FloatField) Clean() error { | ||
| 289 | return nil | ||
| 290 | } | ||
| 291 | |||
| 292 | var _ Fielder = new(FloatField) | ||
| 293 | |||
| 264 | // -32768 to 32767 | 294 | // -32768 to 32767 |
| 265 | type SmallIntegerField int16 | 295 | type SmallIntegerField int16 |
| 266 | 296 | ||
| ... | @@ -299,6 +329,12 @@ func (e *SmallIntegerField) RawValue() interface{} { | ... | @@ -299,6 +329,12 @@ func (e *SmallIntegerField) RawValue() interface{} { |
| 299 | return e.Value() | 329 | return e.Value() |
| 300 | } | 330 | } |
| 301 | 331 | ||
| 332 | func (e *SmallIntegerField) Clean() error { | ||
| 333 | return nil | ||
| 334 | } | ||
| 335 | |||
| 336 | var _ Fielder = new(SmallIntegerField) | ||
| 337 | |||
| 302 | // -2147483648 to 2147483647 | 338 | // -2147483648 to 2147483647 |
| 303 | type IntegerField int32 | 339 | type IntegerField int32 |
| 304 | 340 | ||
| ... | @@ -337,6 +373,12 @@ func (e *IntegerField) RawValue() interface{} { | ... | @@ -337,6 +373,12 @@ func (e *IntegerField) RawValue() interface{} { |
| 337 | return e.Value() | 373 | return e.Value() |
| 338 | } | 374 | } |
| 339 | 375 | ||
| 376 | func (e *IntegerField) Clean() error { | ||
| 377 | return nil | ||
| 378 | } | ||
| 379 | |||
| 380 | var _ Fielder = new(IntegerField) | ||
| 381 | |||
| 340 | // -9223372036854775808 to 9223372036854775807. | 382 | // -9223372036854775808 to 9223372036854775807. |
| 341 | type BigIntegerField int64 | 383 | type BigIntegerField int64 |
| 342 | 384 | ||
| ... | @@ -375,6 +417,12 @@ func (e *BigIntegerField) RawValue() interface{} { | ... | @@ -375,6 +417,12 @@ func (e *BigIntegerField) RawValue() interface{} { |
| 375 | return e.Value() | 417 | return e.Value() |
| 376 | } | 418 | } |
| 377 | 419 | ||
| 420 | func (e *BigIntegerField) Clean() error { | ||
| 421 | return nil | ||
| 422 | } | ||
| 423 | |||
| 424 | var _ Fielder = new(BigIntegerField) | ||
| 425 | |||
| 378 | // 0 to 65535 | 426 | // 0 to 65535 |
| 379 | type PositiveSmallIntegerField uint16 | 427 | type PositiveSmallIntegerField uint16 |
| 380 | 428 | ||
| ... | @@ -413,6 +461,12 @@ func (e *PositiveSmallIntegerField) RawValue() interface{} { | ... | @@ -413,6 +461,12 @@ func (e *PositiveSmallIntegerField) RawValue() interface{} { |
| 413 | return e.Value() | 461 | return e.Value() |
| 414 | } | 462 | } |
| 415 | 463 | ||
| 464 | func (e *PositiveSmallIntegerField) Clean() error { | ||
| 465 | return nil | ||
| 466 | } | ||
| 467 | |||
| 468 | var _ Fielder = new(PositiveSmallIntegerField) | ||
| 469 | |||
| 416 | // 0 to 4294967295 | 470 | // 0 to 4294967295 |
| 417 | type PositiveIntegerField uint32 | 471 | type PositiveIntegerField uint32 |
| 418 | 472 | ||
| ... | @@ -451,6 +505,12 @@ func (e *PositiveIntegerField) RawValue() interface{} { | ... | @@ -451,6 +505,12 @@ func (e *PositiveIntegerField) RawValue() interface{} { |
| 451 | return e.Value() | 505 | return e.Value() |
| 452 | } | 506 | } |
| 453 | 507 | ||
| 508 | func (e *PositiveIntegerField) Clean() error { | ||
| 509 | return nil | ||
| 510 | } | ||
| 511 | |||
| 512 | var _ Fielder = new(PositiveIntegerField) | ||
| 513 | |||
| 454 | // 0 to 18446744073709551615 | 514 | // 0 to 18446744073709551615 |
| 455 | type PositiveBigIntegerField uint64 | 515 | type PositiveBigIntegerField uint64 |
| 456 | 516 | ||
| ... | @@ -489,6 +549,12 @@ func (e *PositiveBigIntegerField) RawValue() interface{} { | ... | @@ -489,6 +549,12 @@ func (e *PositiveBigIntegerField) RawValue() interface{} { |
| 489 | return e.Value() | 549 | return e.Value() |
| 490 | } | 550 | } |
| 491 | 551 | ||
| 552 | func (e *PositiveBigIntegerField) Clean() error { | ||
| 553 | return nil | ||
| 554 | } | ||
| 555 | |||
| 556 | var _ Fielder = new(PositiveBigIntegerField) | ||
| 557 | |||
| 492 | // A large text field. | 558 | // A large text field. |
| 493 | type TextField string | 559 | type TextField string |
| 494 | 560 | ||
| ... | @@ -521,3 +587,9 @@ func (e *TextField) SetRaw(value interface{}) error { | ... | @@ -521,3 +587,9 @@ func (e *TextField) SetRaw(value interface{}) error { |
| 521 | func (e *TextField) RawValue() interface{} { | 587 | func (e *TextField) RawValue() interface{} { |
| 522 | return e.Value() | 588 | return e.Value() |
| 523 | } | 589 | } |
| 590 | |||
| 591 | func (e *TextField) Clean() error { | ||
| 592 | return nil | ||
| 593 | } | ||
| 594 | |||
| 595 | var _ Fielder = new(TextField) | ... | ... |
| ... | @@ -145,7 +145,7 @@ type fieldInfo struct { | ... | @@ -145,7 +145,7 @@ type fieldInfo struct { |
| 145 | unique bool | 145 | unique bool |
| 146 | initial StrTo | 146 | initial StrTo |
| 147 | choices fieldChoices | 147 | choices fieldChoices |
| 148 | maxLength int | 148 | size int |
| 149 | auto_now bool | 149 | auto_now bool |
| 150 | auto_now_add bool | 150 | auto_now_add bool |
| 151 | rel bool | 151 | rel bool |
| ... | @@ -188,7 +188,7 @@ func newFieldInfo(mi *modelInfo, field reflect.Value, sf reflect.StructField) (f | ... | @@ -188,7 +188,7 @@ func newFieldInfo(mi *modelInfo, field reflect.Value, sf reflect.StructField) (f |
| 188 | 188 | ||
| 189 | digits := tags["digits"] | 189 | digits := tags["digits"] |
| 190 | decimals := tags["decimals"] | 190 | decimals := tags["decimals"] |
| 191 | maxLength := tags["max_length"] | 191 | size := tags["size"] |
| 192 | onDelete := tags["on_delete"] | 192 | onDelete := tags["on_delete"] |
| 193 | 193 | ||
| 194 | checkType: | 194 | checkType: |
| ... | @@ -248,13 +248,13 @@ checkType: | ... | @@ -248,13 +248,13 @@ checkType: |
| 248 | if err != nil { | 248 | if err != nil { |
| 249 | goto end | 249 | goto end |
| 250 | } | 250 | } |
| 251 | if fieldType == TypeTextField && maxLength != "" { | 251 | if fieldType == TypeTextField && size != "" { |
| 252 | fieldType = TypeCharField | 252 | fieldType = TypeCharField |
| 253 | } | 253 | } |
| 254 | if fieldType == TypeFloatField && (digits != "" || decimals != "") { | 254 | if fieldType == TypeFloatField && (digits != "" || decimals != "") { |
| 255 | fieldType = TypeDecimalField | 255 | fieldType = TypeDecimalField |
| 256 | } | 256 | } |
| 257 | if fieldType == TypeDateTimeField && attrs["date"] { | 257 | if fieldType == TypeDateTimeField && tags["type"] == "date" { |
| 258 | fieldType = TypeDateField | 258 | fieldType = TypeDateField |
| 259 | } | 259 | } |
| 260 | } | 260 | } |
| ... | @@ -354,15 +354,15 @@ checkType: | ... | @@ -354,15 +354,15 @@ checkType: |
| 354 | switch fieldType { | 354 | switch fieldType { |
| 355 | case TypeBooleanField: | 355 | case TypeBooleanField: |
| 356 | case TypeCharField: | 356 | case TypeCharField: |
| 357 | if maxLength != "" { | 357 | if size != "" { |
| 358 | v, e := StrTo(maxLength).Int32() | 358 | v, e := StrTo(size).Int32() |
| 359 | if e != nil { | 359 | if e != nil { |
| 360 | err = fmt.Errorf("wrong maxLength value `%s`", maxLength) | 360 | err = fmt.Errorf("wrong size value `%s`", size) |
| 361 | } else { | 361 | } else { |
| 362 | fi.maxLength = int(v) | 362 | fi.size = int(v) |
| 363 | } | 363 | } |
| 364 | } else { | 364 | } else { |
| 365 | err = fmt.Errorf("maxLength must be specify") | 365 | err = fmt.Errorf("size must be specify") |
| 366 | } | 366 | } |
| 367 | case TypeTextField: | 367 | case TypeTextField: |
| 368 | fi.index = false | 368 | fi.index = false |
| ... | @@ -417,7 +417,6 @@ checkType: | ... | @@ -417,7 +417,6 @@ checkType: |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | if fi.unique { | 419 | if fi.unique { |
| 420 | fi.null = false | ||
| 421 | fi.blank = false | 420 | fi.blank = false |
| 422 | fi.index = false | 421 | fi.index = false |
| 423 | } | 422 | } |
| ... | @@ -484,7 +483,6 @@ checkType: | ... | @@ -484,7 +483,6 @@ checkType: |
| 484 | 483 | ||
| 485 | fi.choices = choices | 484 | fi.choices = choices |
| 486 | fi.initial = initial | 485 | fi.initial = initial |
| 487 | |||
| 488 | end: | 486 | end: |
| 489 | if err != nil { | 487 | if err != nil { |
| 490 | return nil, err | 488 | return nil, err | ... | ... |
| ... | @@ -2,15 +2,43 @@ package orm | ... | @@ -2,15 +2,43 @@ package orm |
| 2 | 2 | ||
| 3 | import () | 3 | import () |
| 4 | 4 | ||
| 5 | type fieldError struct { | ||
| 6 | name string | ||
| 7 | err error | ||
| 8 | } | ||
| 9 | |||
| 10 | func (f *fieldError) Name() string { | ||
| 11 | return f.name | ||
| 12 | } | ||
| 13 | |||
| 14 | func (f *fieldError) Error() error { | ||
| 15 | return f.err | ||
| 16 | } | ||
| 17 | |||
| 18 | func NewFieldError(name string, err error) IFieldError { | ||
| 19 | return &fieldError{name, err} | ||
| 20 | } | ||
| 21 | |||
| 5 | // non cleaned field errors | 22 | // non cleaned field errors |
| 6 | type FieldErrors map[string]error | 23 | type fieldErrors struct { |
| 24 | errors map[string]IFieldError | ||
| 25 | errorList []IFieldError | ||
| 26 | } | ||
| 27 | |||
| 28 | func (fe *fieldErrors) Get(name string) IFieldError { | ||
| 29 | return fe.errors[name] | ||
| 30 | } | ||
| 31 | |||
| 32 | func (fe *fieldErrors) Set(name string, value IFieldError) { | ||
| 33 | fe.errors[name] = value | ||
| 34 | } | ||
| 7 | 35 | ||
| 8 | func (fe FieldErrors) Get(name string) error { | 36 | func (fe *fieldErrors) List() []IFieldError { |
| 9 | return fe[name] | 37 | return fe.errorList |
| 10 | } | 38 | } |
| 11 | 39 | ||
| 12 | func (fe FieldErrors) Set(name string, value error) { | 40 | func NewFieldErrors() IFieldErrors { |
| 13 | fe[name] = value | 41 | return &fieldErrors{errors: make(map[string]IFieldError)} |
| 14 | } | 42 | } |
| 15 | 43 | ||
| 16 | type Manager struct { | 44 | type Manager struct { |
| ... | @@ -43,11 +71,11 @@ func (m *Manager) IsInited() bool { | ... | @@ -43,11 +71,11 @@ func (m *Manager) IsInited() bool { |
| 43 | return m.inited | 71 | return m.inited |
| 44 | } | 72 | } |
| 45 | 73 | ||
| 46 | func (m *Manager) Clean() FieldErrors { | 74 | func (m *Manager) Clean() IFieldErrors { |
| 47 | return nil | 75 | return nil |
| 48 | } | 76 | } |
| 49 | 77 | ||
| 50 | func (m *Manager) CleanFields(name string) FieldErrors { | 78 | func (m *Manager) CleanFields(name string) IFieldErrors { |
| 51 | return nil | 79 | return nil |
| 52 | } | 80 | } |
| 53 | 81 | ... | ... |
| ... | @@ -75,11 +75,20 @@ func (o *object) Update() (int64, error) { | ... | @@ -75,11 +75,20 @@ func (o *object) Update() (int64, error) { |
| 75 | if err != nil { | 75 | if err != nil { |
| 76 | return num, err | 76 | return num, err |
| 77 | } | 77 | } |
| 78 | return 0, nil | 78 | return num, nil |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | func (o *object) Delete() (int64, error) { | 81 | func (o *object) Delete() (int64, error) { |
| 82 | return o.orm.alias.DbBaser.Delete(o.orm.db, o.mi, o.ind) | 82 | num, err := o.orm.alias.DbBaser.Delete(o.orm.db, o.mi, o.ind) |
| 83 | if err != nil { | ||
| 84 | return num, err | ||
| 85 | } | ||
| 86 | if num > 0 { | ||
| 87 | if o.mi.fields.auto != nil { | ||
| 88 | o.ind.Field(o.mi.fields.auto.fieldIndex).SetInt(0) | ||
| 89 | } | ||
| 90 | } | ||
| 91 | return num, nil | ||
| 83 | } | 92 | } |
| 84 | 93 | ||
| 85 | func newObject(orm *orm, mi *modelInfo, md Modeler) ObjectSeter { | 94 | func newObject(orm *orm, mi *modelInfo, md Modeler) ObjectSeter { | ... | ... |
| ... | @@ -16,40 +16,46 @@ type querySet struct { | ... | @@ -16,40 +16,46 @@ type querySet struct { |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | func (o *querySet) Filter(expr string, args ...interface{}) QuerySeter { | 18 | func (o *querySet) Filter(expr string, args ...interface{}) QuerySeter { |
| 19 | o = o.clone() | ||
| 19 | if o.cond == nil { | 20 | if o.cond == nil { |
| 20 | o.cond = NewCondition() | 21 | o.cond = NewCondition() |
| 21 | } | 22 | } |
| 22 | o.cond.And(expr, args...) | 23 | o.cond.And(expr, args...) |
| 23 | return o.Clone() | 24 | return o |
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | func (o *querySet) Exclude(expr string, args ...interface{}) QuerySeter { | 27 | func (o *querySet) Exclude(expr string, args ...interface{}) QuerySeter { |
| 28 | o = o.clone() | ||
| 27 | if o.cond == nil { | 29 | if o.cond == nil { |
| 28 | o.cond = NewCondition() | 30 | o.cond = NewCondition() |
| 29 | } | 31 | } |
| 30 | o.cond.AndNot(expr, args...) | 32 | o.cond.AndNot(expr, args...) |
| 31 | return o.Clone() | 33 | return o |
| 32 | } | 34 | } |
| 33 | 35 | ||
| 34 | func (o *querySet) Limit(limit int, args ...int64) QuerySeter { | 36 | func (o *querySet) Limit(limit int, args ...int64) QuerySeter { |
| 37 | o = o.clone() | ||
| 35 | o.limit = limit | 38 | o.limit = limit |
| 36 | if len(args) > 0 { | 39 | if len(args) > 0 { |
| 37 | o.offset = args[0] | 40 | o.offset = args[0] |
| 38 | } | 41 | } |
| 39 | return o.Clone() | 42 | return o |
| 40 | } | 43 | } |
| 41 | 44 | ||
| 42 | func (o *querySet) Offset(offset int64) QuerySeter { | 45 | func (o *querySet) Offset(offset int64) QuerySeter { |
| 46 | o = o.clone() | ||
| 43 | o.offset = offset | 47 | o.offset = offset |
| 44 | return o.Clone() | 48 | return o |
| 45 | } | 49 | } |
| 46 | 50 | ||
| 47 | func (o *querySet) OrderBy(orders ...string) QuerySeter { | 51 | func (o *querySet) OrderBy(exprs ...string) QuerySeter { |
| 48 | o.orders = orders | 52 | o = o.clone() |
| 49 | return o.Clone() | 53 | o.orders = exprs |
| 54 | return o | ||
| 50 | } | 55 | } |
| 51 | 56 | ||
| 52 | func (o *querySet) RelatedSel(params ...interface{}) QuerySeter { | 57 | func (o *querySet) RelatedSel(params ...interface{}) QuerySeter { |
| 58 | o = o.clone() | ||
| 53 | var related []string | 59 | var related []string |
| 54 | if len(params) == 0 { | 60 | if len(params) == 0 { |
| 55 | o.relDepth = DefaultRelsDepth | 61 | o.relDepth = DefaultRelsDepth |
| ... | @@ -66,19 +72,19 @@ func (o *querySet) RelatedSel(params ...interface{}) QuerySeter { | ... | @@ -66,19 +72,19 @@ func (o *querySet) RelatedSel(params ...interface{}) QuerySeter { |
| 66 | } | 72 | } |
| 67 | } | 73 | } |
| 68 | o.related = related | 74 | o.related = related |
| 69 | return o.Clone() | 75 | return o |
| 70 | } | 76 | } |
| 71 | 77 | ||
| 72 | func (o querySet) Clone() QuerySeter { | 78 | func (o querySet) clone() *querySet { |
| 73 | if o.cond != nil { | 79 | if o.cond != nil { |
| 74 | o.cond = o.cond.Clone() | 80 | o.cond = o.cond.Clone() |
| 75 | } | 81 | } |
| 76 | return &o | 82 | return &o |
| 77 | } | 83 | } |
| 78 | 84 | ||
| 79 | func (o *querySet) SetCond(cond *Condition) error { | 85 | func (o querySet) SetCond(cond *Condition) QuerySeter { |
| 80 | o.cond = cond | 86 | o.cond = cond |
| 81 | return nil | 87 | return &o |
| 82 | } | 88 | } |
| 83 | 89 | ||
| 84 | func (o *querySet) Count() (int64, error) { | 90 | func (o *querySet) Count() (int64, error) { |
| ... | @@ -112,16 +118,16 @@ func (o *querySet) One(container Modeler) error { | ... | @@ -112,16 +118,16 @@ func (o *querySet) One(container Modeler) error { |
| 112 | return nil | 118 | return nil |
| 113 | } | 119 | } |
| 114 | 120 | ||
| 115 | func (o *querySet) Values(results *[]Params, args ...string) (int64, error) { | 121 | func (o *querySet) Values(results *[]Params, exprs ...string) (int64, error) { |
| 116 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, args, results) | 122 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, exprs, results) |
| 117 | } | 123 | } |
| 118 | 124 | ||
| 119 | func (o *querySet) ValuesList(results *[]ParamsList, args ...string) (int64, error) { | 125 | func (o *querySet) ValuesList(results *[]ParamsList, exprs ...string) (int64, error) { |
| 120 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, args, results) | 126 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, exprs, results) |
| 121 | } | 127 | } |
| 122 | 128 | ||
| 123 | func (o *querySet) ValuesFlat(result *ParamsList, arg string) (int64, error) { | 129 | func (o *querySet) ValuesFlat(result *ParamsList, expr string) (int64, error) { |
| 124 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, []string{arg}, result) | 130 | return o.orm.alias.DbBaser.ReadValues(o.orm.db, o, o.mi, o.cond, []string{expr}, result) |
| 125 | } | 131 | } |
| 126 | 132 | ||
| 127 | func newQuerySet(orm *orm, mi *modelInfo) QuerySeter { | 133 | func newQuerySet(orm *orm, mi *modelInfo) QuerySeter { | ... | ... |
| ... | @@ -10,13 +10,14 @@ type Fielder interface { | ... | @@ -10,13 +10,14 @@ type Fielder interface { |
| 10 | FieldType() int | 10 | FieldType() int |
| 11 | SetRaw(interface{}) error | 11 | SetRaw(interface{}) error |
| 12 | RawValue() interface{} | 12 | RawValue() interface{} |
| 13 | Clean() error | ||
| 13 | } | 14 | } |
| 14 | 15 | ||
| 15 | type Modeler interface { | 16 | type Modeler interface { |
| 16 | Init(Modeler) Modeler | 17 | Init(Modeler) Modeler |
| 17 | IsInited() bool | 18 | IsInited() bool |
| 18 | Clean() FieldErrors | 19 | Clean() IFieldErrors |
| 19 | CleanFields(string) FieldErrors | 20 | CleanFields(string) IFieldErrors |
| 20 | GetTableName() string | 21 | GetTableName() string |
| 21 | } | 22 | } |
| 22 | 23 | ||
| ... | @@ -48,8 +49,7 @@ type QuerySeter interface { | ... | @@ -48,8 +49,7 @@ type QuerySeter interface { |
| 48 | Offset(int64) QuerySeter | 49 | Offset(int64) QuerySeter |
| 49 | OrderBy(...string) QuerySeter | 50 | OrderBy(...string) QuerySeter |
| 50 | RelatedSel(...interface{}) QuerySeter | 51 | RelatedSel(...interface{}) QuerySeter |
| 51 | Clone() QuerySeter | 52 | SetCond(*Condition) QuerySeter |
| 52 | SetCond(*Condition) error | ||
| 53 | Count() (int64, error) | 53 | Count() (int64, error) |
| 54 | Update(Params) (int64, error) | 54 | Update(Params) (int64, error) |
| 55 | Delete() (int64, error) | 55 | Delete() (int64, error) |
| ... | @@ -75,6 +75,17 @@ type RawSeter interface { | ... | @@ -75,6 +75,17 @@ type RawSeter interface { |
| 75 | Prepare() (RawPreparer, error) | 75 | Prepare() (RawPreparer, error) |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | type IFieldError interface { | ||
| 79 | Name() string | ||
| 80 | Error() error | ||
| 81 | } | ||
| 82 | |||
| 83 | type IFieldErrors interface { | ||
| 84 | Get(string) IFieldError | ||
| 85 | Set(string, IFieldError) | ||
| 86 | List() []IFieldError | ||
| 87 | } | ||
| 88 | |||
| 78 | type dbQuerier interface { | 89 | type dbQuerier interface { |
| 79 | Prepare(query string) (*sql.Stmt, error) | 90 | Prepare(query string) (*sql.Stmt, error) |
| 80 | Exec(query string, args ...interface{}) (sql.Result, error) | 91 | Exec(query string, args ...interface{}) (sql.Result, error) | ... | ... |
-
Please register or sign in to post a comment