示例#1
0
        public ICommandChannel Create(CreationParameters <SqliteConnectionStringBuilder> creationParameters)
        {
            if (creationParameters.ConnectionString.DataSource == ":memory:")
            {
                throw new NotSupportedException("Use " + nameof(MemorySqliteCommandChannelFactory));
            }

            CreationOrDeletionLock.EnterUpgradeableReadLock();

            try
            {
                if (creationParameters.EraseIfExists)
                {
                    DeleteIfExists(creationParameters.ConnectionString);
                }

                CreationOrDeletionLock.EnterWriteLock();

                try
                {
                    var derivedConnectionString = new SqliteConnectionStringBuilder(creationParameters.ConnectionString.ToString())
                    {
                        Mode = SqliteOpenMode.ReadWriteCreate
                    };

                    var connection = new SqliteConnection(derivedConnectionString.ToString());
                    connection.Open();
                    var adapter = new CommandChannel(new ThreadSafeConnection(new Connection(new SqliteConnection(creationParameters.ConnectionString.ToString()))));

                    foreach (var script in creationParameters.AdditionalScripts.Prepend(creationParameters.Script))
                    {
                        if (!string.IsNullOrWhiteSpace(script))
                        {
                            adapter.Execute(script);
                        }
                    }

                    return(adapter);
                }
                finally
                {
                    CreationOrDeletionLock.ExitWriteLock();
                }
            }
            finally
            {
                CreationOrDeletionLock.ExitUpgradeableReadLock();
            }
        }
        public ICommandChannel Create(CreationParameters <MemorySqliteConnectionStringBuilder> creationParameters)
        {
            var mustPlayCreationScripts = true;
            var connection = Instances.AddOrUpdate(
                creationParameters.ConnectionString.MemoryInstanceGuid,
                guid => new SqliteConnection(creationParameters.ConnectionString.ConnectionString),
                (guid, previous) =>
            {
                mustPlayCreationScripts = creationParameters.EraseIfExists;
                return(creationParameters.EraseIfExists ? new SqliteConnection(creationParameters.ConnectionString.ConnectionString) : previous);
            });

            var channel = new CommandChannel(new MemoryConnection(connection));

            if (mustPlayCreationScripts)
            {
                channel.Execute(creationParameters.Script);
                foreach (var creationParametersAdditionalScript in creationParameters.AdditionalScripts)
                {
                    channel.Execute(creationParametersAdditionalScript);
                }
            }
            return(channel);
        }