/dotnet/Sync/LocalDb.cs

http://sigma-h.googlecode.com/ · C# · 147 lines · 115 code · 32 blank · 0 comment · 9 complexity · cad3ad5880c45cfc8bb7a74acf7792a0 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data.SQLite;
  6. using ActivityInfo.Api;
  7. using System.Windows.Forms;
  8. namespace ActivityInfo.Sync
  9. {
  10. class LocalDb
  11. {
  12. private ActivityInfoService service;
  13. private SQLiteConnection connection;
  14. private List<SyncRegion>.Enumerator regionEnum;
  15. private bool currentRegionIsComplete = true;
  16. public LocalDb(ActivityInfoService service)
  17. {
  18. this.service = service;
  19. var builder = new SQLiteConnectionStringBuilder();
  20. builder.DataSource = Application.UserAppDataPath + "\\ActivityInfo.db";
  21. connection = new SQLiteConnection(builder.ToString());
  22. connection.Open();
  23. executeSQL("create table if not exists sync_regions (id TEXT, localVersion INTEGER)");
  24. executeSQL("create table if not exists sync_history (lastUpdate INTEGER)");
  25. regionEnum = service.GetSyncRegions().List.GetEnumerator();
  26. }
  27. public SQLiteConnection Connection
  28. {
  29. get
  30. {
  31. return connection;
  32. }
  33. }
  34. public bool NextSyncStep(SyncLogger logger)
  35. {
  36. if (currentRegionIsComplete)
  37. {
  38. if (!regionEnum.MoveNext())
  39. {
  40. return false;
  41. }
  42. }
  43. SyncRegion region = regionEnum.Current;
  44. string localVersion = queryLocalVersion(region.Id);
  45. logger.log(1, "Requesting updates for region '" + region.Id + "', localVersion = " + localVersion);
  46. SyncRegionUpdates updates;
  47. updates = service.GetSyncRegionUpdates(region.Id, localVersion);
  48. if (updates.Sql != null)
  49. {
  50. foreach (SyncRegionUpdate update in updates.Sql)
  51. {
  52. executeUpdate(logger, update);
  53. }
  54. }
  55. updateLocalVersion(region.Id, updates.Version);
  56. currentRegionIsComplete = updates.Complete;
  57. logger.log(1, " now at version " + updates.Version + " [complete=" + updates.Complete + "]");
  58. return true;
  59. }
  60. private int executeUpdate(SyncLogger logger, SyncRegionUpdate update)
  61. {
  62. logger.log(2, update.Statement);
  63. SQLiteCommand cmd = new SQLiteCommand(connection);
  64. cmd.CommandText = update.Statement;
  65. if (update.Executions == null)
  66. {
  67. return cmd.ExecuteNonQuery();
  68. }
  69. else
  70. {
  71. int rowsAffected = 0;
  72. foreach (ParameterSet set in update.Executions)
  73. {
  74. logger.log(3, string.Join(",", set));
  75. cmd.Parameters.Clear();
  76. foreach (string param in set)
  77. {
  78. SQLiteParameter p = new SQLiteParameter();
  79. p.Value = param;
  80. cmd.Parameters.Add(p);
  81. }
  82. rowsAffected += cmd.ExecuteNonQuery();
  83. }
  84. return rowsAffected;
  85. }
  86. }
  87. private int executeSQL(String sql)
  88. {
  89. SQLiteCommand cmd = new SQLiteCommand(sql, connection);
  90. return cmd.ExecuteNonQuery();
  91. }
  92. private String queryLocalVersion(String regionId)
  93. {
  94. SQLiteCommand cmd = new SQLiteCommand(connection);
  95. cmd.CommandText = "select localVersion from sync_regions where id = :id";
  96. cmd.Parameters.Add(new SQLiteParameter("id", regionId));
  97. object result = cmd.ExecuteScalar();
  98. return result == null ? null : result.ToString();
  99. }
  100. private void updateLocalVersion(string regionId, string localVersion)
  101. {
  102. SQLiteCommand cmd = new SQLiteCommand(connection);
  103. cmd.CommandText = "update sync_regions set localVersion = :localVersion where id = :id";
  104. cmd.Parameters.Add(new SQLiteParameter("localVersion", localVersion));
  105. cmd.Parameters.Add(new SQLiteParameter("id", regionId));
  106. if(cmd.ExecuteNonQuery() == 0) {
  107. cmd = new SQLiteCommand(connection);
  108. cmd.CommandText = "insert into sync_regions (id, localVersion) values (:id, :localVersion)";
  109. cmd.Parameters.Add(new SQLiteParameter("id", regionId));
  110. cmd.Parameters.Add(new SQLiteParameter("localVersion", localVersion));
  111. cmd.ExecuteNonQuery();
  112. }
  113. }
  114. }
  115. }