Skip to main content

How to parse multiple lines using strtok()

Hi,


Here is the sample C program which parse the lines using strtok() function. strtok() behaves very strange way and we need to take care of that. 


Here is the file i need to parse
========================

[root@localhost PGBAR]# more /tmp/.cred.txt
[PGM]Host:127.0.0.1:Port:5434:User:postgres:Database:pgm:Password:postgres
[MONITOR]Host:127.0.0.1:Port:5434:User:postgres:Database:postgres:Password:postgres
[MONITOR]Host:127.0.0.1:Port:5434:User:postgres:Database:postgres:Password:postgres

Here is the C Program written to parse the above lines and need to give the Postgresql Connection String. 

#include<stdio.h>
#include<string.h>
int Check_Token(char *Token,char *Compare)
{
if(strcmp(Token,Compare)!=0)
{
fprintf(stderr,"Invalid Identifier %s %s",Token,Compare);
return 0;
}
return 1;
}
int Framing_Connection_String(char Line[])
{
char Conn_String[100],*Host,*Port,*Database,*User,*Password,*Search;
Search=strstr(Line,"[PGM]");
if(Search)
{
Host=strtok(Line,"[PGM]Host:");
}
Search=strstr(Line,"[MONITOR]");
if(Search)
{
Host=strtok(Line,"[MONITOR]Host:");
}
Port=strtok(NULL,"Port:");
User=strtok(NULL,":");
if(Check_Token(User,"User"))
User=strtok(NULL,":");
Database=strtok(NULL,":");
if(Check_Token(Database,"Database"))
Database=strtok(NULL,":");
Password=strtok(NULL,":");
if(Check_Token(Password,"Password"))
Password=strtok(NULL,":");
sprintf(Conn_String,"hostaddr=%s port=%s dbname=%s user=%s password=%s",Host,Port,Database,User,Password);
printf("%s\n",Conn_String);
}

int main()
{
FILE *Credfile=fopen("/tmp/.cred.txt","r");
char *File_Buffer=(char *) malloc(2048);
char Delimit[]="\n";
char *Read_File=" ",**Line;
int LN=0,i=0;
fread(File_Buffer,sizeof(char),2048,Credfile);
Line=(char **) malloc(sizeof(char *)*50);
Read_File = strtok(File_Buffer,Delimit);
while(Read_File)
{
Line[LN]=(char *) malloc(strlen(Read_File));
strcpy(Line[LN],Read_File);
Read_File = strtok(NULL,Delimit);
LN++;
}
while(i<LN)
{
Framing_Connection_String(Line[i]);
free(Line[i++]);
}
}

How to compile
============
[root@localhost PGBAR]# gcc -o parsefile parsefile.c

Output
=====
[root@localhost PGBAR]# ./parsefile
hostaddr=127.0.0.1 port=5434 dbname=pgm user=postgres password=postgres
hostaddr=127.0.0.1 port=5434 dbname=postgres user=postgres password=postgres
hostaddr=127.0.0.1 port=5434 dbname=postgres user=postgres password=postgres

--Dinesh

Comments

Popular posts from this blog

Pgpool Configuration & Failback

I would like to share the pgpool configuration, and it's failback mechanism in this post.

Hope it will be helpful to you in creating pgpool and it's failback setup.

Pgpool Installation & Configuration

1. Download the pgpool from below link(Latest version is 3.2.1).
    http://www.pgpool.net/mediawiki/index.php/Downloads


2. Untart the pgpool-II-3.2.1.tar.gz and goto pgpool-II-3.2.1 directory.

3. Install the pgpool by executing the below commands:

./configure ­­prefix=/opt/PostgreSQL92/ ­­--with­-pgsql­-includedir=/opt/PostgreSQL92/include/ --with­-pgsql­-libdir=/opt/PostgreSQL92/lib/ make make install 4. You can see the pgpool files in /opt/PostgreSQL92/bin location.
/opt/PostgreSQL92/bin $ ls clusterdb   droplang  pcp_attach_node  pcp_proc_count pcp_systemdb_info  pg_controldata  pgpool pg_test_fsync pltcl_loadmod  reindexdb createdb    dropuser  pcp_detach_node  pcp_proc_info createlang  ecpg      pcp_node_count   pcp_promote_node oid2name  pcp_pool_status  pcp_stop_pgpool  …

pgBucket - A new concurrent job scheduler

Hi All,

I'm so excited to announce about my first contribution tool for postgresql. I have been working with PostgreSQL from 2011 and I'm really impressed with such a nice database.

I started few projects in last 2 years like pgHawk[A beautiful report generator for Openwatch] , pgOwlt [CUI monitoring. It is still under development, incase you are interested to see what it is, attaching the image here for you ],


pgBucket [Which I'm gonna talk about] and learned a lot and lot about PostgreSQL/Linux internals.

Using pgBucket we can schedule jobs easily and we can also maintain them using it's CLI options. We can update/insert/delete jobs at online. And here is its architecture which gives you a basic idea about how it works.


Yeah, I know there are other good job schedulers available for PostgreSQL. I haven't tested them and not comparing them with this, as I implemented it in my way.
Features are: OS/DB jobsCron style sytaxOnline job modificationsRequired cli options

N-Node Mutlimaster Replication With Bucardo...!

Our team recently got  a problem, which is to solve the N-Node multi master replication in PostgreSQL.

We all know that, there are some other db engines like Postgres-XC which works in this way. But, we don't have any tool available in PostgreSQL, except Bucardo.

Bucardo is the nice solution for 2-Nodes. Is there a way we can exceed this limitation from 2 to N..?

As an initial step on this, I have done with 3 Nodes, which I believe, we can extend this upto N. { I might be wrong here.}

Please follow the below steps to set up the 1 - 1 multi master replication.

1. Follow the below steps to get all the pre-requisites for the Bucardo.

yum install perl-DBIx-Safe or apt-get install libdbix-safe-perl Install the below components from CPAN. DBI DBD::Pg Test::Simple boolean (Bucardo 5.0 and higher) Download the latest tarball from here. tar xvfz Bucardo-4.4.8.tar.gz cd Bucardo-4.4.8 perl Makefile.PL make sudo make install 2. We need to create plperl extension in db. For this, download…