Browse Source

Log CP errors in DataTable, allow NULL values

Vova Tkach 5 years ago
parent
commit
8490f2c064
4 changed files with 55 additions and 9 deletions
  1. 10 7
      engine/builder/data_table.go
  2. 7 0
      engine/wrapper/wrapper.go
  3. 29 2
      modules/module_shop.go
  4. 9 0
      utils/utils.go

+ 10 - 7
engine/builder/data_table.go

@@ -1,6 +1,7 @@
 package builder
 
 import (
+	"database/sql"
 	"fmt"
 	"html"
 	"math"
@@ -8,6 +9,7 @@ import (
 
 	"golang-fave/engine/sqlw"
 	"golang-fave/engine/wrapper"
+	"golang-fave/utils"
 )
 
 type DataTableRow struct {
@@ -36,9 +38,10 @@ func DataTable(
 	if pagination_enabled {
 		if custom_sql_count != nil {
 			num, err = custom_sql_count()
+			wrap.LogCpError(err)
 		} else {
 			err = wrap.DB.QueryRow("SELECT COUNT(*) FROM `" + table + "`;").Scan(&num)
-			if err != nil {
+			if wrap.LogCpError(err) != nil {
 				return ""
 			}
 		}
@@ -109,15 +112,15 @@ func DataTable(
 		} else {
 			rows, err = custom_sql_data(limit_offset, pear_page)
 		}
-		if err == nil {
-			values := make([]string, len(*data))
+		if wrap.LogCpError(err) == nil {
+			values := make([]sql.NullString, len(*data))
 			scan := make([]interface{}, len(values))
 			for i := range values {
 				scan[i] = &values[i]
 			}
 			for rows.Next() {
 				err = rows.Scan(scan...)
-				if err == nil {
+				if wrap.LogCpError(err) == nil {
 					if !have_records {
 						have_records = true
 					}
@@ -129,14 +132,14 @@ func DataTable(
 								classes = " " + classes
 							}
 							if (*data)[i].CallBack == nil {
-								result += `<td class="col_` + (*data)[i].DBField + classes + `">` + html.EscapeString(string(val)) + `</td>`
+								result += `<td class="col_` + (*data)[i].DBField + classes + `">` + html.EscapeString(string(val.String)) + `</td>`
 							} else {
-								result += `<td class="col_` + (*data)[i].DBField + classes + `">` + (*data)[i].CallBack(&values) + `</td>`
+								result += `<td class="col_` + (*data)[i].DBField + classes + `">` + (*data)[i].CallBack(utils.SqlNullStringToString(&values)) + `</td>`
 							}
 						}
 					}
 					if action != nil {
-						result += `<td class="col_action">` + action(&values) + `</td>`
+						result += `<td class="col_action">` + action(utils.SqlNullStringToString(&values)) + `</td>`
 					}
 					result += `</tr>`
 				}

+ 7 - 0
engine/wrapper/wrapper.go

@@ -93,6 +93,13 @@ func (this *Wrapper) LogError(msg string, vars ...interface{}) {
 	this.l.Log(msg, this.R, true, vars...)
 }
 
+func (this *Wrapper) LogCpError(err error) error {
+	if err != nil {
+		this.LogError("%s", err)
+	}
+	return err
+}
+
 func (this *Wrapper) dbReconnect() error {
 	if !utils.IsMySqlConfigExists(this.DConfig + string(os.PathSeparator) + "mysql.json") {
 		return errors.New("can't read database configuration file")

+ 29 - 2
modules/module_shop.go

@@ -538,6 +538,9 @@ func (this *Modules) RegisterModule_Shop() *Module {
 							return builder.CheckBox(utils.StrToInt((*values)[6]))
 						},
 					},
+					{
+						DBField: "parent_id",
+					},
 				},
 				func(values *[]string) string {
 					return builder.DataTableAction(&[]builder.DataTableActionRow{
@@ -562,8 +565,32 @@ func (this *Modules) RegisterModule_Shop() *Module {
 					})
 				},
 				"/cp/"+wrap.CurrModule+"/",
-				nil,
-				nil,
+				func() (int, error) {
+					var count int
+					return count, wrap.DB.QueryRow(
+						"SELECT COUNT(*) FROM `shop_products`;",
+					).Scan(&count)
+				},
+				func(limit_offset int, pear_page int) (*sqlw.Rows, error) {
+					return wrap.DB.Query(
+						`SELECT
+							shop_products.id,
+							shop_products.name,
+							shop_products.alias,
+							shop_products.currency,
+							shop_products.price,
+							UNIX_TIMESTAMP(`+"`shop_products`.`datetime`"+`) as datetime,
+							shop_products.active,
+							shop_products.parent_id
+						FROM
+							shop_products
+						ORDER BY
+							shop_products.id DESC
+						LIMIT ?, ?;`,
+						limit_offset,
+						pear_page,
+					)
+				},
 				true,
 			)
 		} else if wrap.CurrSubModule == "categories" {

+ 9 - 0
utils/utils.go

@@ -2,6 +2,7 @@ package utils
 
 import (
 	"crypto/md5"
+	"database/sql"
 	"encoding/hex"
 	"fmt"
 	"html/template"
@@ -446,3 +447,11 @@ func TemplateAdditionalFuncs() template.FuncMap {
 		},
 	}
 }
+
+func SqlNullStringToString(arr *[]sql.NullString) *[]string {
+	values := make([]string, len(*arr))
+	for key, value := range *arr {
+		values[key] = value.String
+	}
+	return &values
+}