using Google.Protobuf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Web.Hosting; using System.Web.Http; using Tango.Core.Helpers; using Tango.PMR.Stubs; using Tango.PMR.Synchronization; using Tango.Synchronization.Local; using Tango.Synchronization.Remote; namespace Tango.MachineService.Controllers { public class SynchronizationController : ApiController { [HttpPost] public SynchronizeDBResponse Synchronize(SynchronizeDBRequest request) { String tempFolder = PathHelper.GetTempFolderPath(); try { //File path for the reflected remote data base SQLite. String masterSQLiteFile = Path.Combine(tempFolder, "Remote.db"); //File path for the received machine SQLite db. String slaveSQLiteFile = Path.Combine(tempFolder, "Local.db"); //Save the machine db to file. File.WriteAllBytes(slaveSQLiteFile, request.LocalDB.ToByteArray()); //Copy an SQLite db template. File.Copy(HostingEnvironment.MapPath(@"~/App_Data/Tango.db"), masterSQLiteFile); //Synchronize the SQL Server db with the new SQLite template. (Overwrite basically) RemoteDBSynchronizer.Synchronize(masterSQLiteFile, request.SerialNumber, true); //Synchronize the received machine db with the filled template. LocalDBSynchronizer.Synchronize(masterSQLiteFile, slaveSQLiteFile); //Send the synchronized machine db to the machine to the machine. SynchronizeDBResponse response = new SynchronizeDBResponse(); response.RemoteDB = ByteString.CopyFrom(File.ReadAllBytes(slaveSQLiteFile)); return response; } catch (Exception) { throw; } finally { //Remove all temporary files and folder. PathHelper.TryDeleteFolder(tempFolder); } } } }