//郵政公社配布郵便番号情報CSVファイルデータベース格納手抜きプログラム v0.01(Mar 2003 - pf-x.net)
//要libpq-fe.h(PostgreSQL APIライブラリヘッダー) PostgreSQLのソースパッケージの中にあります。
#include "libpq-fe.h"
#include <iostream>
int main(int argc,char *argv[]){
if(argc!=4){
puts("usage: yuubin [CSVfilename] [dbname] [tablename]");
return 0;
}
FILE *rd = fopen(argv[1],"r");
if(rd==NULL){
puts("Error: Can't open csv file.");
return 0;
}
PGconn *conn;
PGresult *res;
conn = PQsetdb(NULL,NULL,NULL,NULL,argv[2]);
if(PQstatus(conn) == CONNECTION_BAD){
printf("Error: Can't connect database(dbname=%s).\n",argv[2]);
exit(0);
}
char *tblname=argv[3];
//トランザクション処理開始
res = PQexec(conn,"BEGIN");
PQclear(res);
//各バッファは確証を以て決めている訳でもなく、チェックもしていないので溢れる危険有り。
char linebuf[512],oldbangou[6],newbangou[8],kenmei[11],simei[128],chomei[128];
char *buf;
int i,count=0;
char szPQ[512];
while(fgets(linebuf,sizeof(linebuf),rd)!=NULL){
if(strcmp(linebuf,"\n")==0) break;
strtok(linebuf,",");
buf=strtok(NULL,",");
for(i=0;i<5;i++){
oldbangou[i] = buf[i+1];
}
oldbangou[5]='\0';
buf=strtok(NULL,",");
for(i=0;i<7;i++){
newbangou[i] = buf[i+1];
}
newbangou[7]='\0';
for(i=0;i<3;i++) buf=strtok(NULL,",");
buf=strtok(NULL,",");
for(i=0;i<(strlen(buf)-2);i++){
kenmei[i]=buf[i+1];
}
kenmei[i]='\0';
buf=strtok(NULL,",");
for(i=0;i<(strlen(buf)-2);i++){
simei[i]=buf[i+1];
}
simei[i]='\0';
buf=strtok(NULL,",");
for(i=0;i<(strlen(buf)-2);i++){
chomei[i]=buf[i+1];
}
chomei[i]='\0';
snprintf(szPQ,sizeof(szPQ),"insert into %s (oldbangou, newbangou, kenmei, simei, chomei)"
" values ('%s','%s','%s','%s','%s')",
tblname,oldbangou,newbangou,kenmei,simei,chomei);
res = PQexec(conn,szPQ);
if(PQresultStatus(res)!=PGRES_COMMAND_OK){
printf("Error: exec=%s\n",szPQ);
PQclear(res);
res=PQexec(conn,"ABORT");
PQclear(res);
PQfinish(conn);
}
PQclear(res);
count++;
}
//トランザクション確定
res = PQexec(conn,"END");
PQclear(res);
//大量に追加したのでVACUUM
res = PQexec(conn,"VACUUM");
PQclear(res);
PQfinish(conn);
printf("%d records.\n",count);
}