public static void Ctor_GivenNullIdentifierDefaults_ThrowsArgumentNullException()
        {
            var connection = Mock.Of <ISchematicConnection>();
            var pragma     = new ConnectionPragma(connection);

            Assert.That(() => new SqliteRelationalDatabase(connection, null, pragma), Throws.ArgumentNullException);
        }
Esempio n. 2
0
        /// <summary>
        /// Gets all database views.
        /// </summary>
        /// <param name="cancellationToken">A cancellation token.</param>
        /// <returns>A collection of database views.</returns>
        public virtual async IAsyncEnumerable <IDatabaseView> GetAllViews([EnumeratorCancellation] CancellationToken cancellationToken = default)
        {
            var dbNamesQuery = await ConnectionPragma.DatabaseListAsync(cancellationToken).ConfigureAwait(false);

            var dbNames = dbNamesQuery
                          .OrderBy(d => d.seq)
                          .Select(d => d.name)
                          .ToList();

            var qualifiedViewNames = new List <Identifier>();

            foreach (var dbName in dbNames)
            {
                var sql         = ViewsQuery(dbName);
                var queryResult = await DbConnection.QueryAsync <string>(sql, cancellationToken).ConfigureAwait(false);

                var viewNames = queryResult
                                .Where(name => !IsReservedTableName(name))
                                .Select(name => Identifier.CreateQualifiedIdentifier(dbName, name));

                qualifiedViewNames.AddRange(viewNames);
            }

            var orderedViewNames = qualifiedViewNames
                                   .OrderBy(v => v.Schema)
                                   .ThenBy(v => v.LocalName);

            foreach (var viewName in orderedViewNames)
            {
                yield return(await LoadViewAsyncCore(viewName, cancellationToken).ConfigureAwait(false));
            }
        }
Esempio n. 3
0
        private async Task <Option <IDatabaseView> > GetViewAsyncCore(Identifier viewName, CancellationToken cancellationToken)
        {
            if (viewName.Schema != null)
            {
                return(await LoadView(viewName, cancellationToken)
                       .ToOption()
                       .ConfigureAwait(false));
            }

            var dbNamesResult = await ConnectionPragma.DatabaseListAsync(cancellationToken).ConfigureAwait(false);

            var dbNames = dbNamesResult.OrderBy(l => l.seq).Select(l => l.name).ToList();

            foreach (var dbName in dbNames)
            {
                var qualifiedViewName = Identifier.CreateQualifiedIdentifier(dbName, viewName.LocalName);
                var view = LoadView(qualifiedViewName, cancellationToken);

                var viewIsSome = await view.IsSome.ConfigureAwait(false);

                if (viewIsSome)
                {
                    return(await view.ToOption().ConfigureAwait(false));
                }
            }

            return(Option <IDatabaseView> .None);
        }
Esempio n. 4
0
        private async Task <Option <Identifier> > GetResolvedViewNameAsyncCore(Identifier viewName, CancellationToken cancellationToken)
        {
            if (viewName.Schema != null)
            {
                var sql           = ViewNameQuery(viewName.Schema);
                var viewLocalName = await DbConnection.ExecuteScalarAsync <string>(
                    sql,
                    new { ViewName = viewName.LocalName },
                    cancellationToken
                    ).ConfigureAwait(false);

                if (viewLocalName != null)
                {
                    var dbList = await ConnectionPragma.DatabaseListAsync(cancellationToken).ConfigureAwait(false);

                    var viewSchemaName = dbList
                                         .OrderBy(s => s.seq)
                                         .Select(s => s.name)
                                         .FirstOrDefault(s => string.Equals(s, viewName.Schema, StringComparison.OrdinalIgnoreCase));
                    if (viewSchemaName == null)
                    {
                        throw new InvalidOperationException("Unable to find a database matching the given schema name: " + viewName.Schema);
                    }

                    return(Option <Identifier> .Some(Identifier.CreateQualifiedIdentifier(viewSchemaName, viewLocalName)));
                }
            }

            var dbNamesResult = await ConnectionPragma.DatabaseListAsync(cancellationToken).ConfigureAwait(false);

            var dbNames = dbNamesResult
                          .OrderBy(l => l.seq)
                          .Select(l => l.name)
                          .ToList();

            foreach (var dbName in dbNames)
            {
                var sql           = ViewNameQuery(dbName);
                var viewLocalName = await DbConnection.ExecuteScalarAsync <string>(
                    sql,
                    new { ViewName = viewName.LocalName },
                    cancellationToken
                    ).ConfigureAwait(false);

                if (viewLocalName != null)
                {
                    return(Option <Identifier> .Some(Identifier.CreateQualifiedIdentifier(dbName, viewLocalName)));
                }
            }

            return(Option <Identifier> .None);
        }