2c5e062c by slene

some fix

1 parent c83d03c2
...@@ -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)
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!