Update to new doc library
Still need to remove deprecated calls
This commit is contained in:
parent
f4be57b665
commit
cd450a05e5
@ -5,8 +5,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="BitBadger.Documents.Postgres" Version="3.1.0" />
|
<PackageReference Include="BitBadger.Documents.Postgres" Version="4.0.0-rc1" />
|
||||||
<PackageReference Include="BitBadger.Documents.Sqlite" Version="3.1.0" />
|
<PackageReference Include="BitBadger.Documents.Sqlite" Version="4.0.0-rc1" />
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.6" />
|
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Postgres
|
open BitBadger.Documents.Postgres
|
||||||
|
open BitBadger.Documents.Postgres.Compat
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
open MyWebLog.Data
|
open MyWebLog.Data
|
||||||
@ -19,7 +20,7 @@ type PostgresCategoryData(log: ILogger) =
|
|||||||
let countTopLevel webLogId =
|
let countTopLevel webLogId =
|
||||||
log.LogTrace "Category.countTopLevel"
|
log.LogTrace "Category.countTopLevel"
|
||||||
Custom.scalar
|
Custom.scalar
|
||||||
$"""{Query.Count.byContains Table.Category}
|
$"""{Query.byContains (Query.count Table.Category)}
|
||||||
AND {Query.whereByField (Field.NEX (nameof Category.Empty.ParentId)) ""}"""
|
AND {Query.whereByField (Field.NEX (nameof Category.Empty.ParentId)) ""}"""
|
||||||
[ webLogContains webLogId ]
|
[ webLogContains webLogId ]
|
||||||
toCount
|
toCount
|
||||||
@ -87,11 +88,11 @@ type PostgresCategoryData(log: ILogger) =
|
|||||||
if hasChildren then
|
if hasChildren then
|
||||||
let childQuery, childParams =
|
let childQuery, childParams =
|
||||||
if cat.ParentId.IsSome then
|
if cat.ParentId.IsSome then
|
||||||
Query.Patch.byId Table.Category,
|
Query.byId (Query.patch Table.Category) "",
|
||||||
children
|
children
|
||||||
|> List.map (fun child -> [ idParam child.Id; jsonParam "@data" {| ParentId = cat.ParentId |} ])
|
|> List.map (fun child -> [ idParam child.Id; jsonParam "@data" {| ParentId = cat.ParentId |} ])
|
||||||
else
|
else
|
||||||
Query.RemoveFields.byId Table.Category,
|
Query.byId (Query.removeFields Table.Category) "",
|
||||||
children
|
children
|
||||||
|> List.map (fun child ->
|
|> List.map (fun child ->
|
||||||
[ idParam child.Id; fieldNameParam [ nameof Category.Empty.ParentId ] ])
|
[ idParam child.Id; fieldNameParam [ nameof Category.Empty.ParentId ] ])
|
||||||
@ -111,7 +112,7 @@ type PostgresCategoryData(log: ILogger) =
|
|||||||
Configuration.dataSource ()
|
Configuration.dataSource ()
|
||||||
|> Sql.fromDataSource
|
|> Sql.fromDataSource
|
||||||
|> Sql.executeTransactionAsync
|
|> Sql.executeTransactionAsync
|
||||||
[ Query.Patch.byId Table.Post,
|
[ Query.byId (Query.patch Table.Post) "",
|
||||||
posts
|
posts
|
||||||
|> List.map (fun post ->
|
|> List.map (fun post ->
|
||||||
[ idParam post.Id
|
[ idParam post.Id
|
||||||
|
@ -83,7 +83,7 @@ let webLogContains webLogId =
|
|||||||
|
|
||||||
/// A SQL string to select data from a table with the given JSON document contains criteria
|
/// A SQL string to select data from a table with the given JSON document contains criteria
|
||||||
let selectWithCriteria tableName =
|
let selectWithCriteria tableName =
|
||||||
$"""{Query.selectFromTable tableName} WHERE {Query.whereDataContains "@criteria"}"""
|
$"""{Query.find tableName} WHERE {Query.whereDataContains "@criteria"}"""
|
||||||
|
|
||||||
/// Create the SQL and parameters for an IN clause
|
/// Create the SQL and parameters for an IN clause
|
||||||
let inClause<'T> colNameAndPrefix paramName (items: 'T list) =
|
let inClause<'T> colNameAndPrefix paramName (items: 'T list) =
|
||||||
@ -162,7 +162,7 @@ module Document =
|
|||||||
/// Find a document by its ID for the given web log
|
/// Find a document by its ID for the given web log
|
||||||
let findByIdAndWebLog<'TKey, 'TDoc> table (key: 'TKey) webLogId =
|
let findByIdAndWebLog<'TKey, 'TDoc> table (key: 'TKey) webLogId =
|
||||||
Custom.single
|
Custom.single
|
||||||
$"""{Query.selectFromTable table} WHERE {Query.whereById "@id"} AND {Query.whereDataContains "@criteria"}"""
|
$"""{Query.find table} WHERE {Query.whereById "@id"} AND {Query.whereDataContains "@criteria"}"""
|
||||||
[ "@id", Sql.string (string key); webLogContains webLogId ]
|
[ "@id", Sql.string (string key); webLogContains webLogId ]
|
||||||
fromData<'TDoc>
|
fromData<'TDoc>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ type PostgresThemeData(log: ILogger) =
|
|||||||
let all () =
|
let all () =
|
||||||
log.LogTrace "Theme.all"
|
log.LogTrace "Theme.all"
|
||||||
Custom.list
|
Custom.list
|
||||||
$"{Query.selectFromTable Table.Theme}
|
$"{Query.find Table.Theme}
|
||||||
WHERE data ->> '{nameof Theme.Empty.Id}' <> 'admin'
|
WHERE data ->> '{nameof Theme.Empty.Id}' <> 'admin'
|
||||||
ORDER BY data ->> '{nameof Theme.Empty.Id}'"
|
ORDER BY data ->> '{nameof Theme.Empty.Id}'"
|
||||||
[]
|
[]
|
||||||
@ -37,7 +37,7 @@ type PostgresThemeData(log: ILogger) =
|
|||||||
/// Find a theme by its ID (excludes the text of templates)
|
/// Find a theme by its ID (excludes the text of templates)
|
||||||
let findByIdWithoutText (themeId: ThemeId) =
|
let findByIdWithoutText (themeId: ThemeId) =
|
||||||
log.LogTrace "Theme.findByIdWithoutText"
|
log.LogTrace "Theme.findByIdWithoutText"
|
||||||
Custom.single (Query.Find.byId Table.Theme) [ idParam themeId ] withoutTemplateText
|
Custom.single (Query.byId (Query.find Table.Theme) (string themeId)) [ idParam themeId ] withoutTemplateText
|
||||||
|
|
||||||
/// Delete a theme by its ID
|
/// Delete a theme by its ID
|
||||||
let delete themeId = backgroundTask {
|
let delete themeId = backgroundTask {
|
||||||
|
@ -32,13 +32,13 @@ type PostgresWebLogData(log: ILogger) =
|
|||||||
WHERE post_id IN (SELECT data->>'Id' FROM {Table.Post} WHERE {Query.whereDataContains "@criteria"});
|
WHERE post_id IN (SELECT data->>'Id' FROM {Table.Post} WHERE {Query.whereDataContains "@criteria"});
|
||||||
DELETE FROM {Table.PageRevision}
|
DELETE FROM {Table.PageRevision}
|
||||||
WHERE page_id IN (SELECT data->>'Id' FROM {Table.Page} WHERE {Query.whereDataContains "@criteria"});
|
WHERE page_id IN (SELECT data->>'Id' FROM {Table.Page} WHERE {Query.whereDataContains "@criteria"});
|
||||||
{Query.Delete.byContains Table.Post};
|
{Query.byContains (Query.delete Table.Post)};
|
||||||
{Query.Delete.byContains Table.Page};
|
{Query.byContains (Query.delete Table.Page)};
|
||||||
{Query.Delete.byContains Table.Category};
|
{Query.byContains (Query.delete Table.Category)};
|
||||||
{Query.Delete.byContains Table.TagMap};
|
{Query.byContains (Query.delete Table.TagMap)};
|
||||||
{Query.Delete.byContains Table.WebLogUser};
|
{Query.byContains (Query.delete Table.WebLogUser)};
|
||||||
DELETE FROM {Table.Upload} WHERE web_log_id = @webLogId;
|
DELETE FROM {Table.Upload} WHERE web_log_id = @webLogId;
|
||||||
DELETE FROM {Table.WebLog} WHERE {Query.whereById "@webLogId"}"""
|
DELETE FROM {Table.WebLog} WHERE data->>'Id' = @webLogId"""
|
||||||
[ webLogIdParam webLogId; webLogContains webLogId ]
|
[ webLogIdParam webLogId; webLogContains webLogId ]
|
||||||
|
|
||||||
/// Find a web log by its host (URL base)
|
/// Find a web log by its host (URL base)
|
||||||
|
@ -25,7 +25,7 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
// Theme tables
|
// Theme tables
|
||||||
if needsTable Table.Theme then
|
if needsTable Table.Theme then
|
||||||
Query.Definition.ensureTable Table.Theme
|
Query.Definition.ensureTable Table.Theme
|
||||||
Query.Definition.ensureKey Table.Theme
|
Query.Definition.ensureKey Table.Theme PostgreSQL
|
||||||
if needsTable Table.ThemeAsset then
|
if needsTable Table.ThemeAsset then
|
||||||
$"CREATE TABLE {Table.ThemeAsset} (
|
$"CREATE TABLE {Table.ThemeAsset} (
|
||||||
theme_id TEXT NOT NULL,
|
theme_id TEXT NOT NULL,
|
||||||
@ -37,28 +37,28 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
// Web log table
|
// Web log table
|
||||||
if needsTable Table.WebLog then
|
if needsTable Table.WebLog then
|
||||||
Query.Definition.ensureTable Table.WebLog
|
Query.Definition.ensureTable Table.WebLog
|
||||||
Query.Definition.ensureKey Table.WebLog
|
Query.Definition.ensureKey Table.WebLog PostgreSQL
|
||||||
Query.Definition.ensureDocumentIndex Table.WebLog Optimized
|
Query.Definition.ensureDocumentIndex Table.WebLog Optimized
|
||||||
|
|
||||||
// Category table
|
// Category table
|
||||||
if needsTable Table.Category then
|
if needsTable Table.Category then
|
||||||
Query.Definition.ensureTable Table.Category
|
Query.Definition.ensureTable Table.Category
|
||||||
Query.Definition.ensureKey Table.Category
|
Query.Definition.ensureKey Table.Category PostgreSQL
|
||||||
Query.Definition.ensureDocumentIndex Table.Category Optimized
|
Query.Definition.ensureDocumentIndex Table.Category Optimized
|
||||||
|
|
||||||
// Web log user table
|
// Web log user table
|
||||||
if needsTable Table.WebLogUser then
|
if needsTable Table.WebLogUser then
|
||||||
Query.Definition.ensureTable Table.WebLogUser
|
Query.Definition.ensureTable Table.WebLogUser
|
||||||
Query.Definition.ensureKey Table.WebLogUser
|
Query.Definition.ensureKey Table.WebLogUser PostgreSQL
|
||||||
Query.Definition.ensureDocumentIndex Table.WebLogUser Optimized
|
Query.Definition.ensureDocumentIndex Table.WebLogUser Optimized
|
||||||
|
|
||||||
// Page tables
|
// Page tables
|
||||||
if needsTable Table.Page then
|
if needsTable Table.Page then
|
||||||
Query.Definition.ensureTable Table.Page
|
Query.Definition.ensureTable Table.Page
|
||||||
Query.Definition.ensureKey Table.Page
|
Query.Definition.ensureKey Table.Page PostgreSQL
|
||||||
Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ]
|
Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Page "permalink" [ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ]
|
Table.Page "permalink" [ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ] PostgreSQL
|
||||||
if needsTable Table.PageRevision then
|
if needsTable Table.PageRevision then
|
||||||
$"CREATE TABLE {Table.PageRevision} (
|
$"CREATE TABLE {Table.PageRevision} (
|
||||||
page_id TEXT NOT NULL,
|
page_id TEXT NOT NULL,
|
||||||
@ -69,14 +69,15 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
// Post tables
|
// Post tables
|
||||||
if needsTable Table.Post then
|
if needsTable Table.Post then
|
||||||
Query.Definition.ensureTable Table.Post
|
Query.Definition.ensureTable Table.Post
|
||||||
Query.Definition.ensureKey Table.Post
|
Query.Definition.ensureKey Table.Post PostgreSQL
|
||||||
Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ]
|
Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ]
|
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Post
|
Table.Post
|
||||||
"status"
|
"status"
|
||||||
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]
|
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]
|
||||||
|
PostgreSQL
|
||||||
$"CREATE INDEX idx_post_category ON {Table.Post} USING GIN ((data['{nameof Post.Empty.CategoryIds}']))"
|
$"CREATE INDEX idx_post_category ON {Table.Post} USING GIN ((data['{nameof Post.Empty.CategoryIds}']))"
|
||||||
$"CREATE INDEX idx_post_tag ON {Table.Post} USING GIN ((data['{nameof Post.Empty.Tags}']))"
|
$"CREATE INDEX idx_post_tag ON {Table.Post} USING GIN ((data['{nameof Post.Empty.Tags}']))"
|
||||||
if needsTable Table.PostRevision then
|
if needsTable Table.PostRevision then
|
||||||
@ -87,13 +88,13 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
PRIMARY KEY (post_id, as_of))"
|
PRIMARY KEY (post_id, as_of))"
|
||||||
if needsTable Table.PostComment then
|
if needsTable Table.PostComment then
|
||||||
Query.Definition.ensureTable Table.PostComment
|
Query.Definition.ensureTable Table.PostComment
|
||||||
Query.Definition.ensureKey Table.PostComment
|
Query.Definition.ensureKey Table.PostComment PostgreSQL
|
||||||
Query.Definition.ensureIndexOn Table.PostComment "post" [ nameof Comment.Empty.PostId ]
|
Query.Definition.ensureIndexOn Table.PostComment "post" [ nameof Comment.Empty.PostId ] PostgreSQL
|
||||||
|
|
||||||
// Tag map table
|
// Tag map table
|
||||||
if needsTable Table.TagMap then
|
if needsTable Table.TagMap then
|
||||||
Query.Definition.ensureTable Table.TagMap
|
Query.Definition.ensureTable Table.TagMap
|
||||||
Query.Definition.ensureKey Table.TagMap
|
Query.Definition.ensureKey Table.TagMap PostgreSQL
|
||||||
Query.Definition.ensureDocumentIndex Table.TagMap Optimized
|
Query.Definition.ensureDocumentIndex Table.TagMap Optimized
|
||||||
|
|
||||||
// Uploaded file table
|
// Uploaded file table
|
||||||
@ -153,7 +154,8 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
Table.WebLogUser ]
|
Table.WebLogUser ]
|
||||||
|
|
||||||
Utils.Migration.logStep log migration "Adding unique indexes on ID fields"
|
Utils.Migration.logStep log migration "Adding unique indexes on ID fields"
|
||||||
do! Custom.nonQuery (tables |> List.map Query.Definition.ensureKey |> String.concat "; ") []
|
do! Custom.nonQuery
|
||||||
|
(tables |> List.map (fun it -> Query.Definition.ensureKey it PostgreSQL) |> String.concat "; ") []
|
||||||
|
|
||||||
Utils.Migration.logStep log migration "Removing constraints"
|
Utils.Migration.logStep log migration "Removing constraints"
|
||||||
let fkToDrop =
|
let fkToDrop =
|
||||||
@ -187,24 +189,25 @@ type PostgresData(log: ILogger<PostgresData>, ser: JsonSerializer) =
|
|||||||
|
|
||||||
Utils.Migration.logStep log migration "Adding new indexes"
|
Utils.Migration.logStep log migration "Adding new indexes"
|
||||||
let newIdx =
|
let newIdx =
|
||||||
[ yield! tables |> List.map Query.Definition.ensureKey
|
[ yield! tables |> List.map (fun it -> Query.Definition.ensureKey it PostgreSQL)
|
||||||
Query.Definition.ensureDocumentIndex Table.Category Optimized
|
Query.Definition.ensureDocumentIndex Table.Category Optimized
|
||||||
Query.Definition.ensureDocumentIndex Table.TagMap Optimized
|
Query.Definition.ensureDocumentIndex Table.TagMap Optimized
|
||||||
Query.Definition.ensureDocumentIndex Table.WebLog Optimized
|
Query.Definition.ensureDocumentIndex Table.WebLog Optimized
|
||||||
Query.Definition.ensureDocumentIndex Table.WebLogUser Optimized
|
Query.Definition.ensureDocumentIndex Table.WebLogUser Optimized
|
||||||
Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ]
|
Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Page "permalink" [ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ]
|
Table.Page "permalink" [ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ]
|
Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ]
|
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ] PostgreSQL
|
||||||
Query.Definition.ensureIndexOn
|
Query.Definition.ensureIndexOn
|
||||||
Table.Post
|
Table.Post
|
||||||
"status"
|
"status"
|
||||||
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]
|
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]
|
||||||
|
PostgreSQL
|
||||||
$"CREATE INDEX idx_post_category ON {Table.Post} USING GIN ((data['{nameof Post.Empty.CategoryIds}']))"
|
$"CREATE INDEX idx_post_category ON {Table.Post} USING GIN ((data['{nameof Post.Empty.CategoryIds}']))"
|
||||||
$"CREATE INDEX idx_post_tag ON {Table.Post} USING GIN ((data['{nameof Post.Empty.Tags}']))"
|
$"CREATE INDEX idx_post_tag ON {Table.Post} USING GIN ((data['{nameof Post.Empty.Tags}']))"
|
||||||
Query.Definition.ensureIndexOn Table.PostComment "post" [ nameof Comment.Empty.PostId ] ]
|
Query.Definition.ensureIndexOn Table.PostComment "post" [ nameof Comment.Empty.PostId ] PostgreSQL ]
|
||||||
do! Custom.nonQuery (newIdx |> String.concat "; ") []
|
do! Custom.nonQuery (newIdx |> String.concat "; ") []
|
||||||
|
|
||||||
Utils.Migration.logStep log migration "Setting database to version 2.1.1"
|
Utils.Migration.logStep log migration "Setting database to version 2.1.1"
|
||||||
|
@ -3,6 +3,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
open System.Threading.Tasks
|
open System.Threading.Tasks
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
|
@ -229,6 +229,7 @@ let webLogParam (webLogId: WebLogId) =
|
|||||||
|
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open BitBadger.Documents.Sqlite.WithConn
|
open BitBadger.Documents.Sqlite.WithConn
|
||||||
|
|
||||||
/// Functions for manipulating documents
|
/// Functions for manipulating documents
|
||||||
@ -243,11 +244,11 @@ module Document =
|
|||||||
|
|
||||||
/// A SELECT query to count documents for a given web log ID
|
/// A SELECT query to count documents for a given web log ID
|
||||||
let countByWebLog table =
|
let countByWebLog table =
|
||||||
$"{Query.Count.all table} WHERE {whereByWebLog}"
|
Query.statementWhere (Query.count table) whereByWebLog
|
||||||
|
|
||||||
/// A query to select from a table by the document's ID and its web log ID
|
/// A query to select from a table by the document's ID and its web log ID
|
||||||
let selectByIdAndWebLog table =
|
let selectByIdAndWebLog table =
|
||||||
$"{Query.Find.byId table} AND {whereByWebLog}"
|
Query.statementWhere (Query.find table) $"""{Query.whereById "@id"} AND {whereByWebLog}"""
|
||||||
|
|
||||||
/// A query to select from a table by its web log ID
|
/// A query to select from a table by its web log ID
|
||||||
let selectByWebLog table =
|
let selectByWebLog table =
|
||||||
@ -255,7 +256,7 @@ module Document =
|
|||||||
|
|
||||||
/// Count documents for the given web log ID
|
/// Count documents for the given web log ID
|
||||||
let countByWebLog table (webLogId: WebLogId) conn = backgroundTask {
|
let countByWebLog table (webLogId: WebLogId) conn = backgroundTask {
|
||||||
let! count = Count.byField table (Field.EQ "WebLogId" (string webLogId)) conn
|
let! count = Count.byFields table Any [ Field.EQ "WebLogId" (string webLogId) ] conn
|
||||||
return int count
|
return int count
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +266,7 @@ module Document =
|
|||||||
|
|
||||||
/// Find documents for the given web log
|
/// Find documents for the given web log
|
||||||
let findByWebLog<'TDoc> table (webLogId: WebLogId) conn =
|
let findByWebLog<'TDoc> table (webLogId: WebLogId) conn =
|
||||||
Find.byField<'TDoc> table (Field.EQ "WebLogId" (string webLogId)) conn
|
Find.byFields<'TDoc> table Any [ Field.EQ "WebLogId" (string webLogId) ] conn
|
||||||
|
|
||||||
|
|
||||||
/// Functions to support revisions
|
/// Functions to support revisions
|
||||||
|
@ -3,6 +3,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
open System.Threading.Tasks
|
open System.Threading.Tasks
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
@ -93,7 +94,8 @@ type SQLitePageData(conn: SqliteConnection, log: ILogger) =
|
|||||||
match! findById pageId webLogId with
|
match! findById pageId webLogId with
|
||||||
| Some _ ->
|
| Some _ ->
|
||||||
do! conn.customNonQuery
|
do! conn.customNonQuery
|
||||||
$"DELETE FROM {Table.PageRevision} WHERE page_id = @id; {Query.Delete.byId Table.Page}"
|
$"DELETE FROM {Table.PageRevision} WHERE page_id = @id;
|
||||||
|
{Query.byId (Query.delete Table.Page) (string pageId)}"
|
||||||
[ idParam pageId ]
|
[ idParam pageId ]
|
||||||
return true
|
return true
|
||||||
| None -> return false
|
| None -> return false
|
||||||
|
@ -3,6 +3,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
open System.Threading.Tasks
|
open System.Threading.Tasks
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
@ -104,7 +105,7 @@ type SQLitePostData(conn: SqliteConnection, log: ILogger) =
|
|||||||
$"""DELETE FROM {Table.PostRevision} WHERE post_id = @id;
|
$"""DELETE FROM {Table.PostRevision} WHERE post_id = @id;
|
||||||
DELETE FROM {Table.PostComment}
|
DELETE FROM {Table.PostComment}
|
||||||
WHERE {Query.whereByField (Field.EQ (nameof Comment.Empty.PostId) "") "@id"};
|
WHERE {Query.whereByField (Field.EQ (nameof Comment.Empty.PostId) "") "@id"};
|
||||||
{Query.Delete.byId Table.Post}"""
|
{Query.byId (Query.delete Table.Post) (string postId)}"""
|
||||||
[ idParam postId ]
|
[ idParam postId ]
|
||||||
return true
|
return true
|
||||||
| None -> return false
|
| None -> return false
|
||||||
|
@ -2,6 +2,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
|
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
|
@ -25,10 +25,7 @@ type SQLiteThemeData(conn : SqliteConnection, log: ILogger) =
|
|||||||
/// Retrieve all themes (except 'admin'; excludes template text)
|
/// Retrieve all themes (except 'admin'; excludes template text)
|
||||||
let all () =
|
let all () =
|
||||||
log.LogTrace "Theme.all"
|
log.LogTrace "Theme.all"
|
||||||
conn.customList
|
conn.customList $"{Query.find Table.Theme} WHERE {idField} <> 'admin' ORDER BY {idField}" [] withoutTemplateText
|
||||||
$"{Query.selectFromTable Table.Theme} WHERE {idField} <> 'admin' ORDER BY {idField}"
|
|
||||||
[]
|
|
||||||
withoutTemplateText
|
|
||||||
|
|
||||||
/// Does a given theme exist?
|
/// Does a given theme exist?
|
||||||
let exists (themeId: ThemeId) =
|
let exists (themeId: ThemeId) =
|
||||||
@ -43,7 +40,7 @@ type SQLiteThemeData(conn : SqliteConnection, log: ILogger) =
|
|||||||
/// Find a theme by its ID (excludes the text of templates)
|
/// Find a theme by its ID (excludes the text of templates)
|
||||||
let findByIdWithoutText (themeId: ThemeId) =
|
let findByIdWithoutText (themeId: ThemeId) =
|
||||||
log.LogTrace "Theme.findByIdWithoutText"
|
log.LogTrace "Theme.findByIdWithoutText"
|
||||||
conn.customSingle (Query.Find.byId Table.Theme) [ idParam themeId ] withoutTemplateText
|
conn.customSingle (Query.byId (Query.find Table.Theme) (string themeId)) [ idParam themeId ] withoutTemplateText
|
||||||
|
|
||||||
/// Delete a theme by its ID
|
/// Delete a theme by its ID
|
||||||
let delete themeId = backgroundTask {
|
let delete themeId = backgroundTask {
|
||||||
@ -51,7 +48,8 @@ type SQLiteThemeData(conn : SqliteConnection, log: ILogger) =
|
|||||||
match! findByIdWithoutText themeId with
|
match! findByIdWithoutText themeId with
|
||||||
| Some _ ->
|
| Some _ ->
|
||||||
do! conn.customNonQuery
|
do! conn.customNonQuery
|
||||||
$"DELETE FROM {Table.ThemeAsset} WHERE theme_id = @id; {Query.Delete.byId Table.Theme}"
|
$"DELETE FROM {Table.ThemeAsset} WHERE theme_id = @id;
|
||||||
|
{Query.byId (Query.delete Table.Theme) (string themeId)}"
|
||||||
[ idParam themeId ]
|
[ idParam themeId ]
|
||||||
return true
|
return true
|
||||||
| None -> return false
|
| None -> return false
|
||||||
|
@ -2,6 +2,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
|
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
|
@ -2,6 +2,7 @@ namespace MyWebLog.Data.SQLite
|
|||||||
|
|
||||||
open BitBadger.Documents
|
open BitBadger.Documents
|
||||||
open BitBadger.Documents.Sqlite
|
open BitBadger.Documents.Sqlite
|
||||||
|
open BitBadger.Documents.Sqlite.Compat
|
||||||
open Microsoft.Data.Sqlite
|
open Microsoft.Data.Sqlite
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MyWebLog
|
open MyWebLog
|
||||||
|
@ -25,7 +25,7 @@ type SQLiteData(conn: SqliteConnection, log: ILogger<SQLiteData>, ser: JsonSeria
|
|||||||
not (List.contains table tables)
|
not (List.contains table tables)
|
||||||
|
|
||||||
let jsonTable table =
|
let jsonTable table =
|
||||||
$"{Query.Definition.ensureTable table}; {Query.Definition.ensureKey table}"
|
$"{Query.Definition.ensureTable table}; {Query.Definition.ensureKey table SQLite}"
|
||||||
|
|
||||||
let tasks =
|
let tasks =
|
||||||
seq {
|
seq {
|
||||||
@ -45,7 +45,8 @@ type SQLiteData(conn: SqliteConnection, log: ILogger<SQLiteData>, ser: JsonSeria
|
|||||||
// Category table
|
// Category table
|
||||||
if needsTable Table.Category then
|
if needsTable Table.Category then
|
||||||
$"""{jsonTable Table.Category};
|
$"""{jsonTable Table.Category};
|
||||||
{Query.Definition.ensureIndexOn Table.Category "web_log" [ nameof Category.Empty.WebLogId ]}"""
|
{Query.Definition.ensureIndexOn
|
||||||
|
Table.Category "web_log" [ nameof Category.Empty.WebLogId ] SQLite}"""
|
||||||
|
|
||||||
// Web log user table
|
// Web log user table
|
||||||
if needsTable Table.WebLogUser then
|
if needsTable Table.WebLogUser then
|
||||||
@ -53,14 +54,18 @@ type SQLiteData(conn: SqliteConnection, log: ILogger<SQLiteData>, ser: JsonSeria
|
|||||||
{Query.Definition.ensureIndexOn
|
{Query.Definition.ensureIndexOn
|
||||||
Table.WebLogUser
|
Table.WebLogUser
|
||||||
"email"
|
"email"
|
||||||
[ nameof WebLogUser.Empty.WebLogId; nameof WebLogUser.Empty.Email ]}"""
|
[ nameof WebLogUser.Empty.WebLogId; nameof WebLogUser.Empty.Email ]
|
||||||
|
SQLite}"""
|
||||||
|
|
||||||
// Page tables
|
// Page tables
|
||||||
if needsTable Table.Page then
|
if needsTable Table.Page then
|
||||||
$"""{jsonTable Table.Page};
|
$"""{jsonTable Table.Page};
|
||||||
{Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ]};
|
{Query.Definition.ensureIndexOn Table.Page "author" [ nameof Page.Empty.AuthorId ] SQLite};
|
||||||
{Query.Definition.ensureIndexOn
|
{Query.Definition.ensureIndexOn
|
||||||
Table.Page "permalink" [ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ]}"""
|
Table.Page
|
||||||
|
"permalink"
|
||||||
|
[ nameof Page.Empty.WebLogId; nameof Page.Empty.Permalink ]
|
||||||
|
SQLite}"""
|
||||||
if needsTable Table.PageRevision then
|
if needsTable Table.PageRevision then
|
||||||
$"CREATE TABLE {Table.PageRevision} (
|
$"CREATE TABLE {Table.PageRevision} (
|
||||||
page_id TEXT NOT NULL,
|
page_id TEXT NOT NULL,
|
||||||
@ -71,13 +76,14 @@ type SQLiteData(conn: SqliteConnection, log: ILogger<SQLiteData>, ser: JsonSeria
|
|||||||
// Post tables
|
// Post tables
|
||||||
if needsTable Table.Post then
|
if needsTable Table.Post then
|
||||||
$"""{jsonTable Table.Post};
|
$"""{jsonTable Table.Post};
|
||||||
{Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ]};
|
{Query.Definition.ensureIndexOn Table.Post "author" [ nameof Post.Empty.AuthorId ] SQLite};
|
||||||
{Query.Definition.ensureIndexOn
|
{Query.Definition.ensureIndexOn
|
||||||
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ]};
|
Table.Post "permalink" [ nameof Post.Empty.WebLogId; nameof Post.Empty.Permalink ] SQLite};
|
||||||
{Query.Definition.ensureIndexOn
|
{Query.Definition.ensureIndexOn
|
||||||
Table.Post
|
Table.Post
|
||||||
"status"
|
"status"
|
||||||
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]}"""
|
[ nameof Post.Empty.WebLogId; nameof Post.Empty.Status; nameof Post.Empty.UpdatedOn ]
|
||||||
|
SQLite}"""
|
||||||
// TODO: index categories by post?
|
// TODO: index categories by post?
|
||||||
if needsTable Table.PostRevision then
|
if needsTable Table.PostRevision then
|
||||||
$"CREATE TABLE {Table.PostRevision} (
|
$"CREATE TABLE {Table.PostRevision} (
|
||||||
@ -87,13 +93,17 @@ type SQLiteData(conn: SqliteConnection, log: ILogger<SQLiteData>, ser: JsonSeria
|
|||||||
PRIMARY KEY (post_id, as_of))"
|
PRIMARY KEY (post_id, as_of))"
|
||||||
if needsTable Table.PostComment then
|
if needsTable Table.PostComment then
|
||||||
$"""{jsonTable Table.PostComment};
|
$"""{jsonTable Table.PostComment};
|
||||||
{Query.Definition.ensureIndexOn Table.PostComment "post" [ nameof Comment.Empty.PostId ]}"""
|
{Query.Definition.ensureIndexOn
|
||||||
|
Table.PostComment "post" [ nameof Comment.Empty.PostId ] SQLite}"""
|
||||||
|
|
||||||
// Tag map table
|
// Tag map table
|
||||||
if needsTable Table.TagMap then
|
if needsTable Table.TagMap then
|
||||||
$"""{jsonTable Table.TagMap};
|
$"""{jsonTable Table.TagMap};
|
||||||
{Query.Definition.ensureIndexOn
|
{Query.Definition.ensureIndexOn
|
||||||
Table.TagMap "url" [ nameof TagMap.Empty.WebLogId; nameof TagMap.Empty.UrlValue ]}"""
|
Table.TagMap
|
||||||
|
"url"
|
||||||
|
[ nameof TagMap.Empty.WebLogId; nameof TagMap.Empty.UrlValue ]
|
||||||
|
SQLite}"""
|
||||||
|
|
||||||
// Uploaded file table
|
// Uploaded file table
|
||||||
if needsTable Table.Upload then
|
if needsTable Table.Upload then
|
||||||
|
Loading…
Reference in New Issue
Block a user