[TOOL] TSR Database 2.0 (wip..)

Proyectos en Desarrollo.

[TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Mon May 20, 2013 9:14 pm

Librería para la creación/gestión de bases de datos dinámicas en Gemix.
Gracias al amplio set de funciones en lo referente a datos tipo STRING que trae el lenguaje he podido crear este API que consta de todo lo necesario para crear bases de datos para las aplicaciones/juegos.

No desvelaré el secreto XD.. pero si os da por mirar el source de la librería creo que vais a flipar.. no digo mas :P el que lo mire lo entenderá rápido, he usado uno de los motores que tiene nativos Gemix para listas doblemente enlazadas jeje.. qué será..

DOCUMENTACION:
Source Code (Text) [ Download ] [ Hide ]
  • TSR DATABASE 2.0 DOC.
  •  
  • INT dbNew();
  •         - Retorna el stream que apunta a la base de datos.
  •        
  • INT dbClose( INT DB_ID );
  •         - Descarga la base de datos indicada como parámetro.
  •  
  • INT dbOpen( STRING filename );
  •         - Carga desde disco el archivo de base de datos pasado como parámetro.
  •  
  • INT dbSave( INT DB_ID, STRING filename );
  •         - Guarda/actualiza en disco la base de datos indicada como parámetro.
  •  
  • INT dbClone( INT DB_ID );
  •         - Crea un clon de la base de datos indicada como parámetro.
  •         - Retorna el ID de la nueva base de datos.
  •  
  •  
  •        
  •        
  •  
  •        
  • INT dbNameSet( INT DB_ID, STRING name );
  •         - Retorna 0 si se pudo establecer un nombre para la base de datos.
  •        
  • INT dbDescSet( INT DB_ID, STRING description );
  •         - Retorna 0 si se pudo establecer una descripción para la base de datos.
  •  
  • STRING dbNameGet( INT DB_ID );
  •         - Retorna el nombre de la base de datos.
  •        
  • STRING dbDescGet( INT DB_ID );
  •         - Retorna la descripción de la base de datos.
  •  
  • INT dbRegAdd( INT DB_ID );
  • INT dbRegAdd( INT DB_ID, STRING ID_REG );
  •         - Retorna 0 si se pudo crear un nuevo registro, con el overload 1 se puede especificar un ID para el registro.
  •  
  • INT dbRegDelete( INT DB_ID, INT reg );
  •         - Elimina un registro de la base de datos.
  •         - Si el registro no existe retorna -1.
  •  
  •        
  •        
  •        
  •        
  • INT dbFindId( INT DB_ID, STRING Reg_ID );
  • INT dbFindId( INT DB_ID, STRING Reg_ID, INT Start_Reg_Number_ );
  •         - Permite obtener el número de registro identificado como 'Reg_ID', con el overload 1
  •           se puede especificar la posición a partir de la cual se desea comenzar la busqueda dentro de
  •           la base de datos, esto es así para permitir buscar multiples coincidencias.
  •  
  • INT dbFindToken( INT DB_ID, STRING Token_To_Find );
  • INT dbFindToken( INT DB_ID, STRING Token_To_Find, INT Start_Reg_Number_ );
  •         - Permite obtener el número de registro que contiene un token igual a "Token_To_Find", mediante
  •           el overload 1 se puede especificar a partir de que registro comenzar a buscar, por el mismo motivo
  •           que la función anterior.
  •  
  •          
  •          
  •          
  •          
  • INT dbRegCopy( INT DB_ID, INT src_reg, INT dst_reg );
  •         - Copia el contenido del registro source en el registro destino.
  •           Se copia tanto el ID como los tokens que contenga.
  •  
  • INT dbRegIdCopy( INT DB_ID, INT src_reg, INT dst_reg );
  •         - Copia el ID del registro source en el registro destino.
  •           No se copia ningún token, solo el ID.
  •  
  • INT dbRegContentCopy( INT DB_ID, INT src_reg, INT dst_reg );
  •         - Copia el contenido del registro source en el registro destino.
  •           Solo se realizará la copia de los tokens..
  •  
  • STRING dbRegGetId( INT DB_ID, INT reg );
  •         - Retorna El ID del registro solicitado.
  •        
  • STRING dbRegGetContent( .. )
  •         - Función de uso interno de la libreria.
  •         - Devuelve la lista de tokens separados por el caracter especial ASCII 'ETX CODE'.
  •  
  •        
  •        
  •        
  • INT dbRegClear( INT DB_ID, INT reg );
  •         - Limpia el contenido de un registro pero no elimina el registro.
  •  
  • INT dbRegIdClear( INT DB_ID, INT reg );
  •         - Limpia el ID de un registro.
  •  
  • INT dbRegContentClear( INT DB_ID, INT reg );
  •         - Limpia todos los tokens de un registro pero no elimina el registro.
  •        
  •  
  •        
  •        
  •        
  • INT dbRegGetNumTokens( INT DB_ID, INT reg );
  •         - Retorna el número de tokens que contiene un registro.
  •  
  • STRING dbRegGetToken( INT DB_ID, INT reg, INT tokenNumber );
  •         - Retorna el numToken del registro solicitado.
  •  
  • INT dbRegAddToken( INT DB_ID, INT reg, STRING new_token );
  •         - Añade al registro un nuevo token.
  •  
  • INT dbRegModToken( INT DB_ID, INT reg, INT tokenNumber, STRING new_token_str );
  •         - Modifica el contenido de un token de un registro con el nuevo contenido.
  •         - Retorna -1 si el tokenNumber no existe.
  •  
  • INT dbRegClearToken( INT DB_ID, INT reg, INT tokenNumber );
  •         - Setea un token a " " si existe.
  •         - Si el token no existe en el registro inidcado retorna -1.
  •  
  •        




EJEMPLO DE CODIGO USANDO ESTO:
Source Code (Gemix) [ Download ] [ Hide ]
  • program DB_API;
  • include "TSRDB/TSRDB.prg";
  • Global
  •         int my_db;     
  •         string str_;
  •         int numTokens;
  • begin
  •         mode_set( 640, 480, 32);
  •         set_fps( 60, 0 );
  •         my_db = dbNew();                                        // creo una base de datos..
  •        
  •         // Crear un registro en la base de datos..
  •         x = dbRegAdd( my_db, "MSG1" );
  •        
  •         // añadir tokens al registro creado..
  •         dbRegAddToken( my_db, x, "Dato 1" );
  •         dbRegAddToken( my_db, x, "Dato 2" );
  •         dbRegAddToken( my_db, x, "Dato 3" );
  •         dbRegAddToken( my_db, x, "Dato 4" );
  •        
  •         // modificar un token ya existente en un registro..
  •         dbRegModToken( my_db, x, 2, "Dato 2 modificado!" );
  •        
  •         // crear otro registro en la base de datos..
  •         y = dbRegAdd( my_db, "" );
  •         // copiar el registro X en el registro Y recién creado..
  •         dbRegCopy( my_db, x, y );
  •        
  •         // añadir un token al registro Y..
  •         dbRegAddToken( my_db, y, "erkosone" );
  •        
  •         // guardar el archivo de la base de datos en disco..
  •         dbSave( my_db, "database.db" );
  •        
  •         // Obtener el token nº 4 del registro Y..
  •         str_ = dbRegGetToken( my_db, y, 4 );
  •         write( 0,10,10,3, "Token 4 del registro Y contiene: " + str_ );
  •        
  •         // OBtener el número de tokens que contiene el registro Y..
  •         numTokens = dbRegGetNumTokens( my_db, y );
  •         write( 0,10,20,3, "El registro Y contiene " + itoa(numTokens) + " tokens." );
  •        
  •         // buscar un token llamado "erkosone" en los registros de la base de datos..
  •         z = dbFindToken( my_db, "erkosone" );
  •         write( 0,10,40,3, "El token [erkosone] ha sido encontrado en el registro: " + itoa(z) );
  •        
  •         loop
  •                 frame;
  •     end
  • end
You do not have the required permissions to view the files attached to this post.
Last edited by erkosone on Thu May 23, 2013 6:17 am, edited 1 time in total.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Tue May 21, 2013 8:24 pm

Vale, pues ya tengo la librería de funciones completada, ahora a por el editor!

El API queda así por ahora:
dbNew();
dbOpen();
dbClose();
dbSave();
dbClone();
dbNameSet();
dbDescSet();
dbNameGet();
dbDescGet();
dbRegAdd();
dbFindId();
dbFindContent();
dbRegCopy();
dbRegIdCopy();
dbRegContentCopy();
dbIdGet();
dbContentGet();
dbRegDelete();
dbRegClear();
dbRegIdClear();
dbRegContentClear();

Ya tengo todo funcionando sin bug´s, el formato de estos archivos es binario con compresión y encriptación con password :)
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Wed May 22, 2013 4:32 pm

Avances:
- Funciones para manejo de tokens.

Ahora el API consta de unas cuantas funciones mas, ya es posible introducir un nuevo campo a un registro de la base de datos, modificar un registro, limpiar un registro..

Un código de ejemplo sobre el uso de esto:
Source Code (Gemix) [ Download ] [ Hide ]
  • program DB_API;
  • Global
  •         int my_db;     
  •         string str_;
  •         int numTokens;
  • begin
  •         mode_set( 640, 480, 32);
  •         set_fps( 60, 0 );
  •         my_db = dbNew();
  •         // Crear 2 registros nuevos y rellenar el 2 con el contenido del 1..
  •         x = dbRegAdd( my_db, "MSG1" );
  •         y = dbRegAdd( my_db, "" );
  •         dbRegCopy( my_db, x, y );
  •         dbSave( my_db, "database.db" );
  •         // añadir tokens a registro Y..
  •         dbRegAddToken( my_db, y, "Dato 1" );
  •         dbRegAddToken( my_db, y, "Dato 2" );
  •         dbRegAddToken( my_db, y, "Dato 3" );
  •         // modificar el token 2 del registro Y..
  •         dbRegModToken( my_db, y, 2, "Dato 2 modificado!" );
  •         // obtener el contenido del token 2 del registro Y..   
  •         str_ = dbRegGetToken( my_db, y, 2 );
  •         write( 0,10,10,3, str_ );
  •         // obtener el número de tokens que contiene el registro Y..
  •         numTokens = dbRegGetNumTokens( my_db, y );
  •         write( 0,10,20,3, &numTokens );
  •        
  •         loop
  •                 frame;
  •     end
  • end


Esto se va poniendo interesante jeje.. El API ya es bastante estable y parece que no hay bugs.. en cuanto implemente la función maldita para eliminar un token de un registro estará completa y comenzaré a implementar el editor de bases de datos con la nueva EGUI :)
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Thu May 23, 2013 5:29 am

Estoy montando los motores de búsqueda para la base de datos, en cuanto los tenga implementados publicaré el código por si alguien quiere darle utilidad a esto, el editor vendrá un poco mas tarde.
Ya tengo el primero de los 2 buscadores :D
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Thu May 23, 2013 6:18 am

Disponible al inicio del hilo, documentación incluida ;)
A disfrutarlo.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Fri May 24, 2013 1:56 am

Para el que tenga curiosidad, los registros dentro de la lista están conformados de la siguiente manera:

Source Code (Text) [ Download ] [ Hide ]
  • DB----->REG----->REG----->REG----->REG-----REGn..
  • |         |       |        |         |
  •         token1
  •         token2
  •         token3
  •         ..


Cuando se crea un nuevo registro se puede identificar con el campo ID, y añadir tokens/strings a ese registro, luego mediante los finders se busca el ID que identifica a ese registro y se consultan/modifican los tokens etc etc..
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby KingPirux » Fri May 24, 2013 2:22 pm

:y: jajaaa supongo que es este el post correspondiente :D
Genial el sistema, parece muy sencillo y a la vez muy potente.
Según lo que hablamos (y a ver si entiendo) El Reg podría usarse como un objeto (supongamos un Naipe/Carta)
El token corresponde a cada valor que tendrá el registro, entonces díria

Naipe
t1= Juego al que pertenece
t2= Expanción a la que pertenece
t3= Costo Moneda Real
t4= Costo Moneda Virtual
t5= Rareza de la carta
t6= Porcentaje de Venta

Entonces podría entrar a la tienda, elegir el juego al que quiero comprarle cartas, elegir la expanción/colección, y me mostraría una lista de todas las cartas posibles ese día, las cartas varían en cantidad por día según su rareza (mientras más alto el valor de rareza, más común es, se puede comprar en la tienda seguido, mientras más bajo el valor de rareza menos frecuencia aparecerá y por consiguiente también menos cantidad habrá en venta de esa carta un rand de 0 a rareza y listo). Por ultimo un porcentaje de venta que sería a cuanto la puedo vender (un 10%, 50%, 80% de su costo en moneda real y virtual) que de esta forma una carta rara puede ser costosa en comprar pero muy barata para vender, esto sería porque la carta es meramente coleccionable y no muy buena o es una carta promocional de adorno.

¿es como pensaba?
Consulta, debido a que si tuvieramos muchísimos tockens y al mismo tiempo muchísimos registros y queremos buscar 1 juego específico, el repasar registro por registro lo haría muy lento, sería mejor entonces 1 DB por cada juego?
User avatar
KingPirux
 
Posts: 91
Joined: Mon Dec 17, 2012 1:22 am
Location: Argentina

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Fri May 24, 2013 3:53 pm

Si es exactamente eso King.

Sobre lo referente al juego en cuestión, el sistema es muy rápido ya que está integrado con funciones nativas del lenguaje y no consume apenas recursos, como dato, puedo decirte que una base de datos con por ejemplo 800 registros con 15 tokens cada registro.. son 12000 entradas, encriptadas en disco y con compresión..

Con esas caracteristicas estos son los datos de rendimiento:
- Tiempo de carga desde el disco: 0.1 segundos o menos.
- Tiempo en recorrer la estructura de 12 mil registros: en mi máquina 4 segundos.

Pero lo bueno es que tiene un sistema de indexación directo, que es esto? pues que cada registro consta de un string que no hace falta parsear y es el encargado de indexar todos los tokens en una lista soberanamente inferior..

Con lo de parsear me refiero a que, los tokens son un array de strings contenido en un solo string usando delimitadores, claro.. esto tiene un coste en el rendimiento, pero los ID no son arrays.. son directamente un string pelao.. así que no hay ningún problema con el rendimiento jeje..

Osea, en realidad con estos 12mil registros solo hay que recorrer los 800 identificadores de registro y una vez localizado el indice de ese registro ya se tiene el puntero de acceso a los tokens, así que en realidad la cosa es bastante mas rápida, osea.. recorrer 800 o 900 identificadores lleva como mucho 0.4 segundos en mi máquina..

Imaginate lo que puede tardar XD..

El caso es usar con cabeza los identificadores, osea, para que el sistema sea completo he añadido el finder para tokens también, pero lo ideal es usar el finder de los ID, ese es el que realmente da el rendimiento al sistema de búsqueda.

Aunque... llegaremos a ocupar tantos registros?? XD.. yo creo que si ocupamos 100 o 200 será un milagro jeje..
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Sun May 26, 2013 4:07 am

Hola gente, comentar que estoy trabajando en el editor de bases de datos "visual", es una aplicación de escritorio que permite crear/abrir/guardar/modificar una base de datos etc etc..
En breve algunos screens de la aplicación.
Un saludo.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: [TOOL] TSR Database 2.0 (wip..)

Postby erkosone » Mon May 27, 2013 3:20 pm

Bueno, el editor de bases de datos está casi terminado, hoy creo que podré colgar un vídeo con una muestra de uso, el programa lo publicaré cuando salga la nueva beta ;)

Es un editor bastante atrevido..
Basicamente es un Shell/interprete de comandos, con ayuda integrada y eso..
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Next

Return to Proyectos WIP

Who is online

Users browsing this forum: No registered users and 3 guests

cron