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í:
close();
unset($piHandle);
return($bResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_exec($piHandle, $psQuery)
{
$oResult = $piHandle->exec($psQuery);
return($oResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_query($piHandle, $psQuery)
{
$oResult = $piHandle->query($psQuery);
return($oResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_changes($piHandle)
{
$iResult = $piHandle->changes();
return($iResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_last_insert_row_id($piHandle)
{
$iResult = $piHandle->lastInsertRowID();
return($iResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_free_result($poResultset)
{
$bResult = $poResultset->finalize();
unset($poResultset);
return($bResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_escape_string($psString)
{
$sResult = SQLite3::escapeString($psString);
return($sResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_errno($piHandle)
{
$iResult = $piHandle->lastErrorCode();
return($iResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_error($piHandle)
{
$sResult = $piHandle->lastErrorMsg();
return($sResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_fetch_assoc($poResultset)
{
$aResult = $poResultset->fetchArray(SQLITE3_ASSOC);
return($aResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_fetch_row($poResultset)
{
$aResult = $poResultset->fetchArray(SQLITE3_NUM);
return($aResult);
}
// ---------------------------------------------------------------------------------------------------------------------------
function sqlite_fetch_array($poResultset, $piMode = SQLITE3_BOTH)
{
$aResult = $poResultset->fetchArray($piMode);
$aResult($aResult);
}
?>
Gracias por el material Guti, saludos mi amigo.
¿Podría sugerirte que este código lo subas a GitHub?
Que chulada. A mí no me sirve de nada ahora mismo, pero ese tipo de conversiones son enormemente útiles en casos puntuales. Buen trabajo.
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
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.
Gracias Fernando, Carlos Mata y Ricardo. Eso del comentario creo que es un bug/feature del formateador de código de WordPress.
Guti te recomiendo «Code Syntax Block», que mejora el bloque de código de WP.
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.
Excelente trabajo, gracias por hacerlo público
Muchas gracias y bienvenido Darwin Santos. Me fue muy útil para ese proyecto, aunque desgraciadamente no necesité ampliar el wrapper, que tengo algunas mejoras en la cabeza.