~mhysterio/sintel-media/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/bin/bash
# This file is part of Sintel.
#
# Sintel is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Sintel is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Sintel.  If not, see <https://www.gnu.org/licenses/>.
#
#
#Módulo para trabajar con la base de datos

#Localización de la base de datos. Debe incluir el nombre del fichero
database_DB="$global_DIR/sintel.db"

#Si la base de datos no existe, la creamos
if ! [ -f "$database_DB" ]; then
	echo "La base de datos no existe"
	init
fi

#En adelante esta variable se usará para ejecutar sqlite3 con nuestra base de datos
database_SQLITE="sqlite3 $database_DB"

#Si ĺa última operación fue un insert, ROWID contendrá el id del registro insertado.
#Si este valor es -1 debe entenderse que su contenido no sirve o que ha habido un error.
ROWID=-1

function database.info() {
    echo "database - Módulo que gestiona la base de datos."
    echo
    echo "Es el responsable de lanzar consultas y actualizaciones"
    echo "a la base de datos."
    echo
    echo "Cada vez que otro módulo necesita trabajar con la base de"
    echo "datos, realiza llamadas a una de las funciones de este."
    echo
    echo "El prefijo usado por las funciones de este módulo se ha"
    echo "acortado a db."
}

function db.info() {
    database.info
}

#Hacer consultas a la base de datos
#Nótese que he utilizado transacciones para evitar que la base de datos quede bloqueada
function db.executeQuery() {
    [[ $# != 1 ]] && ( die $(iargs 1 "sql") )
	local sql="$1"

	$DEBUG && echo "SQL: $sql" >> /tmp/sintel.txt
	local tmpfn=$(tempfile)
	$database_SQLITE "BEGIN; $sql; END TRANSACTION" > $tmpfn
	if [[ $? != 0 ]]; then
		echo "SQL ERROR: $sql" >> /tmp/sintel.txt
		die
	fi
	res=$(cat $tmpfn)
	echo "$res"
}

function database.executeQuery.info() {
    echo "database.executeQuery - Ejecuta una consulta."
    echo
    echo -e "\tArgumentos: consulta SQL"
    echo
    echo "Consulta la base de datos pero no hace cambios."
    echo
    echo "Ejemplos:"
    echo -e "\tsintel -f db.executeQuery:\"select * from medios\""
}

function db.executeQuery.info() {
    database.executeQuery.info
}

#Inserciones y actualizaciones de la base de datos
#Igual que en la función anterior, se han usado transacciones
#Si la operación es un insert, una vez insertado se obtendrá el ROWID
#Esto sucederá también con los updates, pero no haremos caso a ese dato.
function db.executeUpdate() {
    [[ $# != 1 ]] && ( die $(iargs 1 "sql") )
	local sql="$1"

	$DEBUG && echo "SQL: $sql" >> /tmp/sintel.txt
	local tmpfn=$(tempfile)
	if [[ "${sql,,}" == "insert"* ]]; then
		$database_SQLITE "BEGIN; $sql; select last_insert_rowid(); END TRANSACTION" > $tmpfn
		if [[ $? != 0 ]]; then
			echo "SQL ERROR: $sql" >> /tmp/sintel.txt
			die
		fi
		ROWID=$(cat $tmpfn)
	else
		$database_SQLITE "BEGIN; $sql; END TRANSACTION"
		if [[ $? != 0 ]]; then
			echo "SQL ERROR: $sql" >> /tmp/sintel.txt
			die
		fi
		ROWID=-1
	fi
}

function database.executeUpdate.info() {
    echo "database.executeUpdate - Lanza una consulta de actualización."
    echo
    echo -e "\tArgumentos: consulta SQL"
    echo
    echo "Realiza cambios en la base de datos."
    echo
    echo "Ejemplos:"
    echo -e "\tsintel -f db.executeUpdate:\"delete from medios\""
}

function db.executeUpdate.info() {
    database.executeUpdate.info
}