예제 #1
0
        /// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="fileName"></param>
        public void CreateDatabaseIfMissing(string fileName)
        {
            if (!String.IsNullOrEmpty(fileName))
            {
                bool fileMissing = !File.Exists(fileName);
                bool fileEmpty   = fileMissing || new FileInfo(fileName).Length == 0;
                if (fileMissing || fileEmpty)
                {
                    var configuration = Factory.Singleton.Resolve <IConfigurationStorage>().Singleton.Load();

                    var folder = Path.GetDirectoryName(fileName);
                    if (!Directory.Exists(folder))
                    {
                        Directory.CreateDirectory(folder);
                    }
                    if (fileMissing)
                    {
                        File.Create(fileName).Close();
                    }

                    CloseConnection();
                    OpenConnection(fileName, true);
                    try {
                        if (_Connection != null)
                        {
                            var transaction = _Connection.BeginTransaction();
                            try {
                                _DbHistoryTable.CreateTable(_Connection, _DatabaseLog);
                                _DbInfoTable.CreateTable(_Connection, _DatabaseLog);
                                _SystemEventsTable.CreateTable(_Connection, _DatabaseLog);
                                _LocationsTable.CreateTable(_Connection, _DatabaseLog);
                                _SessionsTable.CreateTable(_Connection, _DatabaseLog);
                                _AircraftTable.CreateTable(_Connection, _DatabaseLog);
                                _FlightTable.CreateTable(_Connection, _DatabaseLog);

                                _SessionsTable.CreateTriggers(_Connection, _DatabaseLog);
                                _AircraftTable.CreateTriggers(_Connection, _DatabaseLog);

                                _DbHistoryTable.Insert(_Connection, null, _DatabaseLog, new BaseStationDBHistory()
                                {
                                    Description = "Database autocreated by Virtual Radar Server", TimeStamp = SQLiteDateHelper.Truncate(Provider.UtcNow)
                                });
                                _DbInfoTable.Insert(_Connection, null, _DatabaseLog, new BaseStationDBInfo()
                                {
                                    OriginalVersion = 2, CurrentVersion = 2
                                });
                                _LocationsTable.Insert(_Connection, null, _DatabaseLog, new BaseStationLocation()
                                {
                                    LocationName = "Home", Latitude = configuration.GoogleMapSettings.InitialMapLatitude, Longitude = configuration.GoogleMapSettings.InitialMapLongitude
                                });

                                transaction.Commit();
                            } catch (Exception ex) {
                                Debug.WriteLine(String.Format("Database.CreateDatabaseIfMissing caught exception {0}", ex.ToString()));
                                transaction.Rollback();
                                throw;
                            }
                        }
                    } finally {
                        CloseConnection();
                    }
                }
            }
        }