Pārlūkot izejas kodu

current status, it "works"

Moritz Schmidt 9 gadi atpakaļ
vecāks
revīzija
f77dccea0d
1 mainītis faili ar 43 papildinājumiem un 38 dzēšanām
  1. 43 38
      databaseutils.go

+ 43 - 38
databaseutils.go

@@ -3,13 +3,19 @@ package databaseutils
 import (
   "database/sql"
   _ "github.com/go-sql-driver/mysql"
-  "fmt"
+  "errors"
 )
 
 var (
   DBUtil *DBUtils
 )
 
+const (
+  ERR_EMPTY_RESULT = "ERR_EMPTY_RESULT"
+  ERR_NO_COLUMNS = "ERR_NO_COLUMNS"
+  ERR_FAILED_ROW_SCAN = "ERR_FAILED_ROW_SCAN"
+)
+
 type DBUtils struct {
   User string
   Password string
@@ -38,27 +44,27 @@ func (dbUtil DBUtils) Close() {
 }
 
 func (dbUtil DBUtils) GetString(what string, from string, where string, wherevalue string) string {
-  var username string
+  var buf string
 
   rows, err := dbUtil.Handle.Query("SELECT " + what + " FROM " + from + " WHERE " + where + " = " + wherevalue) // TODO Parse?
   if err != nil {
-  	fmt.Println(err)
+  	panic(err.Error()) // TODO
   }
   defer rows.Close()
+
   for rows.Next() {
-  	err := rows.Scan(&username)
+  	err := rows.Scan(&buf)
   	if err != nil {
-  		fmt.Println(err)
+  		panic(err.Error()) // TODO
   	}
-  	fmt.Println(username)
   }
+
   err = rows.Err()
   if err != nil {
-  	fmt.Println(err)
+  	panic(err.Error()) // TODO
   }
 
-  return username
-
+  return buf
 }
 
 // GetRow(what, from, where, wherevalue)
@@ -71,46 +77,45 @@ func (dbUtil DBUtils) GetRow(options ...string) ([]string, error) {
   } else {
     rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1]) // TODO Parse?
   }
+  defer rows.Close()
 
   if err != nil {
-    fmt.Println(err)
+    panic(err.Error()) // TODO
   }
 
   cols, err := rows.Columns()
    if err != nil {
-     fmt.Println("Failed to get columns", err)
-     var x []string;
-     x[0] = "";
-     return x, err
+     return []string{""}, errors.New(ERR_NO_COLUMNS)
    }
 
-   // Result is your slice string.
-   rawResult := make([][]byte, len(cols))
-   result := make([]string, len(cols))
+   dest := make([]interface{}, len(cols)) // interface for scanning
+   result := make([]sql.NullString, len(cols)) // NullString to check if empty
+   results := make([]string, len(cols)) // final return-result
 
-   dest := make([]interface{}, len(cols)) // A temporary interface{} slice
-   for i, _ := range rawResult {
-     dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
+   for i, _ := range result {
+     dest[i] = &result[i] // Put pointers to each string in the interface slice
    }
 
-   for rows.Next() {
-     err = rows.Scan(dest...)
-     if err != nil {
-         fmt.Println("Failed to scan row", err)
-         var x []string;
-         x[0] = "";
-         return x
-     }
-
-     for i, raw := range rawResult {
-         if raw == nil {
-             result[i] = "\\N"
-         } else {
-             result[i] = string(raw)
-         }
-     }
-   }
+  for rows.Next() {
+    err = rows.Scan(dest...) // copy results in dest
+    if err != nil {
+        return []string{""}, errors.New(ERR_FAILED_ROW_SCAN)
+    }
+  }
+
+  errcounter := 0 // count invalid results
 
-  return result
+  for i, _ := range result {
+    if result[i].Valid {
+      results[i] = result[i].String
+    } else {
+      errcounter++
+    }
+  }
+
+  if errcounter == len(cols) { // if nothings valid it's empty
+    return []string{""}, errors.New(ERR_EMPTY_RESULT)
+  }
 
+  return results, nil
 }