diff --git a/config/db.go b/config/db.go index 0e553bd..b43d60a 100644 --- a/config/db.go +++ b/config/db.go @@ -41,6 +41,15 @@ func ConnectToPostgreSQL() (*sql.DB, error) { return db, nil } +func DisconnectFromPostgreSQL(db *sql.DB) error { + fmt.Println("Disconnecting from PostgreSQL...") + if err := db.Close(); err != nil { + return err + } + log.Println("Disconnected from PostgreSQL!") + return nil +} + func PrintDBConfig() { config, err := LoadConfig("config/conf.json") if err != nil { @@ -48,9 +57,9 @@ func PrintDBConfig() { return } - //fmt.Println("Configuration:", config) - //fmt.Println("Host:", config.Database.Host) - //fmt.Println("Port:", config.Database.Port) + fmt.Println("Configuration:", config) + fmt.Println("Host:", config.Database.Host) + fmt.Println("Port:", config.Database.Port) fmt.Println("Database User:", config.Database.User) - //fmt.Println("Database Password:", config.Database.Password) + fmt.Println("Database Password:", config.Database.Password) } diff --git a/database/RecordedCall.go b/database/RecordedCall.go index 858089f..cb6bab0 100644 --- a/database/RecordedCall.go +++ b/database/RecordedCall.go @@ -18,9 +18,10 @@ func InsertOrUpdateRecordedCall(db *sql.DB, values []interface{}) (int, string, estimatedvehiclejourney, "order", stoppointref, aimeddeparturetime, expecteddeparturetime, aimedarrivaltime, expectedarrivaltime, - cancellation, estimated_data + cancellation, actualdeparturetime, actualarrivaltime, + recorded_data ) - VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) + VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11) ON CONFLICT (estimatedvehiclejourney, "order") DO UPDATE SET stoppointref = EXCLUDED.stoppointref, @@ -29,7 +30,9 @@ func InsertOrUpdateRecordedCall(db *sql.DB, values []interface{}) (int, string, aimedarrivaltime = EXCLUDED.aimedarrivaltime, expectedarrivaltime = EXCLUDED.expectedarrivaltime, cancellation = EXCLUDED.cancellation, - estimated_data = EXCLUDED.estimated_data + actualdeparturetime = EXCLUDED.actualdeparturetime, + actualarrivaltime = EXCLUDED.actualarrivaltime, + recorded_data = EXCLUDED.recorded_data RETURNING CASE WHEN xmax = 0 THEN 'insert' ELSE 'update' END, id; ` stmt, err := db.Prepare(query) diff --git a/database/ServiceDeliveryDB.go b/database/ServiceDeliveryDB.go index b0b00d4..a3f03e7 100644 --- a/database/ServiceDeliveryDB.go +++ b/database/ServiceDeliveryDB.go @@ -17,3 +17,14 @@ func InsertServiceDelivery(db *sql.DB, responseTimestamp string, recordedAtTime //fmt.Println("ServiceDelivery inserted successfully! (", id, ")") return id, nil } + +func UpdateServiceDeliveryData(db *sql.DB, id int, data string) error { + fmt.Println("Updating ServiceDelivery data...") + _, err := db.Exec("UPDATE public.ServiceDelivery SET Data = $1 WHERE ID = $2", data, id) + if err != nil { + fmt.Println(err) + return err + } + fmt.Println("Finished with this ServiceDelivery!") + return nil +} diff --git a/export/database.go b/export/database.go index 17ca210..bbe482d 100644 --- a/export/database.go +++ b/export/database.go @@ -27,7 +27,7 @@ func DBData(data *data.Data) { fmt.Println("SID:", sid) // counters - var insertCount, updateCount, totalCount, estimatedCallInsertCount, estimatedCallUpdateCount int + var insertCount, updateCount, totalCount, estimatedCallInsertCount, estimatedCallUpdateCount, recordedCallInsertCount, recordedCallUpdateCount int for _, journey := range data.ServiceDelivery.EstimatedTimetableDelivery[0].EstimatedJourneyVersionFrame.EstimatedVehicleJourney { var values []interface{} @@ -155,8 +155,17 @@ func DBData(data *data.Data) { totalCount = insertCount + updateCount //fmt.Printf("Inserts: %d, Updates: %d, Total: %d\n", insertCount, updateCount, totalCount) - if totalCount%100 == 0 { - fmt.Printf("Inserts: %d, Updates: %d, Total: %d; estimatedCalls = I: %d U: %d\n", insertCount, updateCount, totalCount, estimatedCallInsertCount, estimatedCallUpdateCount) + if totalCount%500 == 0 { + fmt.Printf( + "Inserts: %d, Updates: %d, Total: %d; estimatedCalls = I: %d U: %d; recordedCalls = I: %d U: %d\n", + insertCount, + updateCount, + totalCount, + estimatedCallInsertCount, + estimatedCallUpdateCount, + recordedCallInsertCount, + recordedCallUpdateCount, + ) } } @@ -296,7 +305,115 @@ func DBData(data *data.Data) { } } } - // add recorded calls here + for _, recordedCall := range journey.RecordedCalls { + for _, call := range recordedCall.RecordedCall { + var recordedValues []interface{} + + //1 estimatedvehiclejourney + recordedValues = append(recordedValues, id) + //2 order + recordedValues = append(recordedValues, call.Order) + //3 stoppointref + recordedValues = append(recordedValues, call.StopPointRef) + //4 aimeddeparturetime + recordedValues = append(recordedValues, call.AimedDepartureTime) + //5 expecteddeparturetime + recordedValues = append(recordedValues, call.ExpectedDepartureTime) + //6 aimedarrivaltime + recordedValues = append(recordedValues, call.AimedArrivalTime) + //7 expectedarrivaltime + recordedValues = append(recordedValues, call.ExpectedArrivalTime) + //8 cancellation + recordedValues = append(recordedValues, call.Cancellation) + //9 actualdeparturetime + recordedValues = append(recordedValues, call.ActualDepartureTime) + //10 actualarrivaltime + recordedValues = append(recordedValues, call.ActualArrivalTime) + + //11 recorded_data (JSON) + recordedJsonObject := make(map[string]interface{}) + if call.StopPointName != "" { + recordedJsonObject["StopPointName"] = call.StopPointName + } + if call.ArrivalPlatformName != "" { + recordedJsonObject["ArrivalPlatformName"] = call.ArrivalPlatformName + } + if call.DeparturePlatformName != "" { + recordedJsonObject["DeparturePlatformName"] = call.DeparturePlatformName + } + if call.PredictionInaccurate != "" { + recordedJsonObject["PredictionInaccurate"] = call.PredictionInaccurate + } + if call.Occupancy != "" { + recordedJsonObject["Occupancy"] = call.Occupancy + } + + // Convert the JSON object to a JSON string + jsonString, err := json.Marshal(recordedJsonObject) + if err != nil { + log.Fatal(err) + } + recordedValues = append(recordedValues, string(jsonString)) + + // Insert or update the record + stringValues := make([]string, len(recordedValues)) + for i, v := range recordedValues { + stringValues[i] = fmt.Sprintf("%v", v) + } + interfaceValues := make([]interface{}, len(stringValues)) + for i, v := range stringValues { + interfaceValues[i] = v + } + + id, action, err := database.InsertOrUpdateRecordedCall(db, interfaceValues) + if err != nil { + fmt.Printf("Error inserting/updating recorded call: %v\n", err) + } else { + if 1 == 0 { + fmt.Printf("Action: %s, ID: %d\n", action, id) + } + + if action == "insert" { + recordedCallInsertCount++ + //fmt.Printf("Action: %s, ID: %d\n", action, id) + } else if action == "update" { + recordedCallUpdateCount++ + } + } + } + } + + } + fmt.Printf( + "DONE: Inserts: %d, Updates: %d, Total: %d; estimatedCalls = I: %d U: %d; recordedCalls = I: %d U: %d\n", + insertCount, + updateCount, + totalCount, + estimatedCallInsertCount, + estimatedCallUpdateCount, + recordedCallInsertCount, + recordedCallUpdateCount, + ) + // Create map to hold JSON + serviceDeliveryJsonObject := make(map[string]interface{}) + + // Add fields to JSON + serviceDeliveryJsonObject["Inserts"] = insertCount + serviceDeliveryJsonObject["Updates"] = updateCount + serviceDeliveryJsonObject["EstimatedCallInserts"] = estimatedCallInsertCount + serviceDeliveryJsonObject["EstimatedCallUpdates"] = estimatedCallUpdateCount + serviceDeliveryJsonObject["RecordedCallInserts"] = recordedCallInsertCount + serviceDeliveryJsonObject["RecordedCallUpdates"] = recordedCallUpdateCount + + // Convert JSON object to JSON string + serviceDeliveryJsonString, err := json.Marshal(serviceDeliveryJsonObject) + if err != nil { + log.Fatal(err) + } + + // Update ServiceDelivery data in database + err = database.UpdateServiceDeliveryData(db, sid, string(serviceDeliveryJsonString)) + if err != nil { + log.Fatal(err) } - fmt.Printf("Inserts: %d, Updates: %d, Total: %d; estimatedCalls = I: %d U: %d\n", insertCount, updateCount, totalCount, estimatedCallInsertCount, estimatedCallUpdateCount) } diff --git a/main.go b/main.go index 2d26cc1..3519749 100644 --- a/main.go +++ b/main.go @@ -2,13 +2,12 @@ package main import ( "log" - "ti1/config" "ti1/data" "ti1/export" ) func main() { - config.PrintDBConfig() + //config.PrintDBConfig() data, err := data.FetchData() if err != nil {