diff --git a/database/RecordedCall.go b/database/RecordedCall.go new file mode 100644 index 0000000..858089f --- /dev/null +++ b/database/RecordedCall.go @@ -0,0 +1,55 @@ +package database + +import ( + "database/sql" + "fmt" +) + +func InsertOrUpdateRecordedCall(db *sql.DB, values []interface{}) (int, string, error) { + // Replace empty strings with nil for timestamp fields + for i, v := range values { + if str, ok := v.(string); ok && str == "" { + values[i] = nil + } + } + + query := ` + INSERT INTO calls ( + estimatedvehiclejourney, "order", stoppointref, + aimeddeparturetime, expecteddeparturetime, + aimedarrivaltime, expectedarrivaltime, + cancellation, estimated_data + ) + VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) + ON CONFLICT (estimatedvehiclejourney, "order") + DO UPDATE SET + stoppointref = EXCLUDED.stoppointref, + aimeddeparturetime = EXCLUDED.aimeddeparturetime, + expecteddeparturetime = EXCLUDED.expecteddeparturetime, + aimedarrivaltime = EXCLUDED.aimedarrivaltime, + expectedarrivaltime = EXCLUDED.expectedarrivaltime, + cancellation = EXCLUDED.cancellation, + estimated_data = EXCLUDED.estimated_data + RETURNING CASE WHEN xmax = 0 THEN 'insert' ELSE 'update' END, id; + ` + stmt, err := db.Prepare(query) + if err != nil { + return 0, "", fmt.Errorf("error preparing statement: %v", err) + } + defer stmt.Close() + + var action string + var id int + err = stmt.QueryRow(values...).Scan(&action, &id) + if err != nil { + if 1 == 1 { + fmt.Println("Executing query:", query) + for i, v := range values { + fmt.Printf("Value %d: (%v)\n", i+1, v) + } + + } + return 0, "", fmt.Errorf("error executing statement: %v", err) + } + return id, action, nil +}