//郵政公社配布郵便番号情報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);
}