Scala
Instalacao
Seção intitulada “Instalacao”Adicione ao seu build.sbt:
libraryDependencies += "io.github.edadma" %%% "petradb-engine" % "1.5.0"Estrutura de Pacotes
Seção intitulada “Estrutura de Pacotes”O PetraDB e dividido em dois pacotes:
io.github.edadma.petradb— tipos compartilhados (Result,Value,Row,TableValue, traitSession)io.github.edadma.petradb.engine— o engine do banco de dados (MemoryDB,PersistentDB,TextDB,Session,executeSQL)
Importe ambos para usar o engine diretamente:
import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*Banco de Dados em Memoria
Seção intitulada “Banco de Dados em Memoria”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
given Session = new MemoryDB().connect()Banco de Dados Persistente
Seção intitulada “Banco de Dados Persistente”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
// Criar novoval db = PersistentDB.create("path/to/db", pageSize = 4096)given Session = db.connect()
// Reabrir existenteval db = PersistentDB.open("path/to/db")given Session = db.connect()
// Fechar quando terminardb.close()Banco de Dados de Texto
Seção intitulada “Banco de Dados de Texto”import io.github.edadma.petradb.*import io.github.edadma.petradb.engine.*
val db = TextDB.open("path/to/data.ptxt")given Session = db.connect()
db.close()Arquivo .ptxt legivel por humanos. Carrega na memoria ao abrir, reescreve apos cada alteracao. Funciona em JVM e Native.
Executando SQL
Seção intitulada “Executando SQL”executeSQL(sql: String)(using Session): Seq[Result]
Seção intitulada “executeSQL(sql: String)(using Session): Seq[Result]”Executa um ou mais comandos SQL separados por ponto e virgula e retorna uma sequencia de resultados.
val results: Seq[Result] = executeSQL("SELECT * FROM users")Tipos de Resultado
Seção intitulada “Tipos de Resultado”sealed trait Resultcase class QueryResult(table: TableValue) extends Resultcase class InsertResult(obj: Map[String, Value], table: TableValue) extends Resultcase class CreateTableResult(table: String) extends Resultcase class DropTableResult(table: String) extends Resultcase class CreateIndexResult(name: String) extends Resultcase class DropIndexResult(name: String) extends Resultcase class CreateTypeResult(typ: String) extends Resultcase class DropTypeResult(name: String) extends Resultcase class CreateViewResult(name: String) extends Resultcase class DropViewResult(name: String) extends Resultcase class CreateSequenceResult(name: String) extends Resultcase class DropSequenceResult(name: String) extends Resultcase class UpdateResult(rows: Int) extends Resultcase class DeleteResult(rows: Int) extends Resultcase class TruncateResult(table: String) extends Resultcase class AlterTableResult() extends Resultcase class ExplainResult(plan: String) extends Resultcase class PrepareResult(name: String) extends Resultcase class DeallocateResult(name: String) extends Resultcase class CopyResult(rows: Int) extends Resultcase class CreateSchemaResult(name: String) extends Resultcase object BeginResult extends Resultcase object CommitResult extends Resultcase object RollbackResult extends Resultcase object DoBlockResult extends Resultcase class CreateFunctionResult(name: String) extends Resultcase class DropFunctionResult(name: String) extends Resultcase class CreateProcedureResult(name: String) extends Resultcase class DropProcedureResult(name: String) extends Resultcase class CreateTriggerResult(name: String) extends Resultcase class DropTriggerResult(name: String) extends Resultcase object CallResult extends ResultAcessando Dados de Consulta
Seção intitulada “Acessando Dados de Consulta”val QueryResult(table) = executeQuery("SELECT * FROM users")
// Acessar linhasval rows: IndexedSeq[Row] = table.data
for (row <- table.data) { val id: Int = row.getInt("id") val name: String = row.getString("name") val email: Option[String] = row.getStringOption("email")}Funcoes Definidas pelo Usuario
Seção intitulada “Funcoes Definidas pelo Usuario”Registre funcoes Scala nativas chamaveis a partir de SQL, triggers e stored procedures:
db.registerScalarFunction("my_double", { case Seq(v) => NumberValue(v.intValue * 2)}, NumberType)
// Agora utilizavel em SQL:// SELECT my_double(age) FROM users;Funcoes registradas dessa forma funcionam em todos os lugares: SELECT, WHERE, blocos DO, funcoes armazenadas e triggers.
Extracao de Valores
Seção intitulada “Extracao de Valores”val row: Row = table.data.head
// Extracao tipadaval id: Int = row.getInt("id")val name: String = row.getString("name")val email: Option[String] = row.getStringOption("email")val isActive: Boolean = row.getBoolean("is_active")
// Acesso diretoval value: Value = row("column_name")