fix: golangci-lint and gosec warnings
This commit is contained in:
		
							
								
								
									
										16
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -13,6 +13,22 @@ steps: | |||||||
|     - pull_request |     - pull_request | ||||||
|     - tag |     - tag | ||||||
|  |  | ||||||
|  | # - name: golangci-lint | ||||||
|  | #   image: docker.io/golangci/golangci-lint:v1.40.1-alpine | ||||||
|  | #   commands: | ||||||
|  | #   - golangci-lint run --concurrency $(nproc --ignore=1) | ||||||
|  | #   when: | ||||||
|  | #     event: | ||||||
|  | #     - push | ||||||
|  | #     - pull_request | ||||||
|  |  | ||||||
|  | # - name: gosec | ||||||
|  | #   image: docker.io/securego/gosec:v2.8.0 | ||||||
|  | #   when: | ||||||
|  | #     event: | ||||||
|  | #     - push | ||||||
|  | #     - pull_request | ||||||
|  |  | ||||||
| # steps: | # steps: | ||||||
| # - name: test-unit | # - name: test-unit | ||||||
| #   image: docker.io/volkerraschek/build-image:latest | #   image: docker.io/volkerraschek/build-image:latest | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								.golangci.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | run: | ||||||
|  |   skip-dirs: | ||||||
|  |   - it | ||||||
|  |   timeout: 10m | ||||||
|  |   tests: true | ||||||
|  |  | ||||||
|  | linters: | ||||||
|  |   disable-all: true | ||||||
|  |   enable: | ||||||
|  |   # Default | ||||||
|  |   - deadcode | ||||||
|  |   - errcheck | ||||||
|  |   - gosimple | ||||||
|  |   - govet | ||||||
|  |   - ineffassign | ||||||
|  |   - staticcheck | ||||||
|  |   - structcheck | ||||||
|  |   - typecheck | ||||||
|  |   - unused | ||||||
|  |   - varcheck | ||||||
|  |  | ||||||
|  |   # Additionally linters | ||||||
|  |   - bodyclose | ||||||
|  |   - misspell | ||||||
|  |   - nilerr | ||||||
|  |   - rowserrcheck | ||||||
|  |   - sqlclosecheck | ||||||
|  |   - unparam | ||||||
|  |   - whitespace | ||||||
							
								
								
									
										12
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
								
							| @@ -103,6 +103,18 @@ PHONY+=test/coverage | |||||||
| test/coverage: test/unit | test/coverage: test/unit | ||||||
| 	go tool cover -html=coverage.txt | 	go tool cover -html=coverage.txt | ||||||
|  |  | ||||||
|  | # GOLANGCI-LINT | ||||||
|  | # ============================================================================== | ||||||
|  | PHONY+=golangci-lint | ||||||
|  | golangci-lint: | ||||||
|  | 	golangci-lint run --concurrency=$(shell nproc) | ||||||
|  |  | ||||||
|  | # GOSEC | ||||||
|  | # ============================================================================== | ||||||
|  | PHONY+=gosec | ||||||
|  | gosec: | ||||||
|  | 	gosec $(shell pwd)/... | ||||||
|  |  | ||||||
| # PHONY | # PHONY | ||||||
| # ============================================================================== | # ============================================================================== | ||||||
| # Declare the contents of the PHONY variable as phony.  We keep that information | # Declare the contents of the PHONY variable as phony.  We keep that information | ||||||
|   | |||||||
| @@ -11,15 +11,7 @@ import ( | |||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	importSensors      bool |  | ||||||
| 	importHumidities   bool |  | ||||||
| 	importPressures    bool |  | ||||||
| 	importTemperatures bool |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func InitCmd(cmd *cobra.Command) error { | func InitCmd(cmd *cobra.Command) error { | ||||||
|  |  | ||||||
| 	importCmd := &cobra.Command{ | 	importCmd := &cobra.Command{ | ||||||
| 		Use:   "import", | 		Use:   "import", | ||||||
| 		Args:  cobra.RangeArgs(1, 2), | 		Args:  cobra.RangeArgs(1, 2), | ||||||
| @@ -34,7 +26,6 @@ import sqlite3:///var/cache/flucky/sqlite3.db postgres://user:password@host:port | |||||||
| } | } | ||||||
|  |  | ||||||
| func importSources(cmd *cobra.Command, args []string) error { | func importSources(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ import ( | |||||||
|  |  | ||||||
| // Execute a | // Execute a | ||||||
| func Execute(version string) error { | func Execute(version string) error { | ||||||
|  |  | ||||||
| 	rootCmd := &cobra.Command{ | 	rootCmd := &cobra.Command{ | ||||||
| 		Use:               "flucky", | 		Use:               "flucky", | ||||||
| 		PersistentPreRunE: preRunError, | 		PersistentPreRunE: preRunError, | ||||||
| @@ -59,13 +58,11 @@ func Execute(version string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func preRunError(cmd *cobra.Command, args []string) error { | func preRunError(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile := cmd.Flag("config").Value.String() | 	configFile := cmd.Flag("config").Value.String() | ||||||
|  |  | ||||||
| 	// check if config file exists | 	// check if config file exists | ||||||
| 	if _, err := os.Stat(configFile); os.IsNotExist(err) { | 	if _, err := os.Stat(configFile); os.IsNotExist(err) { | ||||||
|  | 		// Time must be truncated for postgres. Postgres currently does not support | ||||||
| 		// Time must be truncted for postgres. Postgres currently does not support |  | ||||||
| 		// nanoseconds which is automatically include into the go time object | 		// nanoseconds which is automatically include into the go time object | ||||||
| 		postgresTimeStamp := time.Now() | 		postgresTimeStamp := time.Now() | ||||||
| 		location, err := time.LoadLocation("Europe/Berlin") | 		location, err := time.LoadLocation("Europe/Berlin") | ||||||
|   | |||||||
| @@ -98,7 +98,6 @@ flucky sensor rename f98b00ea-a9b2-4e00-924f-113859d0af2d outdoor`, | |||||||
| } | } | ||||||
|  |  | ||||||
| func addSensor(cmd *cobra.Command, args []string) error { | func addSensor(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	sensor := &types.Sensor{ | 	sensor := &types.Sensor{ | ||||||
| 		ID:    uuid.NewV4().String(), | 		ID:    uuid.NewV4().String(), | ||||||
| 		Name:  args[0], | 		Name:  args[0], | ||||||
| @@ -200,7 +199,6 @@ func addSensor(cmd *cobra.Command, args []string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func disableSensor(cmd *cobra.Command, args []string) error { | func disableSensor(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
| @@ -246,7 +244,6 @@ func disableSensor(cmd *cobra.Command, args []string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func enableSensor(cmd *cobra.Command, args []string) error { | func enableSensor(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
| @@ -292,7 +289,6 @@ func enableSensor(cmd *cobra.Command, args []string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func listSensors(cmd *cobra.Command, args []string) error { | func listSensors(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
| @@ -335,7 +331,6 @@ func listSensors(cmd *cobra.Command, args []string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func removeSensor(cmd *cobra.Command, args []string) error { | func removeSensor(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
| @@ -367,7 +362,6 @@ func removeSensor(cmd *cobra.Command, args []string) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func renameSensor(cmd *cobra.Command, args []string) error { | func renameSensor(cmd *cobra.Command, args []string) error { | ||||||
|  |  | ||||||
| 	configFile, err := cmd.Flags().GetString("config") | 	configFile, err := cmd.Flags().GetString("config") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("No config file defined") | 		return fmt.Errorf("No config file defined") | ||||||
| @@ -410,5 +404,4 @@ func renameSensor(cmd *cobra.Command, args []string) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -97,26 +97,22 @@ func readTemperature(cmd *cobra.Command, args []string) error { | |||||||
|  |  | ||||||
| 	go func() { | 	go func() { | ||||||
| 		for { | 		for { | ||||||
| 			select { | 			err, open := <-errorChannel | ||||||
| 			case err, open := <-errorChannel: | 			if !open { | ||||||
| 				if !open { | 				return | ||||||
| 					return |  | ||||||
| 				} |  | ||||||
| 				flogger.Error("%v", err) |  | ||||||
| 			} | 			} | ||||||
|  | 			flogger.Error("%v", err) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
|  |  | ||||||
| 	measuredValues := make([]*types.MeasuredValue, 0) | 	measuredValues := make([]*types.MeasuredValue, 0) | ||||||
| LOOP: | LOOP: | ||||||
| 	for { | 	for { | ||||||
| 		select { | 		measuredValue, open := <-measuredValueChannel | ||||||
| 		case measuredValue, open := <-measuredValueChannel: | 		if !open { | ||||||
| 			if !open { | 			break LOOP | ||||||
| 				break LOOP |  | ||||||
| 			} |  | ||||||
| 			measuredValues = append(measuredValues, measuredValue) |  | ||||||
| 		} | 		} | ||||||
|  | 		measuredValues = append(measuredValues, measuredValue) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = cli.PrintMeasuredValues(measuredValues, os.Stdout) | 	err = cli.PrintMeasuredValues(measuredValues, os.Stdout) | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							| @@ -11,9 +11,9 @@ require ( | |||||||
| 	github.com/d2r2/go-logger v0.0.0-20181221090742-9998a510495e | 	github.com/d2r2/go-logger v0.0.0-20181221090742-9998a510495e | ||||||
| 	github.com/golang-migrate/migrate/v4 v4.14.2-0.20201125065321-a53e6fc42574 | 	github.com/golang-migrate/migrate/v4 v4.14.2-0.20201125065321-a53e6fc42574 | ||||||
| 	github.com/johejo/golang-migrate-extra v0.0.0-20210217013041-51a992e50d16 | 	github.com/johejo/golang-migrate-extra v0.0.0-20210217013041-51a992e50d16 | ||||||
| 	github.com/lib/pq v1.9.0 | 	github.com/lib/pq v1.10.2 | ||||||
| 	github.com/mattn/go-sqlite3 v2.0.3+incompatible | 	github.com/mattn/go-sqlite3 v2.0.3+incompatible | ||||||
| 	github.com/satori/go.uuid v1.2.0 | 	github.com/satori/go.uuid v1.2.0 | ||||||
| 	github.com/spf13/cobra v1.1.1 | 	github.com/spf13/cobra v1.1.3 | ||||||
| 	github.com/stretchr/testify v1.7.0 | 	github.com/stretchr/testify v1.7.0 | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								go.sum
									
									
									
									
									
								
							| @@ -297,6 +297,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||||||
| github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||||
| github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= | github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= | ||||||
| github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||||
|  | github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= | ||||||
|  | github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||||
| github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||||
| github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= | github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= | ||||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||||
| @@ -388,6 +390,8 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B | |||||||
| github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||||
| github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= | github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= | ||||||
| github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= | github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= | ||||||
|  | github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= | ||||||
|  | github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= | ||||||
| github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | ||||||
| github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||||
| @@ -395,6 +399,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An | |||||||
| github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | ||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
|  | github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= | ||||||
| github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= | ||||||
| github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||||
| @@ -745,6 +750,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | |||||||
| gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
|  | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | ||||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= | ||||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= | gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								main.go
									
									
									
									
									
								
							| @@ -1,6 +1,8 @@ | |||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"log" | ||||||
|  |  | ||||||
| 	"git.cryptic.systems/volker.raschek/flucky/cli" | 	"git.cryptic.systems/volker.raschek/flucky/cli" | ||||||
|  |  | ||||||
| 	_ "github.com/golang-migrate/migrate/v4/database/postgres" | 	_ "github.com/golang-migrate/migrate/v4/database/postgres" | ||||||
| @@ -14,5 +16,8 @@ var ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| 	cli.Execute(version) | 	err := cli.Execute(version) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println(err) | ||||||
|  | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -9,7 +9,6 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func PrintMeasuredValues(measuredValues []*types.MeasuredValue, w io.Writer) error { | func PrintMeasuredValues(measuredValues []*types.MeasuredValue, w io.Writer) error { | ||||||
|  |  | ||||||
| 	// declar tabwriter | 	// declar tabwriter | ||||||
| 	tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) | 	tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) | ||||||
|  |  | ||||||
| @@ -29,7 +28,6 @@ func PrintMeasuredValues(measuredValues []*types.MeasuredValue, w io.Writer) err | |||||||
|  |  | ||||||
| // PrintSensors displays a list with all configured sensors | // PrintSensors displays a list with all configured sensors | ||||||
| func PrintSensors(sensors []*types.Sensor, w io.Writer) error { | func PrintSensors(sensors []*types.Sensor, w io.Writer) error { | ||||||
|  |  | ||||||
| 	// declar tabwriter | 	// declar tabwriter | ||||||
| 	tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) | 	tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,20 +31,21 @@ func Encode(cnf *Config, w io.Writer) error { | |||||||
|  |  | ||||||
| // Read the configuration file | // Read the configuration file | ||||||
| func Read(configFile string) (*Config, error) { | func Read(configFile string) (*Config, error) { | ||||||
|  | 	/* #nosec */ | ||||||
| 	f, err := os.Open(configFile) | 	f, err := os.Open(configFile) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Can not open file %v: %v", configFile, err) | 		return nil, fmt.Errorf("Can not open file %v: %v", configFile, err) | ||||||
| 	} | 	} | ||||||
| 	defer f.Close() | 	defer func() { _ = f.Close() }() | ||||||
|  |  | ||||||
| 	return Decode(f) | 	return Decode(f) | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // Write the configuration into a file, specified by the configuration filepath | // Write the configuration into a file, specified by the configuration filepath | ||||||
| func Write(cnf *Config, configFile string) error { | func Write(cnf *Config, configFile string) error { | ||||||
| 	if _, err := os.Stat(configFile); os.IsNotExist(err) { | 	if _, err := os.Stat(configFile); os.IsNotExist(err) { | ||||||
| 		configDir := filepath.Dir(configFile) | 		configDir := filepath.Dir(configFile) | ||||||
|  | 		/* #nosec */ | ||||||
| 		err := os.MkdirAll(configDir, 0775) | 		err := os.MkdirAll(configDir, 0775) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("Failed to create config directory %v: %v", configDir, err) | 			return fmt.Errorf("Failed to create config directory %v: %v", configDir, err) | ||||||
| @@ -55,7 +56,7 @@ func Write(cnf *Config, configFile string) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed not create config file %v: %v", configFile, err) | 		return fmt.Errorf("Failed not create config file %v: %v", configFile, err) | ||||||
| 	} | 	} | ||||||
| 	defer f.Close() | 	defer func() { _ = f.Close() }() | ||||||
|  |  | ||||||
| 	return Encode(cnf, f) | 	return Encode(cnf, f) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import ( | |||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/signal" | 	"os/signal" | ||||||
|  | 	"syscall" | ||||||
|  |  | ||||||
| 	"git.cryptic.systems/volker.raschek/flucky/pkg/config" | 	"git.cryptic.systems/volker.raschek/flucky/pkg/config" | ||||||
| 	"git.cryptic.systems/volker.raschek/flucky/pkg/repository" | 	"git.cryptic.systems/volker.raschek/flucky/pkg/repository" | ||||||
| @@ -15,7 +16,6 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func Start(cnf *config.Config, cachedEntries uint, flogger logger.Logger) error { | func Start(cnf *config.Config, cachedEntries uint, flogger logger.Logger) error { | ||||||
|  |  | ||||||
| 	// load data source name (dsn) | 	// load data source name (dsn) | ||||||
| 	dsnURL, err := url.Parse(cnf.DSN) | 	dsnURL, err := url.Parse(cnf.DSN) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -79,7 +79,7 @@ func Start(cnf *config.Config, cachedEntries uint, flogger logger.Logger) error | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	interruptChannel := make(chan os.Signal, 1) | 	interruptChannel := make(chan os.Signal, 1) | ||||||
| 	signal.Notify(interruptChannel, os.Interrupt, os.Kill) | 	signal.Notify(interruptChannel, syscall.SIGTERM) | ||||||
|  |  | ||||||
| 	// Collection | 	// Collection | ||||||
| 	parentCtx := context.Background() | 	parentCtx := context.Background() | ||||||
|   | |||||||
| @@ -1,14 +1,11 @@ | |||||||
| package format | package format | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"math" | 	"math" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	errorPraseTime = errors.New("Can not parse time") |  | ||||||
|  |  | ||||||
| 	TimeFormat = "2006-01-02T15:04:05.999999Z07:00" | 	TimeFormat = "2006-01-02T15:04:05.999999Z07:00" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -19,5 +16,4 @@ func FormatedTime() time.Time { | |||||||
| 	t := time.Now() | 	t := time.Now() | ||||||
| 	l, _ := time.LoadLocation("Europe/Berlin") | 	l, _ := time.LoadLocation("Europe/Berlin") | ||||||
| 	return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), int(math.Round(float64(t.Nanosecond())/1000000)*1000000), l) | 	return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), int(math.Round(float64(t.Nanosecond())/1000000)*1000000), l) | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -67,7 +67,7 @@ func (d *Postgres) AddDevices(ctx context.Context, devices ...*types.Device) err | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertDevices(tx, devices...) | 	err = d.insertDevices(tx, devices...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -82,10 +82,9 @@ func (d *Postgres) insertDevices(tx *sql.Tx, devices ...*types.Device) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
|  |  | ||||||
| 		if device.CreationDate.Equal(time.Time{}) { | 		if device.CreationDate.Equal(time.Time{}) { | ||||||
| 			device.CreationDate = time.Now() | 			device.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -110,7 +109,7 @@ func (d *Postgres) AddOrUpdateDevices(ctx context.Context, devices ...*types.Dev | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertOrUpdateDevices(tx, devices...) | 	err = d.insertOrUpdateDevices(tx, devices...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -125,10 +124,9 @@ func (d *Postgres) insertOrUpdateDevices(tx *sql.Tx, devices ...*types.Device) e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %w", err) | 		return fmt.Errorf("Failed to prepare statement: %w", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
|  |  | ||||||
| 		if device.CreationDate.Equal(time.Time{}) { | 		if device.CreationDate.Equal(time.Time{}) { | ||||||
| 			device.CreationDate = time.Now() | 			device.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -163,7 +161,7 @@ func (d *Postgres) AddMeasuredValues(ctx context.Context, measuredValues ...*typ | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	for measuredValueType, measuredValues := range splittedMeasuredValues { | 	for measuredValueType, measuredValues := range splittedMeasuredValues { | ||||||
| 		var queryFile string | 		var queryFile string | ||||||
| @@ -193,10 +191,9 @@ func (d *Postgres) insertMeasuredValues(tx *sql.Tx, query string, measuredValues | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, measuredValue := range measuredValues { | 	for _, measuredValue := range measuredValues { | ||||||
|  |  | ||||||
| 		if measuredValue.CreationDate.Equal(time.Time{}) { | 		if measuredValue.CreationDate.Equal(time.Time{}) { | ||||||
| 			measuredValue.CreationDate = time.Now() | 			measuredValue.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -233,7 +230,7 @@ func (d *Postgres) AddOrUpdateMeasuredValues(ctx context.Context, measuredValues | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	for measuredValueType, measuredValues := range splittedMeasuredValues { | 	for measuredValueType, measuredValues := range splittedMeasuredValues { | ||||||
| 		var queryFile string | 		var queryFile string | ||||||
| @@ -263,10 +260,9 @@ func (d *Postgres) insertOrUpdateMeasuredValues(tx *sql.Tx, query string, measur | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, measuredValue := range measuredValues { | 	for _, measuredValue := range measuredValues { | ||||||
|  |  | ||||||
| 		if measuredValue.CreationDate.Equal(time.Time{}) { | 		if measuredValue.CreationDate.Equal(time.Time{}) { | ||||||
| 			measuredValue.CreationDate = time.Now() | 			measuredValue.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -294,16 +290,15 @@ func (d *Postgres) AddSensors(ctx context.Context, sensors ...*types.Sensor) err | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.InsertSensorSQL) | 	stmt, err := tx.Prepare(postgres.InsertSensorSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
|  |  | ||||||
| 		if sensor.CreationDate.Equal(time.Time{}) { | 		if sensor.CreationDate.Equal(time.Time{}) { | ||||||
| 			sensor.CreationDate = time.Now() | 			sensor.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -337,7 +332,7 @@ func (d *Postgres) AddOrUpdateSensors(ctx context.Context, sensors ...*types.Sen | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertOrUpdateSensors(tx, sensors...) | 	err = d.insertOrUpdateSensors(tx, sensors...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -352,10 +347,9 @@ func (d *Postgres) insertOrUpdateSensors(tx *sql.Tx, sensors ...*types.Sensor) e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
|  |  | ||||||
| 		if sensor.CreationDate.Equal(time.Time{}) { | 		if sensor.CreationDate.Equal(time.Time{}) { | ||||||
| 			sensor.CreationDate = time.Now() | 			sensor.CreationDate = time.Now() | ||||||
| 		} | 		} | ||||||
| @@ -416,7 +410,7 @@ func (d *Postgres) GetDeviceByID(ctx context.Context, id string) (*types.Device, | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, postgres.SelectDeviceByIDSQL, id) | 	devices, err := d.selectDevices(tx, postgres.SelectDeviceByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -441,7 +435,7 @@ func (d *Postgres) GetDeviceByName(ctx context.Context, name string) (*types.Dev | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, postgres.SelectDeviceByNameSQL, name) | 	devices, err := d.selectDevices(tx, postgres.SelectDeviceByNameSQL, name) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -466,7 +460,7 @@ func (d *Postgres) GetDevices(ctx context.Context) ([]*types.Device, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, postgres.SelectDevicesSQL) | 	devices, err := d.selectDevices(tx, postgres.SelectDevicesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -486,12 +480,13 @@ func (d *Postgres) selectDevices(tx *sql.Tx, query string, args ...interface{}) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to query statement: %v", err) | 		return nil, fmt.Errorf("Failed to query statement: %v", err) | ||||||
| 	} | 	} | ||||||
|  | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	devices := make([]*types.Device, 0) | 	devices := make([]*types.Device, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| @@ -509,6 +504,10 @@ func (d *Postgres) selectDevices(tx *sql.Tx, query string, args ...interface{}) | |||||||
| 		devices = append(devices, device) | 		devices = append(devices, device) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return devices, nil | 	return devices, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -518,7 +517,7 @@ func (d *Postgres) GetHumidityByID(ctx context.Context, id string) (*types.Measu | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectHumidityByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectHumidityByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -547,7 +546,7 @@ func (d *Postgres) GetHumidities(ctx context.Context) ([]*types.MeasuredValue, e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectHumiditiesSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectHumiditiesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -571,16 +570,18 @@ func (d *Postgres) selectMeasuredValue(tx *sql.Tx, query string, args ...interfa | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
|  | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	measuredValues := make([]*types.MeasuredValue, 0) | 	measuredValues := make([]*types.MeasuredValue, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| 		measuredValue := new(types.MeasuredValue) | 		measuredValue := new(types.MeasuredValue) | ||||||
|  |  | ||||||
| 		err := rows.Scan( | 		err := rows.Scan( | ||||||
| 			&measuredValue.ID, | 			&measuredValue.ID, | ||||||
| 			&measuredValue.Value, | 			&measuredValue.Value, | ||||||
| @@ -589,14 +590,17 @@ func (d *Postgres) selectMeasuredValue(tx *sql.Tx, query string, args ...interfa | |||||||
| 			&measuredValue.CreationDate, | 			&measuredValue.CreationDate, | ||||||
| 			&measuredValue.UpdateDate, | 			&measuredValue.UpdateDate, | ||||||
| 		) | 		) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, fmt.Errorf("failed to scan row: %v", err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		measuredValues = append(measuredValues, measuredValue) | 		measuredValues = append(measuredValues, measuredValue) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return measuredValues, nil | 	return measuredValues, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -606,7 +610,7 @@ func (d *Postgres) GetPressureByID(ctx context.Context, id string) (*types.Measu | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectPressureByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectPressureByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -635,7 +639,7 @@ func (d *Postgres) GetPressures(ctx context.Context) ([]*types.MeasuredValue, er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectPressuresSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectPressuresSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -660,7 +664,7 @@ func (d *Postgres) GetSensorByID(ctx context.Context, id string) (*types.Sensor, | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	sensors, err := d.selectSensors(tx, postgres.SelectSensorByIDSQL, id) | 	sensors, err := d.selectSensors(tx, postgres.SelectSensorByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -685,7 +689,7 @@ func (d *Postgres) GetSensors(ctx context.Context) ([]*types.Sensor, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	sensors, err := d.selectSensors(tx, postgres.SelectSensorsSQL) | 	sensors, err := d.selectSensors(tx, postgres.SelectSensorsSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -706,7 +710,7 @@ func (d *Postgres) GetSensorsByDeviceIDs(ctx context.Context, deviceIDs ...strin | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range deviceIDs { | 	for i := range deviceIDs { | ||||||
| @@ -732,6 +736,7 @@ func (d *Postgres) GetSensorsByModels(ctx context.Context, sensorModels ...strin | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
|  | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range sensorModels { | 	for i := range sensorModels { | ||||||
| @@ -757,7 +762,7 @@ func (d *Postgres) GetSensorsByNames(ctx context.Context, sensorNames ...string) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range sensorNames { | 	for i := range sensorNames { | ||||||
| @@ -782,12 +787,13 @@ func (d *Postgres) selectSensors(tx *sql.Tx, query string, args ...interface{}) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to query statement: %v", err) | 		return nil, fmt.Errorf("Failed to query statement: %v", err) | ||||||
| 	} | 	} | ||||||
|  | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	sensors := make([]*types.Sensor, 0) | 	sensors := make([]*types.Sensor, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| @@ -814,6 +820,10 @@ func (d *Postgres) selectSensors(tx *sql.Tx, query string, args ...interface{}) | |||||||
| 		sensors = append(sensors, sensor) | 		sensors = append(sensors, sensor) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return sensors, nil | 	return sensors, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -823,7 +833,7 @@ func (d *Postgres) GetTemperatureByID(ctx context.Context, id string) (*types.Me | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectTemperatureByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectTemperatureByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -852,7 +862,7 @@ func (d *Postgres) GetTemperatures(ctx context.Context) ([]*types.MeasuredValue, | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectTemperaturesSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, postgres.SelectTemperaturesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -878,7 +888,7 @@ func (d *Postgres) Import(ctx context.Context, src Repository) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := src.GetDevices(ctx) | 	devices, err := src.GetDevices(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -928,13 +938,13 @@ func (d *Postgres) RemoveDevicesByIDs(ctx context.Context, deviceIDs ...string) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.DeleteDeviceByIDSQL) | 	stmt, err := tx.Prepare(postgres.DeleteDeviceByIDSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, deviceID := range deviceIDs { | 	for _, deviceID := range deviceIDs { | ||||||
| 		_, err = stmt.Exec(deviceID) | 		_, err = stmt.Exec(deviceID) | ||||||
| @@ -952,13 +962,13 @@ func (d *Postgres) RemoveDevicesByNames(ctx context.Context, names ...string) er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.DeleteDeviceByNameSQL) | 	stmt, err := tx.Prepare(postgres.DeleteDeviceByNameSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, deviceID := range names { | 	for _, deviceID := range names { | ||||||
| 		_, err = stmt.Exec(deviceID) | 		_, err = stmt.Exec(deviceID) | ||||||
| @@ -976,13 +986,13 @@ func (d *Postgres) RemoveSensorsByIDs(ctx context.Context, sensorIDs ...string) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.DeleteSensorByIDSQL) | 	stmt, err := tx.Prepare(postgres.DeleteSensorByIDSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensorID := range sensorIDs { | 	for _, sensorID := range sensorIDs { | ||||||
| 		_, err = stmt.Exec(sensorID) | 		_, err = stmt.Exec(sensorID) | ||||||
| @@ -1000,13 +1010,13 @@ func (d *Postgres) RemoveSensorsByNames(ctx context.Context, sensorIDs ...string | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.DeleteSensorByNameSQL) | 	stmt, err := tx.Prepare(postgres.DeleteSensorByNameSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensorID := range sensorIDs { | 	for _, sensorID := range sensorIDs { | ||||||
| 		_, err = stmt.Exec(sensorID) | 		_, err = stmt.Exec(sensorID) | ||||||
| @@ -1024,13 +1034,13 @@ func (d *Postgres) UpdateDevices(ctx context.Context, devices ...*types.Device) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.UpdateDeviceSQL) | 	stmt, err := tx.Prepare(postgres.UpdateDeviceSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
| 		now := time.Now() | 		now := time.Now() | ||||||
| @@ -1057,13 +1067,13 @@ func (d *Postgres) UpdateSensors(ctx context.Context, sensors ...*types.Sensor) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(postgres.UpdateSensorSQL) | 	stmt, err := tx.Prepare(postgres.UpdateSensorSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
| 		now := time.Now() | 		now := time.Now() | ||||||
|   | |||||||
| @@ -47,6 +47,7 @@ func NewSQLite(opts SQLiteOpts) (Repository, error) { | |||||||
|  |  | ||||||
| 	// Create directory if not exist | 	// Create directory if not exist | ||||||
| 	if _, err := os.Stat(filepath.Dir(opts.DatabaseURL.Path)); os.IsNotExist(err) { | 	if _, err := os.Stat(filepath.Dir(opts.DatabaseURL.Path)); os.IsNotExist(err) { | ||||||
|  | 		/* #nosec */ | ||||||
| 		err := os.MkdirAll(filepath.Dir(opts.DatabaseURL.Path), 0755) | 		err := os.MkdirAll(filepath.Dir(opts.DatabaseURL.Path), 0755) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| @@ -89,7 +90,7 @@ func (d *SQLite) AddDevices(ctx context.Context, devices ...*types.Device) error | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertDevices(tx, devices...) | 	err = d.insertDevices(tx, devices...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -104,10 +105,16 @@ func (d *SQLite) insertDevices(tx *sql.Tx, devices ...*types.Device) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
| 		_, err = stmt.Exec(&device.ID, &device.Name, &device.Location, &device.CreationDate, &device.UpdateDate) | 		_, err = stmt.Exec( | ||||||
|  | 			&device.ID,  | ||||||
|  | 			&device.Name,  | ||||||
|  | 			&device.Location,  | ||||||
|  | 			&device.CreationDate,  | ||||||
|  | 			&device.UpdateDate, | ||||||
|  | 		) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("Failed to execute statement: %v", err) | 			return fmt.Errorf("Failed to execute statement: %v", err) | ||||||
| 		} | 		} | ||||||
| @@ -125,7 +132,7 @@ func (d *SQLite) AddOrUpdateDevices(ctx context.Context, devices ...*types.Devic | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertOrUpdateDevices(tx, devices...) | 	err = d.insertOrUpdateDevices(tx, devices...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -140,10 +147,16 @@ func (d *SQLite) insertOrUpdateDevices(tx *sql.Tx, devices ...*types.Device) err | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
| 		_, err = stmt.Exec(&device.ID, &device.Name, &device.Location, &device.CreationDate, &device.UpdateDate) | 		_, err = stmt.Exec( | ||||||
|  | 			&device.ID,  | ||||||
|  | 			&device.Name,  | ||||||
|  | 			&device.Location,  | ||||||
|  | 			&device.CreationDate,  | ||||||
|  | 			&device.UpdateDate, | ||||||
|  | 		) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("Failed to execute statement: %v", err) | 			return fmt.Errorf("Failed to execute statement: %v", err) | ||||||
| 		} | 		} | ||||||
| @@ -170,7 +183,7 @@ func (d *SQLite) AddMeasuredValues(ctx context.Context, measuredValues ...*types | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	for measuredValueType, measuredValues := range splittedMeasuredValues { | 	for measuredValueType, measuredValues := range splittedMeasuredValues { | ||||||
| 		var query string | 		var query string | ||||||
| @@ -200,7 +213,7 @@ func (d *SQLite) insertMeasuredValues(tx *sql.Tx, query string, measuredValues . | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, measuredValue := range measuredValues { | 	for _, measuredValue := range measuredValues { | ||||||
| 		_, err := stmt.Exec( | 		_, err := stmt.Exec( | ||||||
| @@ -211,7 +224,6 @@ func (d *SQLite) insertMeasuredValues(tx *sql.Tx, query string, measuredValues . | |||||||
| 			&measuredValue.CreationDate, | 			&measuredValue.CreationDate, | ||||||
| 			&measuredValue.UpdateDate, | 			&measuredValue.UpdateDate, | ||||||
| 		) | 		) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("Failed to execute statement: %v", err) | 			return fmt.Errorf("Failed to execute statement: %v", err) | ||||||
| 		} | 		} | ||||||
| @@ -238,7 +250,7 @@ func (d *SQLite) AddOrUpdateMeasuredValues(ctx context.Context, measuredValues . | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	for measuredValueType, measuredValues := range splittedMeasuredValues { | 	for measuredValueType, measuredValues := range splittedMeasuredValues { | ||||||
| 		var query string | 		var query string | ||||||
| @@ -268,7 +280,7 @@ func (d *SQLite) insertOrUpdateMeasuredValues(tx *sql.Tx, query string, measured | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, measuredValue := range measuredValues { | 	for _, measuredValue := range measuredValues { | ||||||
| 		_, err := stmt.Exec( | 		_, err := stmt.Exec( | ||||||
| @@ -297,13 +309,13 @@ func (d *SQLite) AddSensors(ctx context.Context, sensors ...*types.Sensor) error | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.InsertSensorSQL) | 	stmt, err := tx.Prepare(sqlite3.InsertSensorSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
| 		_, err = stmt.Exec( | 		_, err = stmt.Exec( | ||||||
| @@ -338,7 +350,7 @@ func (d *SQLite) AddOrUpdateSensors(ctx context.Context, sensors ...*types.Senso | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	err = d.insertOrUpdateSensors(tx, sensors...) | 	err = d.insertOrUpdateSensors(tx, sensors...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -353,7 +365,7 @@ func (d *SQLite) insertOrUpdateSensors(tx *sql.Tx, sensors ...*types.Sensor) err | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
| 		_, err = stmt.Exec( | 		_, err = stmt.Exec( | ||||||
| @@ -420,7 +432,7 @@ func (d *SQLite) GetDeviceByID(ctx context.Context, id string) (*types.Device, e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, sqlite3.SelectDeviceByIDSQL, id) | 	devices, err := d.selectDevices(tx, sqlite3.SelectDeviceByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -448,7 +460,7 @@ func (d *SQLite) GetDeviceByName(ctx context.Context, name string) (*types.Devic | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, sqlite3.SelectDeviceByNameSQL, name) | 	devices, err := d.selectDevices(tx, sqlite3.SelectDeviceByNameSQL, name) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -476,7 +488,7 @@ func (d *SQLite) GetDevices(ctx context.Context) ([]*types.Device, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := d.selectDevices(tx, sqlite3.SelectDevicesSQL) | 	devices, err := d.selectDevices(tx, sqlite3.SelectDevicesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -496,13 +508,13 @@ func (d *SQLite) selectDevices(tx *sql.Tx, query string, args ...interface{}) ([ | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to query statement: %v", err) | 		return nil, fmt.Errorf("Failed to query statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	devices := make([]*types.Device, 0) | 	devices := make([]*types.Device, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| @@ -520,6 +532,10 @@ func (d *SQLite) selectDevices(tx *sql.Tx, query string, args ...interface{}) ([ | |||||||
| 		devices = append(devices, device) | 		devices = append(devices, device) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return devices, nil | 	return devices, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -532,7 +548,7 @@ func (d *SQLite) GetHumidityByID(ctx context.Context, id string) (*types.Measure | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectHumidityByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectHumidityByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -564,7 +580,7 @@ func (d *SQLite) GetHumidities(ctx context.Context) ([]*types.MeasuredValue, err | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectHumiditiesSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectHumiditiesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -588,17 +604,18 @@ func (d *SQLite) selectMeasuredValue(tx *sql.Tx, query string, args ...interface | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	measuredValues := make([]*types.MeasuredValue, 0) | 	measuredValues := make([]*types.MeasuredValue, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| 		measuredValue := new(types.MeasuredValue) | 		measuredValue := new(types.MeasuredValue) | ||||||
|  |  | ||||||
| 		err := rows.Scan( | 		err := rows.Scan( | ||||||
| 			&measuredValue.ID, | 			&measuredValue.ID, | ||||||
| 			&measuredValue.Value, | 			&measuredValue.Value, | ||||||
| @@ -607,7 +624,6 @@ func (d *SQLite) selectMeasuredValue(tx *sql.Tx, query string, args ...interface | |||||||
| 			&measuredValue.CreationDate, | 			&measuredValue.CreationDate, | ||||||
| 			&measuredValue.UpdateDate, | 			&measuredValue.UpdateDate, | ||||||
| 		) | 		) | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| @@ -615,6 +631,10 @@ func (d *SQLite) selectMeasuredValue(tx *sql.Tx, query string, args ...interface | |||||||
| 		measuredValues = append(measuredValues, measuredValue) | 		measuredValues = append(measuredValues, measuredValue) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return measuredValues, nil | 	return measuredValues, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -627,7 +647,7 @@ func (d *SQLite) GetPressureByID(ctx context.Context, id string) (*types.Measure | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectPressureByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectPressureByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -659,7 +679,7 @@ func (d *SQLite) GetPressures(ctx context.Context) ([]*types.MeasuredValue, erro | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectPressuresSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectPressuresSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -687,7 +707,7 @@ func (d *SQLite) GetSensorByID(ctx context.Context, id string) (*types.Sensor, e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	sensors, err := d.selectSensors(tx, sqlite3.SelectSensorByIDSQL, id) | 	sensors, err := d.selectSensors(tx, sqlite3.SelectSensorByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -715,7 +735,7 @@ func (d *SQLite) GetSensors(ctx context.Context) ([]*types.Sensor, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	sensors, err := d.selectSensors(tx, sqlite3.SelectSensorsSQL) | 	sensors, err := d.selectSensors(tx, sqlite3.SelectSensorsSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -739,7 +759,7 @@ func (d *SQLite) GetSensorsByDeviceIDs(ctx context.Context, deviceIDs ...string) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range deviceIDs { | 	for i := range deviceIDs { | ||||||
| @@ -768,7 +788,7 @@ func (d *SQLite) GetSensorsByModels(ctx context.Context, sensorModels ...string) | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range sensorModels { | 	for i := range sensorModels { | ||||||
| @@ -797,7 +817,7 @@ func (d *SQLite) GetSensorsByNames(ctx context.Context, sensorNames ...string) ( | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | 		return nil, fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	cachedSensors := make([]*types.Sensor, 0) | 	cachedSensors := make([]*types.Sensor, 0) | ||||||
| 	for i := range sensorNames { | 	for i := range sensorNames { | ||||||
| @@ -822,13 +842,13 @@ func (d *SQLite) selectSensors(tx *sql.Tx, query string, args ...interface{}) ([ | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | 		return nil, fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	rows, err := stmt.Query(args...) | 	rows, err := stmt.Query(args...) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to query statement: %v", err) | 		return nil, fmt.Errorf("Failed to query statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer func() { _ = rows.Close() }() | ||||||
|  |  | ||||||
| 	sensors := make([]*types.Sensor, 0) | 	sensors := make([]*types.Sensor, 0) | ||||||
| 	for rows.Next() { | 	for rows.Next() { | ||||||
| @@ -855,6 +875,10 @@ func (d *SQLite) selectSensors(tx *sql.Tx, query string, args ...interface{}) ([ | |||||||
| 		sensors = append(sensors, sensor) | 		sensors = append(sensors, sensor) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if err := rows.Err(); err != nil { | ||||||
|  | 		return nil, fmt.Errorf("failed to scan rows: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return sensors, nil | 	return sensors, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -867,7 +891,7 @@ func (d *SQLite) GetTemperatureByID(ctx context.Context, id string) (*types.Meas | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectTemperatureByIDSQL, id) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectTemperatureByIDSQL, id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -899,7 +923,7 @@ func (d *SQLite) GetTemperatures(ctx context.Context) ([]*types.MeasuredValue, e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectTemperaturesSQL) | 	measuredValues, err := d.selectMeasuredValue(tx, sqlite3.SelectTemperaturesSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -928,7 +952,7 @@ func (d *SQLite) Import(ctx context.Context, src Repository) error { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	devices, err := src.GetDevices(ctx) | 	devices, err := src.GetDevices(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -981,13 +1005,13 @@ func (d *SQLite) RemoveDevicesByIDs(ctx context.Context, deviceIDs ...string) er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.DeleteDeviceByIDSQL) | 	stmt, err := tx.Prepare(sqlite3.DeleteDeviceByIDSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, deviceID := range deviceIDs { | 	for _, deviceID := range deviceIDs { | ||||||
| 		_, err = stmt.Exec(deviceID) | 		_, err = stmt.Exec(deviceID) | ||||||
| @@ -1008,13 +1032,13 @@ func (d *SQLite) RemoveDevicesByNames(ctx context.Context, names ...string) erro | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.DeleteDeviceByNameSQL) | 	stmt, err := tx.Prepare(sqlite3.DeleteDeviceByNameSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, deviceID := range names { | 	for _, deviceID := range names { | ||||||
| 		_, err = stmt.Exec(deviceID) | 		_, err = stmt.Exec(deviceID) | ||||||
| @@ -1035,13 +1059,13 @@ func (d *SQLite) RemoveSensorsByIDs(ctx context.Context, sensorIDs ...string) er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.DeleteSensorByIDSQL) | 	stmt, err := tx.Prepare(sqlite3.DeleteSensorByIDSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensorID := range sensorIDs { | 	for _, sensorID := range sensorIDs { | ||||||
| 		_, err = stmt.Exec(sensorID) | 		_, err = stmt.Exec(sensorID) | ||||||
| @@ -1062,13 +1086,13 @@ func (d *SQLite) RemoveSensorsByNames(ctx context.Context, names ...string) erro | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to begin new transaction: %v", err) | 		return fmt.Errorf("Failed to begin new transaction: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.DeleteSensorByNameSQL) | 	stmt, err := tx.Prepare(sqlite3.DeleteSensorByNameSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Failed to prepare statement: %v", err) | 		return fmt.Errorf("Failed to prepare statement: %v", err) | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensorID := range names { | 	for _, sensorID := range names { | ||||||
| 		_, err = stmt.Exec(sensorID) | 		_, err = stmt.Exec(sensorID) | ||||||
| @@ -1089,13 +1113,13 @@ func (d *SQLite) UpdateDevices(ctx context.Context, devices ...*types.Device) er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.UpdateDeviceSQL) | 	stmt, err := tx.Prepare(sqlite3.UpdateDeviceSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, device := range devices { | 	for _, device := range devices { | ||||||
| 		_, err := stmt.Exec( | 		_, err := stmt.Exec( | ||||||
| @@ -1122,13 +1146,13 @@ func (d *SQLite) UpdateSensors(ctx context.Context, sensors ...*types.Sensor) er | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer tx.Rollback() | 	defer func() { _ = tx.Rollback() }() | ||||||
|  |  | ||||||
| 	stmt, err := tx.Prepare(sqlite3.UpdateSensorSQL) | 	stmt, err := tx.Prepare(sqlite3.UpdateSensorSQL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	defer stmt.Close() | 	defer func() { _ = stmt.Close() }() | ||||||
|  |  | ||||||
| 	for _, sensor := range sensors { | 	for _, sensor := range sensors { | ||||||
| 		_, err := stmt.Exec( | 		_, err := stmt.Exec( | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ type BME280 struct { | |||||||
|  |  | ||||||
| // Read measured values | // Read measured values | ||||||
| func (bme280 *BME280) Read() ([]*types.MeasuredValue, error) { | func (bme280 *BME280) Read() ([]*types.MeasuredValue, error) { | ||||||
|  |  | ||||||
| 	// Lock multiple access | 	// Lock multiple access | ||||||
| 	bme280.mutex.Lock() | 	bme280.mutex.Lock() | ||||||
| 	defer bme280.mutex.Unlock() | 	defer bme280.mutex.Unlock() | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ type DHT11 struct { | |||||||
|  |  | ||||||
| // Read measured values | // Read measured values | ||||||
| func (dht11 *DHT11) Read() ([]*types.MeasuredValue, error) { | func (dht11 *DHT11) Read() ([]*types.MeasuredValue, error) { | ||||||
|  |  | ||||||
| 	// Lock multiple access | 	// Lock multiple access | ||||||
| 	dht11.mutex.Lock() | 	dht11.mutex.Lock() | ||||||
| 	defer dht11.mutex.Unlock() | 	defer dht11.mutex.Unlock() | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ type DHT22 struct { | |||||||
|  |  | ||||||
| // Read measured values | // Read measured values | ||||||
| func (dht22 *DHT22) Read() ([]*types.MeasuredValue, error) { | func (dht22 *DHT22) Read() ([]*types.MeasuredValue, error) { | ||||||
|  |  | ||||||
| 	// Lock multiple access | 	// Lock multiple access | ||||||
| 	dht22.mutex.Lock() | 	dht22.mutex.Lock() | ||||||
| 	defer dht22.mutex.Unlock() | 	defer dht22.mutex.Unlock() | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ type DS18B20 struct { | |||||||
|  |  | ||||||
| // Read measured values | // Read measured values | ||||||
| func (ds18b20 *DS18B20) Read() ([]*types.MeasuredValue, error) { | func (ds18b20 *DS18B20) Read() ([]*types.MeasuredValue, error) { | ||||||
|  |  | ||||||
| 	// Lock multiple access | 	// Lock multiple access | ||||||
| 	ds18b20.mutex.Lock() | 	ds18b20.mutex.Lock() | ||||||
| 	defer ds18b20.mutex.Unlock() | 	defer ds18b20.mutex.Unlock() | ||||||
| @@ -36,6 +35,7 @@ func (ds18b20 *DS18B20) Read() ([]*types.MeasuredValue, error) { | |||||||
| 		return nil, fmt.Errorf("Socket path not found: %v", socketPath) | 		return nil, fmt.Errorf("Socket path not found: %v", socketPath) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/* #nosec */ | ||||||
| 	data, err := ioutil.ReadFile(socketPath) | 	data, err := ioutil.ReadFile(socketPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Can not read data from sensor %v", ds18b20.Name) | 		return nil, fmt.Errorf("Can not read data from sensor %v", ds18b20.Name) | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ var ( | |||||||
|  |  | ||||||
| // FilterMeasuredValuesByTypes filters measured values by type | // FilterMeasuredValuesByTypes filters measured values by type | ||||||
| func FilterMeasuredValuesByTypes(ctx context.Context, inChannel <-chan *types.MeasuredValue, measuredValueTypes ...types.MeasuredValueType) <-chan *types.MeasuredValue { | func FilterMeasuredValuesByTypes(ctx context.Context, inChannel <-chan *types.MeasuredValue, measuredValueTypes ...types.MeasuredValueType) <-chan *types.MeasuredValue { | ||||||
| 	outChannel := make(chan *types.MeasuredValue, 0) | 	outChannel := make(chan *types.MeasuredValue, 1) | ||||||
| 	go func() { | 	go func() { | ||||||
| 	LOOP: | 	LOOP: | ||||||
| 		for { | 		for { | ||||||
| @@ -40,7 +40,7 @@ func FilterMeasuredValuesByTypes(ctx context.Context, inChannel <-chan *types.Me | |||||||
|  |  | ||||||
| // FilterMeasuredValuesBySensorIDs filters measured values by sensor id | // FilterMeasuredValuesBySensorIDs filters measured values by sensor id | ||||||
| func FilterMeasuredValuesBySensorIDs(ctx context.Context, inChannel <-chan *types.MeasuredValue, sensorIDs ...string) <-chan *types.MeasuredValue { | func FilterMeasuredValuesBySensorIDs(ctx context.Context, inChannel <-chan *types.MeasuredValue, sensorIDs ...string) <-chan *types.MeasuredValue { | ||||||
| 	outChannel := make(chan *types.MeasuredValue, 0) | 	outChannel := make(chan *types.MeasuredValue, 1) | ||||||
| 	go func() { | 	go func() { | ||||||
| 	LOOP: | 	LOOP: | ||||||
| 		for { | 		for { | ||||||
| @@ -68,8 +68,8 @@ func FilterMeasuredValuesBySensorIDs(ctx context.Context, inChannel <-chan *type | |||||||
| // closed. The returned channels will be closed | // closed. The returned channels will be closed | ||||||
| func ReadPipeline(ctx context.Context, sensors ...Sensor) (<-chan *types.MeasuredValue, <-chan error) { | func ReadPipeline(ctx context.Context, sensors ...Sensor) (<-chan *types.MeasuredValue, <-chan error) { | ||||||
| 	var ( | 	var ( | ||||||
| 		errorChannel         = make(chan error, 0) | 		errorChannel         = make(chan error, 1) | ||||||
| 		measuredValueChannel = make(chan *types.MeasuredValue, 0) | 		measuredValueChannel = make(chan *types.MeasuredValue, 1) | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	go func() { | 	go func() { | ||||||
| @@ -102,8 +102,8 @@ func ReadPipeline(ctx context.Context, sensors ...Sensor) (<-chan *types.Measure | |||||||
| // the context has been closed | // the context has been closed | ||||||
| func ReadTickingPipeline(ctx context.Context, sensors ...Sensor) (<-chan *types.MeasuredValue, <-chan error) { | func ReadTickingPipeline(ctx context.Context, sensors ...Sensor) (<-chan *types.MeasuredValue, <-chan error) { | ||||||
| 	var ( | 	var ( | ||||||
| 		errorChannel         = make(chan error, 0) | 		errorChannel         = make(chan error, 1) | ||||||
| 		measuredValueChannel = make(chan *types.MeasuredValue, 0) | 		measuredValueChannel = make(chan *types.MeasuredValue, 1) | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	for i := range sensors { | 	for i := range sensors { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ import ( | |||||||
| // or temperature. | // or temperature. | ||||||
| type MeasuredValue struct { | type MeasuredValue struct { | ||||||
| 	ID           string            `json:"id" xml:"id"` | 	ID           string            `json:"id" xml:"id"` | ||||||
| 	Value        float64           `json:"value,string" xml:"value,string"` | 	Value        float64           `json:"value,string" xml:"value"` | ||||||
| 	ValueType    MeasuredValueType `json:"value_type" xml:"value_type"` | 	ValueType    MeasuredValueType `json:"value_type" xml:"value_type"` | ||||||
| 	Date         time.Time         `json:"date" xml:"date"` | 	Date         time.Time         `json:"date" xml:"date"` | ||||||
| 	SensorID     string            `json:"sensor_id" xml:"sensor_id"` | 	SensorID     string            `json:"sensor_id" xml:"sensor_id"` | ||||||
| @@ -21,6 +21,6 @@ type MeasuredValueType string | |||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	Humidity    MeasuredValueType = "humidity" | 	Humidity    MeasuredValueType = "humidity" | ||||||
| 	Pressure                      = "pressure" | 	Pressure    MeasuredValueType = "pressure" | ||||||
| 	Temperature                   = "temperature" | 	Temperature MeasuredValueType = "temperature" | ||||||
| ) | ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user