location fixed for postgresql client

This commit is contained in:
2025-02-06 07:15:32 +03:00
parent c93fe755fd
commit f4f5eb06a4
8 changed files with 116 additions and 120 deletions

View File

@@ -0,0 +1,45 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.core
import freeflowuniverse.herolib.clients.postgresql_client
// Configure PostgreSQL client
heroscript := "
!!postgresql_client.configure
name:'test'
user: 'postgres'
port: 5432
host: 'localhost'
password: '1234'
dbname: 'postgres'
"
// Process the heroscript configuration
postgresql_client.play(heroscript: heroscript)!
// Get the configured client
mut db_client := postgresql_client.get(name: "test")!
// Check if test database exists, create if not
if !db_client.db_exists('test')! {
println('Creating database test...')
db_client.db_create('test')!
}
// Switch to test database
db_client.dbname = 'test'
// Create table if not exists
create_table_sql := "CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)"
println('Creating table users if not exists...')
db_client.exec(create_table_sql)!
println('Database and table setup completed successfully!')

View File

@@ -1,10 +1,28 @@
#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run #!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run
import freeflowuniverse.herolib.clients.postgresql_client
import freeflowuniverse.herolib.data.location import freeflowuniverse.herolib.data.location
// Configure PostgreSQL client
heroscript := "
!!postgresql_client.configure
name:'test'
user: 'postgres'
port: 5432
host: 'localhost'
password: '1234'
dbname: 'postgres'
"
// Process the heroscript configuration
postgresql_client.play(heroscript: heroscript)!
// Get the configured client
mut db_client := postgresql_client.get(name: "test")!
// Create a new location instance // Create a new location instance
mut loc := location.new(false) or { panic(err) } mut loc := location.new(mut db_client, false) or { panic(err) }
println('Location database initialized') println('Location database initialized')
// Initialize the database (downloads and imports data) // Initialize the database (downloads and imports data)

View File

@@ -1,56 +0,0 @@
module postgresql_client
import freeflowuniverse.herolib.core.base
import db.pg
import freeflowuniverse.herolib.core.texttools
import freeflowuniverse.herolib.ui.console
// pub struct PostgresClient {
// base.BaseConfig
// pub mut:
// config Config
// db pg.DB
// }
// @[params]
// pub struct ClientArgs {
// pub mut:
// instance string @[required]
// // playargs ?play.PlayArgs
// }
// pub fn get(clientargs ClientArgs) !PostgresClient {
// // mut plargs := clientargs.playargs or {
// // // play.PlayArgs
// // // {
// // // }
// // }
// // mut cfg := configurator(clientargs.instance, plargs)!
// // mut args := cfg.get()!
// args.instance = texttools.name_fix(args.instance)
// if args.instance == '' {
// args.instance = 'default'
// }
// // console.print_debug(args)
// mut db := pg.connect(
// host: args.host
// user: args.user
// port: args.port
// password: args.password
// dbname: args.dbname
// )!
// // console.print_debug(postgres_client)
// return PostgresClient{
// instance: args.instance
// db: db
// config: args
// }
// }
// struct LocalConfig {
// name string
// path string
// passwd string
// }

View File

@@ -55,7 +55,7 @@ fn obj_init(obj_ PostgresClient) !PostgresClient {
return obj return obj
} }
fn (mut self PostgresClient) db() !pg.DB { pub fn (mut self PostgresClient) db() !pg.DB {
// console.print_debug(args) // console.print_debug(args)
mut db := self.db_ or { mut db := self.db_ or {
mut db_ := pg.connect( mut db_ := pg.connect(

View File

@@ -5,62 +5,35 @@ import os
import encoding.csv import encoding.csv
import freeflowuniverse.herolib.osal import freeflowuniverse.herolib.osal
import freeflowuniverse.herolib.core.pathlib import freeflowuniverse.herolib.core.pathlib
import freeflowuniverse.herolib.clients.postgresql_client
// LocationDB handles all database operations for locations // LocationDB handles all database operations for locations
pub struct LocationDB { pub struct LocationDB {
mut: pub mut:
db pg.DB db pg.DB
db_client postgresql_client.PostgresClient
tmp_dir pathlib.Path tmp_dir pathlib.Path
db_dir pathlib.Path db_dir pathlib.Path
} }
// new_location_db creates a new LocationDB instance // new_location_db creates a new LocationDB instance
pub fn new_location_db(reset bool) !LocationDB { pub fn new_location_db(mut db_client postgresql_client.PostgresClient, reset bool) !LocationDB {
mut db_dir := pathlib.get_dir(path:'${os.home_dir()}/hero/var/db/location.db',create: true)! mut db_dir := pathlib.get_dir(path:'${os.home_dir()}/hero/var/db/location.db',create: true)!
// PostgreSQL connection parameters with defaults // Create locations database if it doesn't exist
mut host := os.getenv('POSTGRES_HOST') if !db_client.db_exists('locations')! {
if host == '' { db_client.db_create('locations')!
host = 'localhost'
} }
port := os.getenv('POSTGRES_PORT')
port_num := if port == '' { 5432 } else { port.int() }
mut user := os.getenv('POSTGRES_USER')
if user == '' {
user = 'postgres'
}
mut password := os.getenv('POSTGRES_PASSWORD')
if password == '' {
password = '1234'
}
mut dbname := os.getenv('POSTGRES_DB')
if dbname == '' {
dbname = 'locations'
}
// First try to connect to create the database if it doesn't exist
mut init_db := pg.connect(
host: host
port: port_num
user: user
password: password
dbname: 'postgres'
) or { return error('Failed to connect to PostgreSQL: ${err}') }
init_db.exec("CREATE DATABASE ${dbname}") or {} // Switch to locations database
init_db.close() db_client.dbname = 'locations'
// Now connect to our database // Get the underlying pg.DB connection
db := pg.connect( db := db_client.db()!
host: host
port: port_num
user: user
password: password
dbname: dbname
) or { return error('Failed to connect to PostgreSQL: ${err}') }
mut loc_db := LocationDB{ mut loc_db := LocationDB{
db: db db: db
db_client: db_client
tmp_dir: pathlib.get_dir(path: '/tmp/location/',create: true)! tmp_dir: pathlib.get_dir(path: '/tmp/location/',create: true)!
db_dir: db_dir db_dir: db_dir
} }

View File

@@ -1,16 +1,20 @@
module location module location
import freeflowuniverse.herolib.clients.postgresql_client
// Location represents the main API for location operations // Location represents the main API for location operations
pub struct Location { pub struct Location {
mut: mut:
db LocationDB db LocationDB
db_client postgresql_client.PostgresClient
} }
// new creates a new Location instance // new creates a new Location instance
pub fn new(reset bool) !Location { pub fn new(mut db_client postgresql_client.PostgresClient, reset bool) !Location {
db := new_location_db(reset)! db := new_location_db(mut db_client, reset)!
return Location{ return Location{
db: db db: db
db_client: db_client
} }
} }
@@ -22,12 +26,25 @@ pub fn (mut l Location) download_and_import(redownload bool) ! {
// Example usage: // Example usage:
/* /*
fn main() ! { fn main() ! {
// Create a new location instance // Configure and get PostgreSQL client
mut loc := location.new()! heroscript := "
!!postgresql_client.configure
name:'test'
user: 'postgres'
port: 5432
host: 'localhost'
password: '1234'
dbname: 'postgres'
"
postgresql_client.play(heroscript: heroscript)!
mut db_client := postgresql_client.get(name: "test")!
// Create a new location instance with db_client
mut loc := location.new(db_client, false)!
// Initialize the database (downloads and imports data) // Initialize the database (downloads and imports data)
// Only needs to be done once or when updating data // Only needs to be done once or when updating data
loc.init_database()! loc.download_and_import(false)!
// Search for a city // Search for a city
results := loc.search('London', 'GB', 5, true)! results := loc.search('London', 'GB', 5, true)!

View File

@@ -310,11 +310,10 @@ fn (mut repo GitRepo) update_submodules() ! {
} }
fn (repo GitRepo) exec(cmd_ string) !string { fn (repo GitRepo) exec(cmd_ string) !string {
import os { quoted_path } repo_path := repo.path()
repo_path := quoted_path(repo.path()) cmd := 'cd ${repo_path} && ${cmd_}'
cmd_args := ["sh", "-c", "cd ${repo_path} && ${cmd_}"] // console.print_debug(cmd)
// console.print_debug(cmd_args.join(" ")) r := os.execute(cmd)
r := os.execute_opt(cmd_args)!
if r.exit_code != 0 { if r.exit_code != 0 {
return error('Repo failed to exec cmd: ${cmd}\n${r.output})') return error('Repo failed to exec cmd: ${cmd}\n${r.output})')
} }

View File

@@ -94,20 +94,20 @@ fn (mut repo GitRepo) load_branches() ! {
// Helper to load remote tags // Helper to load remote tags
fn (mut repo GitRepo) load_tags() ! { fn (mut repo GitRepo) load_tags() ! {
tags_result := repo.exec('git show-ref --tags') or { tags_result := repo.exec('git tag --list') or {
return error('Failed to list tags: ${err}. Please ensure git is installed and repository is accessible.') return error('Failed to list tags: ${err}. Please ensure git is installed and repository is accessible.')
} }
//println(tags_result)
for line in tags_result.split('\n') { for line in tags_result.split('\n') {
line_trimmed := line.trim_space() line_trimmed := line.trim_space()
if line_trimmed == '' { if line_trimmed != '' {
continue parts := line_trimmed.split(' ')
} if parts.len < 2 {
if parts := line_trimmed.split(' refs/tags/') { //console.print_debug('Skipping malformed tag line: ${line_trimmed}')
if parts.len != 2 { continue
continue }
} commit_hash := parts[0].trim_space()
commit_hash := parts[0].trim_space() tag_name := parts[1].all_after('refs/tags/').trim_space()
tag_name := parts[1].trim_space()
// Update remote tags info // Update remote tags info
repo.status_remote.tags[tag_name] = commit_hash repo.status_remote.tags[tag_name] = commit_hash