Merge pull request #5 from 30x/XAPID-1061

add support for null string cols in DB
diff --git a/data.go b/data.go
index 0a3ea83..9c801ca 100644
--- a/data.go
+++ b/data.go
@@ -18,6 +18,7 @@
 	"sync"
 
 	"github.com/30x/apid-core"
+	"reflect"
 )
 
 var (
@@ -105,7 +106,7 @@
 			WHERE a.resource_blob_id NOT IN
 			(SELECT b.id FROM apid_blob_available as b)
 	)
-	WHERE id != ''
+	WHERE id IS NOT NULL AND id != ''
 	;
 	`)
 	if err != nil {
@@ -148,14 +149,14 @@
 				FROM metadata_runtime_entity_metadata as a
 				INNER JOIN apid_blob_available as b
 				ON a.resource_blob_id = b.id
-				WHERE a.resource_blob_id != ""
+				WHERE a.resource_blob_id IS NOT NULL AND a.resource_blob_id != ""
 			INTERSECT
 				SELECT
 					a.id
 				FROM metadata_runtime_entity_metadata as a
 				INNER JOIN apid_blob_available as b
 				ON a.bean_blob_id = b.id
-				WHERE a.resource_blob_id != ""
+				WHERE a.resource_blob_id IS NOT NULL AND a.resource_blob_id != ""
 
 			UNION
 				SELECT
@@ -163,7 +164,7 @@
 				FROM metadata_runtime_entity_metadata as a
 				INNER JOIN apid_blob_available as b
 				ON a.bean_blob_id = b.id
-				WHERE a.resource_blob_id = ""
+				WHERE a.resource_blob_id IS NULL OR a.resource_blob_id = ""
 		)
 	;
 	`)
@@ -230,28 +231,34 @@
 	return
 }
 
-func dataDeploymentsFromRow(rows *sql.Rows) (deployments []DataDeployment, err error) {
+func dataDeploymentsFromRow(rows *sql.Rows) ([]DataDeployment, error) {
+	tmp, err := structFromRows(reflect.TypeOf((*DataDeployment)(nil)).Elem(), rows)
+	if err != nil {
+		return nil, err
+	}
+	return tmp.([]DataDeployment), nil
+}
+
+func structFromRows(t reflect.Type, rows *sql.Rows) (interface{}, error) {
+	num := t.NumField()
+	cols := make([]interface{}, num)
+	slice := reflect.New(reflect.SliceOf(t)).Elem()
+	for i := range cols {
+		cols[i] = new(sql.NullString)
+	}
 	for rows.Next() {
-		dep := DataDeployment{}
-		err = rows.Scan(
-			&dep.ID,
-			&dep.OrgID,
-			&dep.EnvID,
-			&dep.BlobID,
-			&dep.BlobResourceID,
-			&dep.Type,
-			&dep.Name,
-			&dep.Revision,
-			&dep.Path,
-			&dep.Created,
-			&dep.CreatedBy,
-			&dep.Updated,
-			&dep.UpdatedBy,
-		)
+		v := reflect.New(t).Elem()
+		err := rows.Scan(cols...)
 		if err != nil {
 			return nil, err
 		}
-		deployments = append(deployments, dep)
+		for i := range cols {
+			p := cols[i].(*sql.NullString)
+			if p.Valid {
+				v.Field(i).SetString(p.String)
+			}
+		}
+		slice = reflect.Append(slice, v)
 	}
-	return
+	return slice.Interface(), nil
 }
diff --git a/data_test.go b/data_test.go
index 6be7da7..b3abc2f 100644
--- a/data_test.go
+++ b/data_test.go
@@ -189,7 +189,7 @@
 		'73fcac6c-5d9f-44c1-8db0-333efda3e6e8',
 		'',
 		'gcs:SHA-512:39ca7ae89bb9468af34df8bc873748b4035210c91bcc01359c092c1d51364b5f3df06bc69a40621acfaa46791af9ea41bc0f3429a84738ba1a7c8d394859601a',
-		'',
+		NULL,
 		'ORGANIZATION',
 		'Org1',
 		'',