Wrapper PHP para llamadas procedurales de SQLite

Para un proyecto escrito en PHP que tengo entre manos, por motivos de rendimiento necesité migrar de MySQL a SQLite.

No quería invertir demasiado tiempo, y dado que usaba las llamadas procedurales de MySQL tipo mysql_xxx/mysqli_xxx (mysql_fetch_array/mysqli_fetch_array) opté por convertirlas a SQLite3. El problema es que la extensión de SQLite3 en PHP sólo está disponible orientada a objetos, no hay una forma procedural como si había con la anterior SQLite2 (sqlite_xxx). Es decir, convertir las invocaciones tipo OOP/POO:

$oDb = new SQLite3('Db.sqlite');
$oDb->exec('CREATE TABLE foo (bar STRING)');
$oResult = $oDb->query('SELECT bar FROM foo');
var_dump($oResult->fetchArray());

A:

$iDb = sqlite_open('Db.sqlite');
sqlite_exec($iDb, 'CREATE TABLE foo (bar STRING)');
$oResult = sqlite_query($iDb, 'SELECT bar FROM foo');
var_dump(sqlite->fetch_array($oResult));

El código no es más que un wrapper o stub de funciones que realiza la conversión de un paradigma de programación a otro.

Os dejo para descargar el código, que sin tener mucho misterio puede seros útil en el mismo escenario: sqlite.inc.php 1.00 (1 KB. en formato ZIP). Y para que lo podáis revisar cómodamente, también aquí:

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
<!--?php
	/**
	---------------------------------------------------------------------------------------------------------------------------
	SQLite procedural emultation layer v1.00
 
	* @author Javier Gutiérrez Chamorro (Guti) - https://www.javiergutierrezchamorro.com
 	* @link https://www.javiergutierrezchamorro.com
	* @copyright © Copyright 2020
 	* @package sqlite.inc.php
 	* @license LGPL
 	* @version 1.00
	---------------------------------------------------------------------------------------------------------------------------
	*/
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_open($psFilename, $piMode = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE)
	{
		$piHandle = new SQLite3($psFilename, $piMode);
		return($piHandle);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_close($piHandle)
	{
		$bResult = $piHandle--->close();
		unset($piHandle);
		return($bResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_exec($piHandle, $psQuery)
	{
		$oResult = $piHandle-&gt;exec($psQuery);
		return($oResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_query($piHandle, $psQuery)
	{
		$oResult = $piHandle-&gt;query($psQuery);
		return($oResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_changes($piHandle)
	{
		$iResult = $piHandle-&gt;changes();
		return($iResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_last_insert_row_id($piHandle)
	{
		$iResult = $piHandle-&gt;lastInsertRowID();
		return($iResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_free_result($poResultset)
	{
		$bResult = $poResultset-&gt;finalize();
		unset($poResultset);
		return($bResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_escape_string($psString)
	{
		$sResult = SQLite3::escapeString($psString);
		return($sResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_errno($piHandle)
	{
		$iResult = $piHandle-&gt;lastErrorCode();
		return($iResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_error($piHandle)
	{
		$sResult = $piHandle-&gt;lastErrorMsg();
		return($sResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_fetch_assoc($poResultset)
	{
		$aResult = $poResultset-&gt;fetchArray(SQLITE3_ASSOC);
		return($aResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_fetch_row($poResultset)
	{
		$aResult = $poResultset-&gt;fetchArray(SQLITE3_NUM);
		return($aResult);
	}
 
 
	// ---------------------------------------------------------------------------------------------------------------------------
	function sqlite_fetch_array($poResultset, $piMode = SQLITE3_BOTH)
	{
		$aResult = $poResultset-&gt;fetchArray($piMode);
		$aResult($aResult);
	}
 
?&gt;





8 comentarios en “Wrapper PHP para llamadas procedurales de SQLite”

  1. Que chulada. A mí no me sirve de nada ahora mismo, pero ese tipo de conversiones son enormemente útiles en casos puntuales. Buen trabajo.

  2. un relojista, el wrapper forma parte de un indizador de arhivos FTP/SSH que estuve desarrollando. Iba a funcionar con una base de datos MySQL que me di cuenta era demasiado lenta en full-text-search (FTS), así que decidí migrarlo rápidamente a SQLite y comprobar qué tal se comportaba. Lo hizo estupendamente, así que lo siguiente era migrarlo de verdad a SQLite, sin utilizar este wrapper. Como siempre ocurre nunca llegué a hacer ese cambio, y nunca llegué a dar por concluido el indexador.

    Justamente mi idea era dejarlo en Github a modo de referencia una vez terminado, pero tu sugerencia es muy razonable: https://github.com/javiergutierrezchamorro/sqlite.inc.php

  3. Me parece curiosa la apertura de código con el comentario HTML por si no tienes módulo PHP cargado. Sin embargo no está el cierre de comentario HTML al final y desde hace ya tiempo (¿años?) no se recomienda usar la etiqueta de cierre de código PHP salvo que sea imprescindible.
    Si lo subes a GitHub sería interesante añadirle un composer.json para permitir su instalación vía composer desde Packagist.

  4. Gracias Fernando. Ahora mismo estoy usando «WP-Syntax» que está basado en GeSHi. Llevo un tiempo planteándome el cambio, puesto que fue de aquellas apuestas erróneas y lleva sin actualizarse desde 2016. El problema que tengo al cambiar es que todo el código histórico que uso para formatear código usa su sintaxis, y por tanto tendría que actualizar todos los posts que lo usan. Hacerlo a mano sería inviable de modo que la cosa sería encontrar alguno parecido o igual, cosa que de momento no he logrado.

    Code Syntax Block no es uno de los que mirara, pero para mi parte del inconveniente que se basa en bloques, una función que no uso ya que me gusta escribir el contenido en HTML plano.

Deja un comentario