diff --git a/compiled_starters/scala/.codecrafters/compile.sh b/compiled_starters/scala/.codecrafters/compile.sh new file mode 100755 index 0000000..11cad90 --- /dev/null +++ b/compiled_starters/scala/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +sbt assembly diff --git a/compiled_starters/scala/.codecrafters/run.sh b/compiled_starters/scala/.codecrafters/run.sh new file mode 100755 index 0000000..c0eb78a --- /dev/null +++ b/compiled_starters/scala/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar ./target/scala-3.3.5/sqlite.jar "$@" diff --git a/compiled_starters/scala/.gitattributes b/compiled_starters/scala/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/compiled_starters/scala/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/compiled_starters/scala/.gitignore b/compiled_starters/scala/.gitignore new file mode 100644 index 0000000..1adb3ca --- /dev/null +++ b/compiled_starters/scala/.gitignore @@ -0,0 +1,10 @@ +# Database files used for testing +*.db + +**/target +/.bloop/ +/.bsp/ +/.metals/ +/project/.bloop/ +metals.sbt +metals/project/ \ No newline at end of file diff --git a/compiled_starters/scala/README.md b/compiled_starters/scala/README.md new file mode 100644 index 0000000..cf4c638 --- /dev/null +++ b/compiled_starters/scala/README.md @@ -0,0 +1,77 @@ +![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/sqlite.png) + +This is a starting point for Scala solutions to the +["Build Your Own SQLite" Challenge](https://codecrafters.io/challenges/sqlite). + +In this challenge, you'll build a barebones SQLite implementation that supports +basic SQL queries like `SELECT`. Along the way we'll learn about +[SQLite's file format](https://www.sqlite.org/fileformat.html), how indexed data +is +[stored in B-trees](https://jvns.ca/blog/2014/10/02/how-does-sqlite-work-part-2-btrees/) +and more. + +**Note**: If you're viewing this repo on GitHub, head over to +[codecrafters.io](https://codecrafters.io) to try the challenge. + +# Passing the first stage + +The entry point for your SQLite implementation is in +`src/main/scala/Main.scala`. Study and uncomment the relevant code, and push +your changes to pass the first stage: + +```sh +git commit -am "pass 1st stage" # any msg +git push origin master +``` + +Time to move on to the next stage! + +# Stage 2 & beyond + +Note: This section is for stages 2 and beyond. + +1. Ensure you have `sbt (1.10.7)` installed locally +1. Run `./your_program.sh` to run your program, which is implemented in + `src/main/scala/Main.scala`. +1. Commit your changes and run `git push origin master` to submit your solution + to CodeCrafters. Test output will be streamed to your terminal. + +# Sample Databases + +To make it easy to test queries locally, we've added a sample database in the +root of this repository: `sample.db`. + +This contains two tables: `apples` & `oranges`. You can use this to test your +implementation for the first 6 stages. + +You can explore this database by running queries against it like this: + +```sh +$ sqlite3 sample.db "select id, name from apples" +1|Granny Smith +2|Fuji +3|Honeycrisp +4|Golden Delicious +``` + +There are two other databases that you can use: + +1. `superheroes.db`: + - This is a small version of the test database used in the table-scan stage. + - It contains one table: `superheroes`. + - It is ~1MB in size. +1. `companies.db`: + - This is a small version of the test database used in the index-scan stage. + - It contains one table: `companies`, and one index: `idx_companies_country` + - It is ~7MB in size. + +These aren't included in the repository because they're large in size. You can +download them by running this script: + +```sh +./download_sample_databases.sh +``` + +If the script doesn't work for some reason, you can download the databases +directly from +[codecrafters-io/sample-sqlite-databases](https://github.com/codecrafters-io/sample-sqlite-databases). diff --git a/compiled_starters/scala/build.sbt b/compiled_starters/scala/build.sbt new file mode 100644 index 0000000..aad064d --- /dev/null +++ b/compiled_starters/scala/build.sbt @@ -0,0 +1,14 @@ +ThisBuild / scalaVersion := "3.3.5" +ThisBuild / version := "0.1.0-SNAPSHOT" +ThisBuild / organization := "com.CodeCrafters" +ThisBuild / organizationName := "CodeCrafters" + +assembly / assemblyJarName := "sqlite" + +lazy val root = (project in file(".")) + .settings( + name := "codecrafter-sqlite", + // List your dependencies here + libraryDependencies ++= Seq( + ), + ) \ No newline at end of file diff --git a/compiled_starters/scala/codecrafters.yml b/compiled_starters/scala/codecrafters.yml new file mode 100644 index 0000000..28f6b84 --- /dev/null +++ b/compiled_starters/scala/codecrafters.yml @@ -0,0 +1,11 @@ +# Set this to true if you want debug logs. +# +# These can be VERY verbose, so we suggest turning them off +# unless you really need them. +debug: false + +# Use this to change the Scala version used to run your code +# on Codecrafters. +# +# Available versions: scala-3.3.5 +language_pack: scala-3.3.5 diff --git a/compiled_starters/scala/download_sample_databases.sh b/compiled_starters/scala/download_sample_databases.sh new file mode 100755 index 0000000..03e0573 --- /dev/null +++ b/compiled_starters/scala/download_sample_databases.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +echo "Downloading superheroes.db: ~1MB (used in stage 7)" +curl -Lo superheroes.db https://raw.githubusercontent.com/codecrafters-io/sample-sqlite-databases/master/superheroes.db + +echo "Downloading companies.db: ~7MB (used in stage 8)" +curl -Lo companies.db https://raw.githubusercontent.com/codecrafters-io/sample-sqlite-databases/master/companies.db + +echo "Sample databases downloaded." diff --git a/compiled_starters/scala/project/build.properties b/compiled_starters/scala/project/build.properties new file mode 100644 index 0000000..73df629 --- /dev/null +++ b/compiled_starters/scala/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.10.7 diff --git a/compiled_starters/scala/project/plugins.sbt b/compiled_starters/scala/project/plugins.sbt new file mode 100644 index 0000000..d8de595 --- /dev/null +++ b/compiled_starters/scala/project/plugins.sbt @@ -0,0 +1,3 @@ + + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") \ No newline at end of file diff --git a/compiled_starters/scala/sample.db b/compiled_starters/scala/sample.db new file mode 100644 index 0000000..687673e Binary files /dev/null and b/compiled_starters/scala/sample.db differ diff --git a/compiled_starters/scala/src/main/scala/Main.scala b/compiled_starters/scala/src/main/scala/Main.scala new file mode 100644 index 0000000..161e44e --- /dev/null +++ b/compiled_starters/scala/src/main/scala/Main.scala @@ -0,0 +1,37 @@ +import java.io.File +import java.io.FileInputStream +import java.io.IOException +import java.nio.ByteBuffer +import scala.util.Using + +object Main extends App { + if args.length < 2 + then { + println("Missing and ") + System.exit(0); + } + val databaseFilePath = args(0); + val command = args(1); + command match { + case ".dbinfo" => { + Using(new FileInputStream(new File(databaseFilePath))) { databaseFile => + databaseFile.skip(16) + val pageSizeBytes = new Array[Byte](2) + databaseFile.read(pageSizeBytes) + val pageSizeSigned = ByteBuffer.wrap(pageSizeBytes).getShort() + val pageSize = pageSizeSigned & 0xFFFF + + // You can use print statements as follows for debugging, they'll be visible when running tests. + System.err.println("Logs from your program will appear here!") + + // Uncomment this block to pass the first stage + // println("database page size: " + pageSize) + }.recover { + case e: IOException => + println(s"Error reading database file: ${e.getMessage}") + System.exit(1) + } + } + case _ => println("Missing or invalid command passed: " + command) + } +} diff --git a/compiled_starters/scala/your_program.sh b/compiled_starters/scala/your_program.sh new file mode 100755 index 0000000..ad509ce --- /dev/null +++ b/compiled_starters/scala/your_program.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Use this script to run your program LOCALLY. +# +# Note: Changing this script WILL NOT affect how CodeCrafters runs your program. +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit early if any commands fail + +# Copied from .codecrafters/compile.sh +# +# - Edit this to change how your program compiles locally +# - Edit .codecrafters/compile.sh to change how your program compiles remotely +( + cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory + sbt assembly +) + +# Copied from .codecrafters/run.sh +# +# - Edit this to change how your program runs locally +# - Edit .codecrafters/run.sh to change how your program runs remotely +exec java -jar ./target/scala-3.3.5/sqlite.jar "$@" diff --git a/dockerfiles/scala-3.3.5.Dockerfile b/dockerfiles/scala-3.3.5.Dockerfile new file mode 100644 index 0000000..2df9e9b --- /dev/null +++ b/dockerfiles/scala-3.3.5.Dockerfile @@ -0,0 +1,19 @@ +# syntax=docker/dockerfile:1.7-labs +FROM maven:3.9.9-eclipse-temurin-23-alpine + +RUN apk add --no-cache bash wget tar && \ + wget -O sbt.tgz https://github.com/sbt/sbt/releases/download/v1.10.11/sbt-1.10.11.tgz && \ + tar -xzf sbt.tgz -C /usr/local && \ + ln -s /usr/local/sbt/bin/sbt /usr/local/bin/sbt && \ + rm sbt.tgz + +# Ensures the container is re-built if dependency files change +ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="build.sbt" + +WORKDIR /app + +# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses +COPY --exclude=.git --exclude=README.md . /app + +# Install language-specific dependencies +RUN .codecrafters/compile.sh diff --git a/solutions/scala/01-dr6/code/.codecrafters/compile.sh b/solutions/scala/01-dr6/code/.codecrafters/compile.sh new file mode 100755 index 0000000..11cad90 --- /dev/null +++ b/solutions/scala/01-dr6/code/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +sbt assembly diff --git a/solutions/scala/01-dr6/code/.codecrafters/run.sh b/solutions/scala/01-dr6/code/.codecrafters/run.sh new file mode 100755 index 0000000..c0eb78a --- /dev/null +++ b/solutions/scala/01-dr6/code/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar ./target/scala-3.3.5/sqlite.jar "$@" diff --git a/solutions/scala/01-dr6/code/.gitattributes b/solutions/scala/01-dr6/code/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/solutions/scala/01-dr6/code/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/solutions/scala/01-dr6/code/.gitignore b/solutions/scala/01-dr6/code/.gitignore new file mode 100644 index 0000000..1adb3ca --- /dev/null +++ b/solutions/scala/01-dr6/code/.gitignore @@ -0,0 +1,10 @@ +# Database files used for testing +*.db + +**/target +/.bloop/ +/.bsp/ +/.metals/ +/project/.bloop/ +metals.sbt +metals/project/ \ No newline at end of file diff --git a/solutions/scala/01-dr6/code/README.md b/solutions/scala/01-dr6/code/README.md new file mode 100644 index 0000000..cf4c638 --- /dev/null +++ b/solutions/scala/01-dr6/code/README.md @@ -0,0 +1,77 @@ +![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/sqlite.png) + +This is a starting point for Scala solutions to the +["Build Your Own SQLite" Challenge](https://codecrafters.io/challenges/sqlite). + +In this challenge, you'll build a barebones SQLite implementation that supports +basic SQL queries like `SELECT`. Along the way we'll learn about +[SQLite's file format](https://www.sqlite.org/fileformat.html), how indexed data +is +[stored in B-trees](https://jvns.ca/blog/2014/10/02/how-does-sqlite-work-part-2-btrees/) +and more. + +**Note**: If you're viewing this repo on GitHub, head over to +[codecrafters.io](https://codecrafters.io) to try the challenge. + +# Passing the first stage + +The entry point for your SQLite implementation is in +`src/main/scala/Main.scala`. Study and uncomment the relevant code, and push +your changes to pass the first stage: + +```sh +git commit -am "pass 1st stage" # any msg +git push origin master +``` + +Time to move on to the next stage! + +# Stage 2 & beyond + +Note: This section is for stages 2 and beyond. + +1. Ensure you have `sbt (1.10.7)` installed locally +1. Run `./your_program.sh` to run your program, which is implemented in + `src/main/scala/Main.scala`. +1. Commit your changes and run `git push origin master` to submit your solution + to CodeCrafters. Test output will be streamed to your terminal. + +# Sample Databases + +To make it easy to test queries locally, we've added a sample database in the +root of this repository: `sample.db`. + +This contains two tables: `apples` & `oranges`. You can use this to test your +implementation for the first 6 stages. + +You can explore this database by running queries against it like this: + +```sh +$ sqlite3 sample.db "select id, name from apples" +1|Granny Smith +2|Fuji +3|Honeycrisp +4|Golden Delicious +``` + +There are two other databases that you can use: + +1. `superheroes.db`: + - This is a small version of the test database used in the table-scan stage. + - It contains one table: `superheroes`. + - It is ~1MB in size. +1. `companies.db`: + - This is a small version of the test database used in the index-scan stage. + - It contains one table: `companies`, and one index: `idx_companies_country` + - It is ~7MB in size. + +These aren't included in the repository because they're large in size. You can +download them by running this script: + +```sh +./download_sample_databases.sh +``` + +If the script doesn't work for some reason, you can download the databases +directly from +[codecrafters-io/sample-sqlite-databases](https://github.com/codecrafters-io/sample-sqlite-databases). diff --git a/solutions/scala/01-dr6/code/build.sbt b/solutions/scala/01-dr6/code/build.sbt new file mode 100644 index 0000000..aad064d --- /dev/null +++ b/solutions/scala/01-dr6/code/build.sbt @@ -0,0 +1,14 @@ +ThisBuild / scalaVersion := "3.3.5" +ThisBuild / version := "0.1.0-SNAPSHOT" +ThisBuild / organization := "com.CodeCrafters" +ThisBuild / organizationName := "CodeCrafters" + +assembly / assemblyJarName := "sqlite" + +lazy val root = (project in file(".")) + .settings( + name := "codecrafter-sqlite", + // List your dependencies here + libraryDependencies ++= Seq( + ), + ) \ No newline at end of file diff --git a/solutions/scala/01-dr6/code/codecrafters.yml b/solutions/scala/01-dr6/code/codecrafters.yml new file mode 100644 index 0000000..28f6b84 --- /dev/null +++ b/solutions/scala/01-dr6/code/codecrafters.yml @@ -0,0 +1,11 @@ +# Set this to true if you want debug logs. +# +# These can be VERY verbose, so we suggest turning them off +# unless you really need them. +debug: false + +# Use this to change the Scala version used to run your code +# on Codecrafters. +# +# Available versions: scala-3.3.5 +language_pack: scala-3.3.5 diff --git a/solutions/scala/01-dr6/code/download_sample_databases.sh b/solutions/scala/01-dr6/code/download_sample_databases.sh new file mode 100755 index 0000000..03e0573 --- /dev/null +++ b/solutions/scala/01-dr6/code/download_sample_databases.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +echo "Downloading superheroes.db: ~1MB (used in stage 7)" +curl -Lo superheroes.db https://raw.githubusercontent.com/codecrafters-io/sample-sqlite-databases/master/superheroes.db + +echo "Downloading companies.db: ~7MB (used in stage 8)" +curl -Lo companies.db https://raw.githubusercontent.com/codecrafters-io/sample-sqlite-databases/master/companies.db + +echo "Sample databases downloaded." diff --git a/solutions/scala/01-dr6/code/project/build.properties b/solutions/scala/01-dr6/code/project/build.properties new file mode 100644 index 0000000..73df629 --- /dev/null +++ b/solutions/scala/01-dr6/code/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.10.7 diff --git a/solutions/scala/01-dr6/code/project/plugins.sbt b/solutions/scala/01-dr6/code/project/plugins.sbt new file mode 100644 index 0000000..d8de595 --- /dev/null +++ b/solutions/scala/01-dr6/code/project/plugins.sbt @@ -0,0 +1,3 @@ + + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") \ No newline at end of file diff --git a/solutions/scala/01-dr6/code/sample.db b/solutions/scala/01-dr6/code/sample.db new file mode 100644 index 0000000..687673e Binary files /dev/null and b/solutions/scala/01-dr6/code/sample.db differ diff --git a/solutions/scala/01-dr6/code/src/main/scala/Main.scala b/solutions/scala/01-dr6/code/src/main/scala/Main.scala new file mode 100644 index 0000000..263a80d --- /dev/null +++ b/solutions/scala/01-dr6/code/src/main/scala/Main.scala @@ -0,0 +1,33 @@ +import java.io.File +import java.io.FileInputStream +import java.io.IOException +import java.nio.ByteBuffer +import scala.util.Using + +object Main extends App { + if args.length < 2 + then { + println("Missing and ") + System.exit(0); + } + val databaseFilePath = args(0); + val command = args(1); + command match { + case ".dbinfo" => { + Using(new FileInputStream(new File(databaseFilePath))) { databaseFile => + databaseFile.skip(16) + val pageSizeBytes = new Array[Byte](2) + databaseFile.read(pageSizeBytes) + val pageSizeSigned = ByteBuffer.wrap(pageSizeBytes).getShort() + val pageSize = pageSizeSigned & 0xFFFF + + println("database page size: " + pageSize) + }.recover { + case e: IOException => + println(s"Error reading database file: ${e.getMessage}") + System.exit(1) + } + } + case _ => println("Missing or invalid command passed: " + command) + } +} diff --git a/solutions/scala/01-dr6/code/your_program.sh b/solutions/scala/01-dr6/code/your_program.sh new file mode 100755 index 0000000..ad509ce --- /dev/null +++ b/solutions/scala/01-dr6/code/your_program.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Use this script to run your program LOCALLY. +# +# Note: Changing this script WILL NOT affect how CodeCrafters runs your program. +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit early if any commands fail + +# Copied from .codecrafters/compile.sh +# +# - Edit this to change how your program compiles locally +# - Edit .codecrafters/compile.sh to change how your program compiles remotely +( + cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory + sbt assembly +) + +# Copied from .codecrafters/run.sh +# +# - Edit this to change how your program runs locally +# - Edit .codecrafters/run.sh to change how your program runs remotely +exec java -jar ./target/scala-3.3.5/sqlite.jar "$@" diff --git a/solutions/scala/01-dr6/diff/src/main/scala/Main.scala.diff b/solutions/scala/01-dr6/diff/src/main/scala/Main.scala.diff new file mode 100644 index 0000000..5d3e88a --- /dev/null +++ b/solutions/scala/01-dr6/diff/src/main/scala/Main.scala.diff @@ -0,0 +1,39 @@ +@@ -1,37 +1,33 @@ + import java.io.File + import java.io.FileInputStream + import java.io.IOException + import java.nio.ByteBuffer + import scala.util.Using + + object Main extends App { + if args.length < 2 + then { + println("Missing and ") + System.exit(0); + } + val databaseFilePath = args(0); + val command = args(1); + command match { + case ".dbinfo" => { + Using(new FileInputStream(new File(databaseFilePath))) { databaseFile => + databaseFile.skip(16) + val pageSizeBytes = new Array[Byte](2) + databaseFile.read(pageSizeBytes) + val pageSizeSigned = ByteBuffer.wrap(pageSizeBytes).getShort() + val pageSize = pageSizeSigned & 0xFFFF + +- // You can use print statements as follows for debugging, they'll be visible when running tests. +- System.err.println("Logs from your program will appear here!") +- +- // Uncomment this block to pass the first stage +- // println("database page size: " + pageSize) ++ println("database page size: " + pageSize) + }.recover { + case e: IOException => + println(s"Error reading database file: ${e.getMessage}") + System.exit(1) + } + } + case _ => println("Missing or invalid command passed: " + command) + } + } diff --git a/solutions/scala/01-dr6/explanation.md b/solutions/scala/01-dr6/explanation.md new file mode 100644 index 0000000..1d87a1d --- /dev/null +++ b/solutions/scala/01-dr6/explanation.md @@ -0,0 +1,16 @@ +The entry point for your SQLite implementation is in `src/main/scala/Main.scala`. + +Study and uncomment the relevant code: + +```scala +// Uncomment this block to pass the first stage +println("database page size: " + pageSize) +``` + +Push your changes to pass the first stage: + +``` +git add . +git commit -m "pass 1st stage" # any msg +git push origin master +``` diff --git a/starter_templates/scala/code/.codecrafters/compile.sh b/starter_templates/scala/code/.codecrafters/compile.sh new file mode 100755 index 0000000..11cad90 --- /dev/null +++ b/starter_templates/scala/code/.codecrafters/compile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to compile your program on CodeCrafters +# +# This runs before .codecrafters/run.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +sbt assembly diff --git a/starter_templates/scala/code/.codecrafters/run.sh b/starter_templates/scala/code/.codecrafters/run.sh new file mode 100755 index 0000000..c0eb78a --- /dev/null +++ b/starter_templates/scala/code/.codecrafters/run.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# +# This script is used to run your program on CodeCrafters +# +# This runs after .codecrafters/compile.sh +# +# Learn more: https://codecrafters.io/program-interface + +set -e # Exit on failure + +exec java -jar ./target/scala-3.3.5/sqlite.jar "$@" diff --git a/starter_templates/scala/code/.gitignore b/starter_templates/scala/code/.gitignore new file mode 100644 index 0000000..5b4f849 --- /dev/null +++ b/starter_templates/scala/code/.gitignore @@ -0,0 +1,7 @@ +**/target +/.bloop/ +/.bsp/ +/.metals/ +/project/.bloop/ +metals.sbt +metals/project/ \ No newline at end of file diff --git a/starter_templates/scala/code/build.sbt b/starter_templates/scala/code/build.sbt new file mode 100644 index 0000000..aad064d --- /dev/null +++ b/starter_templates/scala/code/build.sbt @@ -0,0 +1,14 @@ +ThisBuild / scalaVersion := "3.3.5" +ThisBuild / version := "0.1.0-SNAPSHOT" +ThisBuild / organization := "com.CodeCrafters" +ThisBuild / organizationName := "CodeCrafters" + +assembly / assemblyJarName := "sqlite" + +lazy val root = (project in file(".")) + .settings( + name := "codecrafter-sqlite", + // List your dependencies here + libraryDependencies ++= Seq( + ), + ) \ No newline at end of file diff --git a/starter_templates/scala/code/project/build.properties b/starter_templates/scala/code/project/build.properties new file mode 100644 index 0000000..73df629 --- /dev/null +++ b/starter_templates/scala/code/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.10.7 diff --git a/starter_templates/scala/code/project/plugins.sbt b/starter_templates/scala/code/project/plugins.sbt new file mode 100644 index 0000000..d8de595 --- /dev/null +++ b/starter_templates/scala/code/project/plugins.sbt @@ -0,0 +1,3 @@ + + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.1") \ No newline at end of file diff --git a/starter_templates/scala/code/src/main/scala/Main.scala b/starter_templates/scala/code/src/main/scala/Main.scala new file mode 100644 index 0000000..161e44e --- /dev/null +++ b/starter_templates/scala/code/src/main/scala/Main.scala @@ -0,0 +1,37 @@ +import java.io.File +import java.io.FileInputStream +import java.io.IOException +import java.nio.ByteBuffer +import scala.util.Using + +object Main extends App { + if args.length < 2 + then { + println("Missing and ") + System.exit(0); + } + val databaseFilePath = args(0); + val command = args(1); + command match { + case ".dbinfo" => { + Using(new FileInputStream(new File(databaseFilePath))) { databaseFile => + databaseFile.skip(16) + val pageSizeBytes = new Array[Byte](2) + databaseFile.read(pageSizeBytes) + val pageSizeSigned = ByteBuffer.wrap(pageSizeBytes).getShort() + val pageSize = pageSizeSigned & 0xFFFF + + // You can use print statements as follows for debugging, they'll be visible when running tests. + System.err.println("Logs from your program will appear here!") + + // Uncomment this block to pass the first stage + // println("database page size: " + pageSize) + }.recover { + case e: IOException => + println(s"Error reading database file: ${e.getMessage}") + System.exit(1) + } + } + case _ => println("Missing or invalid command passed: " + command) + } +} diff --git a/starter_templates/scala/config.yml b/starter_templates/scala/config.yml new file mode 100644 index 0000000..41a21c5 --- /dev/null +++ b/starter_templates/scala/config.yml @@ -0,0 +1,3 @@ +attributes: + required_executable: sbt (1.10.7) + user_editable_file: src/main/scala/Main.scala \ No newline at end of file