diff --git a/g_model.go b/g_model.go index 476e25c..e6b7ff0 100644 --- a/g_model.go +++ b/g_model.go @@ -14,7 +14,6 @@ func generateModel(mname, fields, crupath string) { i := strings.LastIndex(p[:len(p)-1], "/") packageName = p[i+1 : len(p)-1] } - ColorLog("[INFO] Using '%s' as model name\n", modelName) ColorLog("[INFO] Using '%s' as package name\n", packageName) fp := path.Join(crupath, "models", p) @@ -28,9 +27,16 @@ func generateModel(mname, fields, crupath string) { fpath := path.Join(fp, strings.ToLower(modelName)+".go") if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil { defer f.Close() - content := strings.Replace(modelTpl, "{{packageName}}", packageName, -1) + var content string + if fields != "" { + generateStructure(modelName,fields,crupath) + content = strings.Replace(CRUD_MODEL_TPL, "{{packageName}}", packageName, -1) + pkgPath := getPackagePath(crupath) + content = strings.Replace(content, "{{pkgPath}}", pkgPath, -1) + } else { + content = strings.Replace(BASE_MODEL_TPL, "{{packageName}}", packageName, -1) + } content = strings.Replace(content, "{{modelName}}", modelName, -1) - f.WriteString(content) // gofmt generated source code formatSourceCode(fpath) @@ -42,143 +48,172 @@ func generateModel(mname, fields, crupath string) { } } -var modelTpl = `package {{packageName}} +const ( + BASE_MODEL_TPL = `package {{packageName}} -import ( - "errors" - "fmt" - "reflect" - "strings" - {{timePkg}} - "github.com/astaxie/beego/orm" -) + // Add{{modelName}} insert a new {{modelName}} into database and returns + // last inserted Id on success. + func Add{{modelName}}() () { -{{modelStruct}} - -func init() { - orm.RegisterModel(new({{modelName}})) -} - -// Add{{modelName}} insert a new {{modelName}} into database and returns -// last inserted Id on success. -func Add{{modelName}}(m *{{modelName}}) (id int64, err error) { - o := orm.NewOrm() - id, err = o.Insert(m) - return -} - -// Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if -// Id doesn't exist -func Get{{modelName}}ById(id int64) (v *{{modelName}}, err error) { - o := orm.NewOrm() - v = &{{modelName}}{Id: id} - if err = o.Read(v); err == nil { - return v, nil } - return nil, err -} -// GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if -// no records exist -func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string, - offset int64, limit int64) (ml []interface{}, err error) { - o := orm.NewOrm() - qs := o.QueryTable(new({{modelName}})) - // query k=v - for k, v := range query { - // rewrite dot-notation to Object__Attribute - k = strings.Replace(k, ".", "__", -1) - qs = qs.Filter(k, v) + // Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if + // Id doesn't exist + func Get{{modelName}}ById() () { + } - // order by: - var sortFields []string - if len(sortby) != 0 { - if len(sortby) == len(order) { - // 1) for each sort field, there is an associated order - for i, v := range sortby { - orderby := "" - if order[i] == "desc" { - orderby = "-" + v - } else if order[i] == "asc" { - orderby = v - } else { - return nil, errors.New("Error: Invalid order. Must be either [asc|desc]") - } - sortFields = append(sortFields, orderby) - } - qs = qs.OrderBy(sortFields...) - } else if len(sortby) != len(order) && len(order) == 1 { - // 2) there is exactly one order, all the sorted fields will be sorted by this order - for _, v := range sortby { - orderby := "" - if order[0] == "desc" { - orderby = "-" + v - } else if order[0] == "asc" { - orderby = v - } else { - return nil, errors.New("Error: Invalid order. Must be either [asc|desc]") - } - sortFields = append(sortFields, orderby) - } - } else if len(sortby) != len(order) && len(order) != 1 { - return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1") - } - } else { - if len(order) != 0 { - return nil, errors.New("Error: unused 'order' fields") + + // GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if + // no records exist + func GetAll{{modelName}}() () { + + } + + // Update{{modelName}} updates {{modelName}} by Id and returns error if + // the record to be updated doesn't exist + func Update{{modelName}}ById() () { + + } + + // Delete{{modelName}} deletes {{modelName}} by Id and returns error if + // the record to be deleted doesn't exist + func Delete{{modelName}}() () { + + } + ` + CRUD_MODEL_TPL = `package {{packageName}} + + import ( + "{{pkgPath}}/structures" + "errors" + "fmt" + "reflect" + "strings" + + "github.com/astaxie/beego/orm" + ) + + // Add{{modelName}} insert a new {{modelName}} into database and returns + // last inserted Id on success. + func Add{{modelName}}(m *structures.{{modelName}}) (id int64, err error) { + o := orm.NewOrm() + id, err = o.Insert(m) + return + } + + // Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if + // Id doesn't exist + func Get{{modelName}}ById(id int64) (v *structures.{{modelName}}, err error) { + o := orm.NewOrm() + v = &structures.{{modelName}}{Id: id} + if err = o.Read(v); err == nil { + return v, nil } + return nil, err } - var l []{{modelName}} - qs = qs.OrderBy(sortFields...) - if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil { - if len(fields) == 0 { - for _, v := range l { - ml = append(ml, v) + // GetAll{{modelName}} retrieves all {{modelName}} matches certain condition. Returns empty list if + // no records exist + func GetAll{{modelName}}(query map[string]string, fields []string, sortby []string, order []string, + offset int64, limit int64) (ml []interface{}, err error) { + o := orm.NewOrm() + qs := o.QueryTable(new(structures.{{modelName}})) + // query k=v + for k, v := range query { + // rewrite dot-notation to Object__Attribute + k = strings.Replace(k, ".", "__", -1) + qs = qs.Filter(k, v) + } + // order by: + var sortFields []string + if len(sortby) != 0 { + if len(sortby) == len(order) { + // 1) for each sort field, there is an associated order + for i, v := range sortby { + orderby := "" + if order[i] == "desc" { + orderby = "-" + v + } else if order[i] == "asc" { + orderby = v + } else { + return nil, errors.New("Error: Invalid order. Must be either [asc|desc]") + } + sortFields = append(sortFields, orderby) + } + qs = qs.OrderBy(sortFields...) + } else if len(sortby) != len(order) && len(order) == 1 { + // 2) there is exactly one order, all the sorted fields will be sorted by this order + for _, v := range sortby { + orderby := "" + if order[0] == "desc" { + orderby = "-" + v + } else if order[0] == "asc" { + orderby = v + } else { + return nil, errors.New("Error: Invalid order. Must be either [asc|desc]") + } + sortFields = append(sortFields, orderby) + } + } else if len(sortby) != len(order) && len(order) != 1 { + return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1") } } else { - // trim unused fields - for _, v := range l { - m := make(map[string]interface{}) - val := reflect.ValueOf(v) - for _, fname := range fields { - m[fname] = val.FieldByName(fname).Interface() - } - ml = append(ml, m) + if len(order) != 0 { + return nil, errors.New("Error: unused 'order' fields") } } - return ml, nil - } - return nil, err -} -// Update{{modelName}} updates {{modelName}} by Id and returns error if -// the record to be updated doesn't exist -func Update{{modelName}}ById(m *{{modelName}}) (err error) { - o := orm.NewOrm() - v := {{modelName}}{Id: m.Id} - // ascertain id exists in the database - if err = o.Read(&v); err == nil { - var num int64 - if num, err = o.Update(m); err == nil { - fmt.Println("Number of records updated in database:", num) + var l []structures.{{modelName}} + qs = qs.OrderBy(sortFields...) + if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil { + if len(fields) == 0 { + for _, v := range l { + ml = append(ml, v) + } + } else { + // trim unused fields + for _, v := range l { + m := make(map[string]interface{}) + val := reflect.ValueOf(v) + for _, fname := range fields { + m[fname] = val.FieldByName(fname).Interface() + } + ml = append(ml, m) + } + } + return ml, nil } + return nil, err } - return -} -// Delete{{modelName}} deletes {{modelName}} by Id and returns error if -// the record to be deleted doesn't exist -func Delete{{modelName}}(id int64) (err error) { - o := orm.NewOrm() - v := {{modelName}}{Id: id} - // ascertain id exists in the database - if err = o.Read(&v); err == nil { - var num int64 - if num, err = o.Delete(&{{modelName}}{Id: id}); err == nil { - fmt.Println("Number of records deleted in database:", num) + // Update{{modelName}} updates {{modelName}} by Id and returns error if + // the record to be updated doesn't exist + func Update{{modelName}}ById(m *structures.{{modelName}}) (err error) { + o := orm.NewOrm() + v := structures.{{modelName}}{Id: m.Id} + // ascertain id exists in the database + if err = o.Read(&v); err == nil { + var num int64 + if num, err = o.Update(m); err == nil { + fmt.Println("Number of records updated in database:", num) + } } + return } - return -} -` + + // Delete{{modelName}} deletes {{modelName}} by Id and returns error if + // the record to be deleted doesn't exist + func Delete{{modelName}}(id int64) (err error) { + o := orm.NewOrm() + v := structures.{{modelName}}{Id: id} + // ascertain id exists in the database + if err = o.Read(&v); err == nil { + var num int64 + if num, err = o.Delete(&structures.{{modelName}}{Id: id}); err == nil { + fmt.Println("Number of records deleted in database:", num) + } + } + return + } + ` +) diff --git a/g_structure.go b/g_structure.go index 8274215..bfe950d 100644 --- a/g_structure.go +++ b/g_structure.go @@ -53,7 +53,7 @@ func generateStructure(cname, fields, crupath string) { content = strings.Replace(STRUCTURE_TPL, "{{packageName}}", packageName, -1) content = strings.Replace(content, "{{structStruct}}", structStruct, -1) if hastime { - content = strings.Replace(content, "{{timePkg}}", `import("time")`, -1) + content = strings.Replace(content, "{{timePkg}}", `"time"`, -1) } else { content = strings.Replace(content, "{{timePkg}}", "", -1) } @@ -138,14 +138,18 @@ func getType(ktype string) (kt, tag string, hasTime bool) { const ( BAST_STRUCTURE_TPL = `package {{packageName}} - type {{structureName}}Struct struct { + type {{structureName}} struct { } ` STRUCTURE_TPL = `package {{packageName}} + import( + "github.com/astaxie/beego/orm" + {{timePkg}} + ) {{structStruct}}