[Include] bLines - Rбpida Escrita/Leitura baseada em linhas
#1

bLines ou bLinhas

Finalmente "terminei de acabar" minha include de manipulaзгo de arquivos atravйs de linhas. Este sistema й muito similar aqueles sistemas de arquivos em INI, sу que este mйtodo й via o nъmero da linha.
Isto й, em vez de usar

pawn Code:
Bini_Set("oiamico1", 1)
Bini_Set("oiamico2", 2)
Bini_Set("oiamico3", 3)
Bini_Set("oiamico4", 4)
No arquivo ficaria:
PHP Code:
oiamico1=1
oiamico2
=2
oiamico3
=3
oiamico4
=
Com bLine vocк usaria

PHP Code:
enum topogm {
    
oiamico1 // armazena id 0
    
oiamico2 // armazena id 1
    
oiamico3 // armazena id 2
    
oiamico4 // armazena id 3
}
File_SetInt(oiamico11)
File_SetInt(oiamico22)
File_SetInt(oiamico33)
File_SetInt(oiamico44
Assim o arquivo ficaria:
pawn Code:
1
2
3
4
--------------------

pawn Code:
// File_Isset(linha)
// File_Get(linha)
// File_GetFloat(linha)
// File_GetInt(linha)
// File_GetBool(linha)
// File_SetBool(linha, bool:valor)
// File_SetPersonal(linha, "format", var)
// File_SetInt(linha, Int:valor)
// File_SetFloat(linha, Float:valor)
// File_Set(linha, string[])

// File_Open(arquivo[])
// File_Save()
Linha = Nъmero da linha (vocк pode usar defines para gravar o nъmero da linha ou enums, assim nгo se perde )

-----------------------


Exemplo de uso:

PHP Code:
    File_Open("bruno.txt"); // abrir arquivo bruno.txt caso nгo existir o arquivo ele cria ..
    
File_SetInt(01000); // escrever valor 1000 no arquivo na linha 1
    
File_SetFloat(11.1031); // coloca um valor float lб
    
print(File_Get(1)); // mostra o que tem na linha 1
// NA NOVA VERSAO NAO PRECISA DE FILE_CLOSE
// File_Save() deve ser coloca em OnGameModeExit (assim como Bini e DOF2 !!) 
-> NA NOVA VERSAO NAO PRECISA DE FILE_CLOSE <-

Para funcionamento correto deve ser colocado File_Save() em OnGameModeExit ou OnFilterScriptExit.

Logo no arquivo bruno.txt seria escrito:
pawn Code:
1000
1.1031
A novidade deste sistema й que criei uma funзгo similar ao "fscanf" do c++ (meio que inverso. haha )

A funзгo й:
PHP Code:
File_SetPersonal 
Com ela vocк pode especificar diversos tipos de dados para salvar. Floats, Inteiros, Strings e outros !! Alйm de poder colocar um delimitador ou algo do tipo:

File_SetPersonal(linha, "formatacao", VARIAVEIS);

EX:
File_SetPersonal(linha, "Inteiro: %d e Floats: %f", 100, 50.11);

Logo no arquivo seria escrito:

PHP Code:
"Inteiro: 100 e Floats: 50.11" 
Deu pra entender, nй? :P

Enfim, estou com preguiзa de explicar um tutorial detalhado ..

------


Cуdigo da include:

Pastebin -> http://pastebin.com/9AtHBRri

PHP Code:

/////////////////////////////////////////////////////////////////////////////// 
// 
// 
//        #### ########   ######     ######## ########    ###    ##     ## 
//         ##  ##     ## ##    ##       ##    ##         ## ##   ###   ### 
//         ##  ##     ## ##             ##    ##        ##   ##  #### #### 
//         ##  ########   ######        ##    ######   ##     ## ## ### ## 
//         ##  ##              ##       ##    ##       ######### ##     ## 
//         ##  ##        ##    ##       ##    ##       ##     ## ##     ## 
//        #### ##         ######        ##    ######## ##     ## ##     ## 
// 
// 
//                    Criado por Bruno da Silva (iPs DraKiNs) 
// 
//          Acesse meu blog sobre programaзгo http://www.brunodasilva.com.br 
// 
//                    Seja membro de nossa equipe de programaзгo 
//         http://ips-team.forumeiros.com/t2-inform...cao-na-ips 
// 
//                    [iPs]TeaM soluзхes de programaзгo em geral 
// 
// 
//                     bLine Files (mais rбpido que bini) 
// 
// 
// > Funзхes < 
// File_Isset(linha) 
// File_Get(linha) 
// File_GetFloat(linha) 
// File_GetInt(linha) 
// File_GetBool(linha) 
// File_SetBool(linha, bool:valor) 
// File_SetPersonal(linha, "format", var) 
// File_SetInt(linha, Int:valor) 
// File_SetFloat(linha, Float:valor) 
// File_Set(linha, string[]) 
// File_Open(arquivo[]) 
// File_Save() // apenas em onGameModeExit para fechar a include 
// 
// 
// 
///////////////////////////////////////////////////////////////////////////////// 
// Configuraзхes 
#define MAX_LINE_FILE   500 
#define MAX_LINE_TEXT   500 
#define MAX_FILE_NAME   064 
// Definiзхes e Declaraзхes 
stock 
    totalLines

    
bool:fileOpen
    
bool:fileWrited
    
_filed[MAX_LINE_TEXT], 
    
blineset[MAX_LINE_FILE], 
    
fileOpenned[MAX_FILE_NAME], 
    
bcache[MAX_LINE_FILE+1][MAX_LINE_TEXT+1]; 
#define File_Isset(%0) \ 
        
!!bcache[%0][0
#define File_Get(%0) \ 
        
bcache[%0
#define File_GetFloat(%0) \ 
        
floatstr(bcache[%0]) 
#define File_GetInt(%0) \ 
        
strval(bcache[%0]) 
#define File_GetBool(%0) \ 
        
!strcmp(bcache[%0], "true"
#define File_SetPersonal(%0,%1,%2) \ 
        
File_Set(%0, (format((_filed[0] = EOS_filed), MAX_LINE_TEXT, %1, %2), _filed)) 
#define File_SetInt(%0,%1) \ 
        
File_SetPersonal(%0"%d", %1
#define File_SetFloat(%0,%1) \ 
        
File_SetPersonal(%0"%f", %1
// Funзхes 
stock File_SetBool(linebool:value) { 
    return 
value File_Set(line"true") :  File_Set(line"false"); 

stock File_Set(linevalue[]) { 
    if(
line totalLines) { 
        
totalLines line
    } 
    
blineset[line] = 1
    return 
fileWrited truebcache[line][0] = EOSstrcat(bcache[line], valueMAX_LINE_TEXT); 

static
    
totalContadoINIHASHFILE

stock File_HashStr(buffer[]) 

    
totalContadoINIHASHFILE 0
    for(new 
strlen(buffer); != -1i--) { 
        
totalContadoINIHASHFILE += buffer[i]; 
    } 
    return 
totalContadoINIHASHFILE

stock File_Open(file[]) 

    if(
fileOpen && File_HashStr(file) == File_HashStr(fileOpenned) && !strcmp(filefileOpennedfalse)) { 
            return 
true
    } 
    else { 
        
File_Save(); 
    } 
    static 
        
f_i
        
len
        
Filef
    
fopen(fileio_readwrite); 
    if(
f) { 
        
fileOpenned[0] = EOS
        
strcat(fileOpennedfileMAX_FILE_NAME); 
        
f_i 0
        while((
len fread(fbcache[f_i]))) StripNewLine(bcache[f_i], len),++ f_iblineset[f_i-1] = 1
        
fclose(f); 
        
fileOpen true
        return 
totalLines f_ibcache[f_i +1][0] = EOS1
    } 
    return 
false

stock File_Save() 

    if(
fileWrited) { 
        if(
fileOpenned[0]) { 
            static 
Fileff_is_I
            
fopen(fileOpenned,  io_write ); 
            { 
                
f_i 0
                while(
f_i != totalLines +1) { 
                    if(
blineset[f_i]) { 
                        
s_I strlen(bcache[f_i]); 
                        
StripNewLine(bcache[f_i], s_I); 
                        
strcat(bcache[f_i], "\r\n"); 
                        
fwrite(fbcache[f_i]); 
                        
blineset[f_i] = 0
                    } 
                    
f_i++; 
                } 
            } 
            
fclose(f); 
            
fileOpenned ""
            return 
fileWrited falsefileOpen falsebcache[0][0] = EOStotalLines 0fileOpenned[0] = EOStrue
        } 
    } 
    return 
false

// By Draco Blue 
stock StripNewLine(string[], len

    if (
string[0]==0) return ; 
    if ((
string[len 1] == '\n') || (string[len 1] == '\r')) { 
        
string[len 1] = 0
        if (
string[0]==0) return ; 
        if ((
string[len 2] == '\n') || (string[len 2] == '\r')) string[len 2] = 0
    } 

Velocidade? Ainda nгo fiz teste de velocidade, mas tenho plena cosciencia que este mйtodo de manipulaзгo de arquivos й umas 5 vezes ou mais ligeira rбpida que arquivos INI.
Aceito teste de quem quiser fazer, colocarei os crйditos


Crйditos:
Bruno da Silva
[iPs]TeaM © 2012

Changelog:
16/07/2012 - 21:20

Deu arrumei. Era problema no armazenamento de demasiadas linhas na memуria (superior a 500). Arrumei isto para que de fato as linhas inativas nгo ocupem espaзo na memуria. -

Agradecimentos: Paulo, doodem, DON_FAF, CidadeNovaRP por reportarem o BUG ..

16/07/2012 - 21:35
Foi aprimorado o sistema de caches da include !! Agora ela estб mais rбpida
Agora nгo existe mais File_Close() !! Veja o modo de uso lб encima

Velocidade:
Quote:
ESCRITA :
bLines Time: 74 ms
bini Time: 3519 ms
DOF2 Time: 533 ms

LEITURA:
bLines Time: 54 ms
bini Time: 59 ms
DOF2 Time: 158 ms

Cуdigo Usado - Por Paulo !!:
Code:
#include <a_samp>

#include IPS/bini
#include IPS/bline
#include DOF2

public OnFilterScriptInit() {
	new tempo[3];
	tempo[0] = GetTickCount();
	for(new i; i != 10001; i++) {
	    File_Open("Teste1_1.ini");
	    File_SetInt(0, 1000);

	}
	tempo[0] = GetTickCount()-tempo[0];
	tempo[1] = GetTickCount();
	for(new i; i != 10001; i++) {
	    INI_Create("Teste2_1.ini");
	    INI_WriteInt("Teste2_1.ini", "Line", 1000);

	}
	tempo[1] = GetTickCount()-tempo[1];
	tempo[2] = GetTickCount();
	for(new i; i != 10001; i++) {
	    DOF2_CreateFile("Teste3_1.ini");
	    DOF2_SetInt("Teste3_1.ini", "Line", 1000);

	}
	tempo[2] = GetTickCount()-tempo[2];
	printf("ESCRITA : bLines Time: %i ms\nbini Time: %i ms\nDOF2 Time: %i ms", tempo[0], tempo[1], tempo[2]);


	new buff;
	tempo[0] = GetTickCount();
	for(new i; i != 10001; i++) {
	    File_Open("Teste1_1.ini");
	    buff = File_GetInt(0);
	}
	tempo[0] = GetTickCount()-tempo[0];
	tempo[1] = GetTickCount();
	for(new i; i != 10001; i++) {
	    buff = INI_ReadInt("Teste2_1.ini", "Line");
	}
	tempo[1] = GetTickCount()-tempo[1];
	tempo[2] = GetTickCount();
	for(new i; i != 10001; i++) {
	    buff = DOF2_GetInt("Teste3_1.ini", "Line");
	}
	tempo[2] = GetTickCount()-tempo[2];
	printf("LEITURA : bLines Time: %i ms \nbini Time: %i ms  \nDOF2 Time: %i ms ", tempo[0], tempo[1], tempo[2]);
	
	SendRconCommand(#exit);
	
	#pragma unused buff
	return true;
}

public OnFilterScriptExit() {
	File_Save();
	DOF2_SaveFile();
	INI_Save();
	
}
17/07/2012 - 21:15
Foi aprimorado a seguranзa da include !! Agora ela estб mais segura

18/07/2012 - 17:52

Foi aprimorado a velocidade da include !! Agora ela estб mais rбpida !!

Atualizado o tуpico e o cуdigo as 18/07/2012 - 17:52 !! Atualize
Reply
#2

Legal Cara!

@Edit

й mesmo vai ficar muito mais otimizado que os INI convencionais!
Reply
#3

Muito bom, parabйns!

Vou pensar em algum sistema legal que dк para utilizar a include.

Alguйm tem alguma ideia ? o.O
Reply
#4

Drakins fiz o teste e sua Include estб com pequenos problemas... Nгo estб setando corretamente e nгo estб criando mais de 1 arquivo!

Resultado(Nгo estб correto pois a sua include nгo criou todos arquivos e nгo setou corretamente o arquivo criado)


pawn Code:
bLines Time: 3316 ms
bini Time: 14746 ms
DOF2 Time: 8979 ms
Cуdigo

pawn Code:
new iCount[3];
iCount[0] = GetTickCount();
for(new i; i != 10001; i++) {
    File_Open("Teste1_1.ini");
    File_SetInt(0, 1000);
    File_Close();
   
    File_Open("Teste1_2.ini");
    File_Set(0, "Fods");
    File_Close();
}
iCount[0] = GetTickCount()-iCount[0];
iCount[1] = GetTickCount();
for(new i; i != 10001; i++) {
    INI_Create("Teste2_1.ini");
    INI_WriteInt("Teste2_1.ini", "Line", 1000);
    INI_Save();
   
    INI_Create("Teste2_2.ini");
    INI_WriteString("Teste2_2.ini", "Line", "Fods");
    INI_Save();
}
iCount[1] = GetTickCount()-iCount[1];
iCount[2] = GetTickCount();
for(new i; i != 10001; i++) {
    DOF2_CreateFile("Teste3_1.ini");
    DOF2_SetInt("Teste3_1.ini", "Line", 1000);
    DOF2_SaveFile();
   
    DOF2_CreateFile("Teste3_2.ini");
    DOF2_SetString("Teste3_2.ini", "Line", "Fods");
    DOF2_SaveFile();
}
iCount[2] = GetTickCount()-iCount[2];
printf("bLines Time: %i ms\nbini Time: %i ms\nDOF2 Time: %i ms", iCount[0], iCount[1], iCount[2]);
Reply
#5

parece que tб melhor que bini mesmo, depois vou fazer um test driver.
Reply
#6

Testa agora paulo ..

@Ficou rбpido?

--

Quote:
Originally Posted by humildadeforever
View Post
Muito bom, parabйns!

Vou pensar em algum sistema legal que dк para utilizar a include.

Alguйm tem alguma ideia ? o.O
Nгo sei nгo amiga .. Й clichк fazerem um sistema de login/registro, mas isto й chato fazer. Se tiver dificuldades posso ajudar a faze-lo, mas como viu nгo й muito complicado o uso da include
Reply
#7

Muito bom e eficiente.
Reply
#8

Quote:
Originally Posted by leonardo1434
View Post
parece que tб melhor que bini mesmo, depois vou fazer um test driver.
Test Drive nгo й gratuito nгo, tem que colocar uma moeda no jarro da sorte :P Fez o teste?


Quote:
Originally Posted by THE_FALLEN
View Post
Muito bom e eficiente.
Obrigado
Reply
#9

Vou fazer e ja Edit!
Reply
#10

Qualquer tipo de bug me avisa
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)