private static JournalElement UpdateConfiguration(JournalElement conf)
        {
            string         settingsFile   = Path.Combine(conf.DefaultPath, MetadataConstants.JOURNAL_SETTINGS_FILE_NAME);
            JournalElement existingConfig = null;

            if (File.Exists(settingsFile))
            {
                try
                {
                    using (var dbXml = File.OpenRead(settingsFile))
                    {
                        existingConfig = ConfigurationSerializer.ReadJournalConfiguration(dbXml);
                    }
                }
                catch (IOException)
                {
                }
                catch (InvalidOperationException)
                {
                }

                if (existingConfig != null)
                {
                    existingConfig.OpenPartitionTtl  = conf.OpenPartitionTtl;
                    existingConfig.MaxOpenPartitions = conf.MaxOpenPartitions;
                    existingConfig.LagHours          = conf.LagHours;
                    existingConfig.DefaultPath       = conf.DefaultPath;
                    existingConfig.SerializerName    = conf.SerializerName;
                    existingConfig.FromDisk          = true;
                    return(existingConfig);
                }
            }
            return(conf);
        }
        public static JournalMetadata CreateNewJournalMetadata(JournalElement config, Type t = null)
        {
            if (t != null)
            {
                var serializerFactory =
                    JournalSerializerRegistry.Instance.GetSerializer(config.SerializerName ??
                                                                     MetadataConstants.DEFAULT_SERIALIZER_NAME);
                return(new JournalMetadata(config, serializerFactory, t));
            }

            return(new JournalMetadata(config, new RecordSerializerFactory(config), null));
        }
Exemple #3
0
        internal JournalMetadata(JournalElement config, ISerializerFactory serializerFactory, Type itemType)
        {
            _serializerFactory = serializerFactory;
            var columnSerializers = _serializerFactory.Initialize(itemType);

            columnSerializers = CheckColumnMatch(config, columnSerializers, itemType);
            _columns          = ParseColumns(columnSerializers, config.Columns);
            _settings         = new JournalSettings(config, _columns);

            // Parse.
            FileCount = CalcFilesCount(_columns);

            // Timestamp.
            if (!string.IsNullOrEmpty(config.TimestampColumn))
            {
                var timestampColumn = _columns.FirstOrDefault(c =>
                                                              c.PropertyName.Equals(config.TimestampColumn, StringComparison.OrdinalIgnoreCase));

                if (timestampColumn == null)
                {
                    throw new NFSdbConfigurationException("Timestamp column with name {0} is not found",
                                                          config.TimestampColumn);
                }

                if (timestampColumn.ColumnType != EFieldType.DateTime &&
                    timestampColumn.ColumnType != EFieldType.DateTimeEpochMs &&
                    timestampColumn.ColumnType != EFieldType.Int64)
                {
                    throw new NFSdbConfigurationException("Timestamp column {0} must be DateTime or Int64 but was {1}",
                                                          config.TimestampColumn, timestampColumn.ColumnType);
                }

                _timestampColumn  = _columns.Single(c => c.FileName.Equals(config.TimestampColumn, StringComparison.OrdinalIgnoreCase));
                TimestampColumnID = _timestampColumn.ColumnID;
            }

            // IsNull.
            var last = _columns.Last();

            if (last.ColumnType == EFieldType.BitSet)
            {
                IsNullColumnID = last.ColumnID;
            }

            // Misc.
            PartitionTtl = TimeSpan.FromMilliseconds(config.OpenPartitionTtl);
            Name         = config.Class;
        }
Exemple #4
0
 internal JournalSettings(JournalElement jconf, IEnumerable <ColumnMetadata> actualColumns)
 {
     _defaultPath       = jconf.DefaultPath;
     _timestampColumn   = jconf.TimestampColumn;
     _keySymbol         = jconf.Key;
     _partitionType     = jconf.PartitionType;
     _openPartitionTtl  = jconf.OpenPartitionTtl;
     _maxOpenPartitions = jconf.MaxOpenPartitions;
     _lagHours          = jconf.LagHours;
     _columns           = actualColumns.ToArray();
     _recordHint        = jconf.RecordHint;
     if (_recordHint <= 0)
     {
         _recordHint = MetadataConstants.DEFAULT_RECORD_HINT;
     }
 }
        public IJournal <T> ToJournal <T>()
        {
            _config = UpdateConfiguration(_config);
            var serializerFactory =
                JournalSerializerRegistry.Instance.GetSerializer(_config.SerializerName ??
                                                                 MetadataConstants.DEFAULT_SERIALIZER_NAME);
            var meta = new JournalMetadata(_config, serializerFactory, typeof(T));

            var fileFactory = new CompositeFileFactory(_config.FileFlags);

            if (_server != null)
            {
                var partMan = new PartitionManager(meta, _access, fileFactory, _server);
                return(new Journal <T>(meta, partMan, _server));
            }
            else
            {
                var server  = new AsyncJournalServer(_serverTasksLatency);
                var partMan = new PartitionManager(meta, _access, fileFactory, server);
                partMan.OnDisposed += server.Dispose;
                return(new Journal <T>(meta, partMan, _server));
            }
        }
Exemple #6
0
        private static IEnumerable <IColumnSerializerMetadata> CheckColumnMatch(JournalElement jconf,
                                                                                IEnumerable <IColumnSerializerMetadata> columns, Type itemType)
        {
            if (!jconf.FromDisk)
            {
                return(columns);
            }

            var columnsList = columns as IList <IColumnSerializerMetadata>;

            if (columnsList == null)
            {
                columnsList = columns.ToList();
            }

            // Columns and column order must match.
            // If bitset exists it must be the last one.
            var hasBitSet    = columnsList[columnsList.Count - 1].ColumnType == EFieldType.BitSet;
            var parsedColLen = hasBitSet ? columnsList.Count - 1 : columnsList.Count;
            var confColumns  = jconf.Columns;

            if (parsedColLen != confColumns.Count)
            {
                throw new NFSdbConfigurationException("Settings loaded from disk has '{0}' " +
                                                      "columns but the serializer parsed " +
                                                      "class of '{1}' as '{2}' fields. Column count mismatch.",
                                                      confColumns.Count, itemType, parsedColLen);
            }


            for (int i = 0; i < confColumns.Count; i++)
            {
                bool found = false;
                for (int j = i; j < parsedColLen; j++)
                {
                    if (string.Equals(confColumns[i].Name, columnsList[j].PropertyName,
                                      StringComparison.OrdinalIgnoreCase))
                    {
                        if (columnsList[j].ColumnType != confColumns[i].ColumnType)
                        {
                            if (!(confColumns[i].ColumnType == EFieldType.Symbol &&
                                  columnsList[i].ColumnType == EFieldType.String))
                            {
                                throw new NFSdbConfigurationException("Type '{0}' has field '{1}' of type '{2}' " +
                                                                      "while data on disk has column '{3}' of type '{4}'",
                                                                      itemType, columnsList[j].PropertyName, columnsList[j].ColumnType,
                                                                      confColumns[i].Name, confColumns[i].ColumnType);
                            }
                        }

                        // Put column j at place i in columnList
                        if (i != j)
                        {
                            var t = columnsList[j];
                            columnsList[j] = columnsList[i];
                            columnsList[i] = t;
                        }
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    throw new NFSdbConfigurationException("Type '{0}' does not have field for column name '{1}'",
                                                          itemType, confColumns[i].Name);
                }
            }
            return(columnsList);
        }
 public JournalBuilder(JournalElement configuration)
 {
     _access = EFileAccess.ReadWrite;
     _config = configuration;
 }
 public JournalBuilder()
 {
     _access = EFileAccess.ReadWrite;
     _config = new JournalElement();
     _config.SerializerName = MetadataConstants.POCO_SERIALIZER_NAME;
 }
 public static JournalMetadata CreateJournalMetadata(JournalElement config, Type t = null)
 {
     config = UpdateConfiguration(config);
     return(CreateNewJournalMetadata(config));
 }
Exemple #10
0
 public static void WriteJournalConfiguration(Stream output, JournalElement element)
 {
     JOURNAL_SERIALIZER.Serialize(output, element);
 }