diff --git a/packages/db/lib/db.dart b/packages/db/lib/db.dart index c4d4a898..3558ad2b 100644 --- a/packages/db/lib/db.dart +++ b/packages/db/lib/db.dart @@ -7,6 +7,7 @@ import 'package:db/faction.dart'; import 'package:db/market_listing.dart'; import 'package:db/query.dart'; import 'package:db/queue.dart'; +import 'package:db/shipyard_listing.dart'; import 'package:db/survey.dart'; import 'package:db/transaction.dart'; import 'package:meta/meta.dart'; @@ -284,4 +285,25 @@ class Database { final query = upsertMarketListingQuery(listing); await insertOne(query); } + + /// Get the shipyard listing for the given symbol. + Future shipyardListingForSymbol( + WaypointSymbol waypointSymbol, + ) async { + final query = shipyardListingByWaypointSymbolQuery(waypointSymbol); + return queryOne(query, shipyardListingFromColumnMap); + } + + /// Get all shipyard listings. + Future> allShipyardListings() async { + final query = allShipyardListingsQuery(); + return queryMany(query, shipyardListingFromColumnMap) + .then((list) => list.toList()); + } + + /// Update the given shipyard listing in the database. + Future upsertShipyardListing(ShipyardListing listing) async { + final query = upsertShipyardListingQuery(listing); + await insertOne(query); + } } diff --git a/packages/db/lib/market_listing.dart b/packages/db/lib/market_listing.dart index a5e9d04c..ca230779 100644 --- a/packages/db/lib/market_listing.dart +++ b/packages/db/lib/market_listing.dart @@ -7,6 +7,22 @@ Query marketListingByWaypointSymbolQuery(WaypointSymbol symbol) => Query( parameters: {'symbol': symbol.waypoint}, ); +/// Query all market listings. +Query allMarketListingsQuery() => const Query('SELECT * FROM market_listing'); + +/// Query to upsert a market listing. +Query upsertMarketListingQuery(MarketListing listing) => Query( + ''' + INSERT INTO market_listing (symbol, exports, imports, exchange) + VALUES (@symbol, @exports, @imports, @exchange) + ON CONFLICT (symbol) DO UPDATE SET + exports = @exports, + imports = @imports, + exchange = @exchange + ''', + parameters: marketListingToColumnMap(listing), + ); + /// Build a column map from a market listing. Map marketListingToColumnMap(MarketListing marketListing) => { 'symbol': marketListing.waypointSymbol.toString(), @@ -33,19 +49,3 @@ MarketListing marketListingFromColumnMap(Map values) { .toSet(), ); } - -/// Query all market listings. -Query allMarketListingsQuery() => const Query('SELECT * FROM market_listing'); - -/// Query to upsert a market listing. -Query upsertMarketListingQuery(MarketListing listing) => Query( - ''' - INSERT INTO market_listing (symbol, exports, imports, exchange) - VALUES (@symbol, @exports, @imports, @exchange) - ON CONFLICT (symbol) DO UPDATE SET - exports = @exports, - imports = @imports, - exchange = @exchange - ''', - parameters: marketListingToColumnMap(listing), - ); diff --git a/packages/db/lib/shipyard_listing.dart b/packages/db/lib/shipyard_listing.dart new file mode 100644 index 00000000..785ee895 --- /dev/null +++ b/packages/db/lib/shipyard_listing.dart @@ -0,0 +1,43 @@ +import 'package:db/query.dart'; +import 'package:types/types.dart'; + +/// Lookup a shipyard listing by WaypointSymbol. +Query shipyardListingByWaypointSymbolQuery(WaypointSymbol symbol) => Query( + 'SELECT * FROM shipyard_listing WHERE symbol = @symbol', + parameters: {'symbol': symbol.waypoint}, + ); + +/// Query all shipyard listings. +Query allShipyardListingsQuery() => + const Query('SELECT * FROM shipyard_listing'); + +/// Query to upsert a shipyard listing. +Query upsertShipyardListingQuery(ShipyardListing listing) => Query( + ''' + INSERT INTO shipyard_listing (symbol, ships) + VALUES (@symbol, @types) + ON CONFLICT (symbol) DO UPDATE SET + types = @types + ''', + parameters: shipyardListingToColumnMap(listing), + ); + +/// Build a column map from a shipyard listing. +Map shipyardListingToColumnMap( + ShipyardListing shipyardListing, +) => + { + 'symbol': shipyardListing.waypointSymbol.toJson(), + 'types': shipyardListing.shipTypes.map((e) => e.toString()).toList(), + }; + +/// Build a shipyard listing from a column map. +ShipyardListing shipyardListingFromColumnMap(Map values) { + return ShipyardListing( + waypointSymbol: WaypointSymbol.fromString(values['symbol'] as String), + shipTypes: (values['ships'] as List) + .cast() + .map((e) => ShipType.fromJson(e)!) + .toSet(), + ); +} diff --git a/packages/db/sql/flows/drop_tables.sql b/packages/db/sql/flows/drop_tables.sql index d3b6802f..1d6788a9 100644 --- a/packages/db/sql/flows/drop_tables.sql +++ b/packages/db/sql/flows/drop_tables.sql @@ -8,4 +8,5 @@ DROP TABLE IF EXISTS "extraction_" CASCADE; DROP TABLE IF EXISTS "construction_" CASCADE; DROP TABLE IF EXISTS "charting_" CASCADE; DROP TABLE IF EXISTS "agent_" CASCADE; -DROP TABLE IF EXISTS "market_listing_" CASCADE; \ No newline at end of file +DROP TABLE IF EXISTS "market_listing_" CASCADE; +DROP TABLE IF EXISTS "shipyard_listing_" CASCADE; \ No newline at end of file diff --git a/packages/db/sql/tables/12_shipyard_listing.sql b/packages/db/sql/tables/12_shipyard_listing.sql new file mode 100644 index 00000000..dd3cae4c --- /dev/null +++ b/packages/db/sql/tables/12_shipyard_listing.sql @@ -0,0 +1,7 @@ +-- Describes an shipyard. +CREATE TABLE IF NOT EXISTS "shipyard_listing_" ( + -- The symbol of the shipyard. + "symbol" text NOT NULL PRIMARY KEY, + -- Types of ships available at the shipyard. + "types" text [] NOT NULL, +); \ No newline at end of file