[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
=4 
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(oiamico1, 1)
File_SetInt(oiamico2, 2)
File_SetInt(oiamico3, 3)
File_SetInt(oiamico4, 4) 
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(0, 1000); // escrever valor 1000 no arquivo na linha 1
    
File_SetFloat(1, 1.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(line, bool:value) { 
    return 
value ? File_Set(line, "true") :  File_Set(line, "false"); 
} 
stock File_Set(line, value[]) { 
    if(
line > totalLines) { 
        
totalLines = line; 
    } 
    
blineset[line] = 1; 
    return 
fileWrited = true, bcache[line][0] = EOS, strcat(bcache[line], value, MAX_LINE_TEXT); 
} 
static
    
totalContadoINIHASHFILE
; 
stock File_HashStr(buffer[]) 
{ 
    
totalContadoINIHASHFILE = 0; 
    for(new 
i = strlen(buffer); i != -1; i--) { 
        
totalContadoINIHASHFILE += buffer[i]; 
    } 
    return 
totalContadoINIHASHFILE; 
} 
stock File_Open(file[]) 
{ 
    if(
fileOpen && File_HashStr(file) == File_HashStr(fileOpenned) && !strcmp(file, fileOpenned, false)) { 
            return 
true; 
    } 
    else { 
        
File_Save(); 
    } 
    static 
        
f_i, 
        
len, 
        
File: f; 
    
f = fopen(file, io_readwrite); 
    if(
f) { 
        
fileOpenned[0] = EOS; 
        
strcat(fileOpenned, file, MAX_FILE_NAME); 
        
f_i = 0; 
        while((
len = fread(f, bcache[f_i]))) StripNewLine(bcache[f_i], len),++ f_i, blineset[f_i-1] = 1; 
        
fclose(f); 
        
fileOpen = true; 
        return 
totalLines = f_i, bcache[f_i +1][0] = EOS, 1; 
    } 
    return 
false; 
} 
stock File_Save() 
{ 
    if(
fileWrited) { 
        if(
fileOpenned[0]) { 
            static 
File: f, f_i, s_I; 
            
f = 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(f, bcache[f_i]); 
                        
blineset[f_i] = 0; 
                    } 
                    
f_i++; 
                } 
            } 
            
fclose(f); 
            
fileOpenned = ""; 
            return 
fileWrited = false, fileOpen = false, bcache[0][0] = EOS, totalLines = 0, fileOpenned[0] = EOS, true; 
        } 
    } 
    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: