Cita:
Empezado por amadis
Podrias compartir un poco mas sobre como haces la comparacion y el archivo con las constantes.?
|
Lo hago en otros lenguajes pero quizás la forma mas simple en Delphi es ponerlo en un TMemo y copiar ahi el SQL.
Cita:
Empezado por amadis
En cuanto a la logica para el chequeo, se me ocurre en el source, del form principal, luego de crear los datos y conexion a bd.
|
De hecho, yo lo pongo como una función de la BD:
Código SQL
[-]
CREATE OR REPLACE FUNCTION db_master_version(OUT RETURNS INTEGER)
AS $$
BEGIN
RETURNS = 2;
END;
$$
LANGUAGE plpgsql;
Para la logica, lo que hago es que hago in split del SQL en cada "GO"
Código SQL
[-]
--version: 2
DROP TRIGGER IF EXISTS visit_code_update_tg ON payment;
GO
--version: 3
ALTER TABLE doc_codes
ADD COLUMN doc_code TEXT PRIMARY KEY DEFAULT generate_ulid() CHECK (not_empty(doc_code));
GO
Y parser el segmento de "version". Esto es rust pero la lógica creo se entiende:
Código PHP:
// of es el SQL con los comandos de DB
pub fn load_cmds(of: &str) -> Vec<CmdDB> {
let mut cmd = Vec::new();
let mut sql = CmdDB {
version: 0,
sql: "".to_string(),
};
// Recorro por lineas
for line in of.lines() {
// Al encontrar esto, paseo el numero como un integer
if line.starts_with("--name:") {
sql.version = line.replace("--name:", "").trim().parse().unwrap();
sql.sql.clear();
continue;
};
// Acumulo el SQL hasta que encuentro el GO
if line.starts_with("GO") {
cmd.push(sql.clone())
} else {
sql.sql += &format!("{}\n", line);
}
}
// Retorno los comandos partidos por version
cmd
}
//Se ven asi:
CmdDB {
version: 2,
sql: "
DROP TRIGGER IF EXISTS visit_code_update_tg ON payment;
"};