Un principiante en las Artes Gráficas Una experiencia en un sector que nos envuelve… El blog personal de David Pinelo.

19jun/090

Ahorrando prácticamente: Implantemos una centralita Asterisk

Voy a atreverme a publicar una serie de post con cómo implantar una centralita telefónica de bajo coste, y capaz de dar un servicio muy avanzado. Indicaros que no soy ningún experto en Asterisk, que es el software que vamos a utilizar, aunque he averiguado lo suficiente como para implantar mi propia centralita.

Os comento de dónde parto y a dónde quiero llegar. Dispongo de 4 líneas telefónicas analógicas (sí, de esas que tenéis en casa), que además están configuradas en salto (esto es, tengo 4 números de teléfonos asociados a estas 4 líneas. Llamando a uno de esos números obtengo una de las 4 líneas, y no tiene por qué haber una correspondencia unívoca. Así podría tener 4 llamadas distintas de 4 usuarios que han marcado el mismo número).

Quiero llegar a tener una centralita con operadora virtual (esa locución que se obtiene en algunos teléfonos: "Pulse 1 para..."),  con buzones virtuales por cada extensión, y por supuesto libertad absoluta para configurar mis extensiones, grupos de extensiones...

A los que saben realmente de Asterisk: voy a montar algo muy sencillo y obvio. Pero, muy efectista y además práctico. Vamos a ello

Archivado en: General Continúa leyendo
8jun/090

Bug en AbanQ: Filtrado de campos double, int o uint desde FLTableDB

Creo haber descubierto un bug en AbanQ. La manera de reproducirlo es la siguiente:

Desde un FLTableDB, pinchamos en la opción Ver/Ocultar filtro. Escogemos ahora cualquier campo del tipo "double", "int" o "uint", modificamos la operación a Igual a (cualquier otra también vale para reproducirlo) e introducimos un valor. Al intentar ejecutar el filtro, si tenéis una base de datos PostgreSQL os dará un error, indicando que no se puede ejecutar la función "upper" sobre el campo.

El lugar donde se produce el bug en el código está situado en FLTableDB.cpp, en las líneas 1132 hasta 1137, dentro del método tdbFilterBuildWhere, y es fácil de ver: (código correspondiente al fuente del build 15245 disponible en la web de AbanQ)

case QVariant::UInt:
case QVariant::Int:
case QVariant::Double:
case QVariant::String:
case QVariant::StringList: {
        fieldArg = "upper(" + fieldName + ")";

Si os fijáis se aplica la función de base de datos "upper" a todos los campos. Esta función sirve para poner en mayúsculas una cadena de texto (AbanQ la utiliza para garantizar la comparación de cadenas de caracteres independientemente de que el usuario la introduzca en mayúsculas o minúsculas: se compara siempre en mayúsculas). El error está en que PostgreSQL se queja cuando a una columna integer o double precision se le hace un upper.

Así no es posible aplicar un filtro a este tipo de campos. ¿Solución? Super sencilla. Cambiad ese código por este, y recompilad

case QVariant::String:
case QVariant::StringList: {
        fieldArg = "upper(" + fieldName + ")";
case QVariant::UInt:
case QVariant::Int:
case QVariant::Double:

Así, el upper sólo se aplica a las cadenas.