#include #include #include #include "global.h" /* MySQLtoPostgres - Copyright 2000-2006 by Michael Kohn mike@mikekohn.net http://www.mikekohn.net/ This program falls under the GPL license. */ /* call from gettoken() and parse_comment() */ int readchar(struct mp2p_context_t *mp2p) { int ch; if (mp2p->pushback!=-1) { ch=mp2p->pushback; mp2p->pushback=-1; } else { ch=getc(mp2p->in); } return ch; } /* call from getparameters */ int gettoken(struct mp2p_context_t *mp2p, char *token, int flag) { int ch,ptr,tp; ptr=-1; tp=0; while((ch=readchar(mp2p))!=EOF) { if (ptr==-1) { if ((ch!=' ' && ch!='\t') && (ch!='\n' && ch!='\r')) { ptr=0; if (ch=='\'') tp=1; else if (ch=='\"') tp=2; else if (ch=='$') tp=3; else if (ch=='/') tp=7; else if (ch>='0' && ch<='9') tp=4; else if ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) tp=5; else if (ch=='?') tp=6; else { tp=255; } token[ptr++]=ch; if (tp==6) { ch=readchar(mp2p); if (ch=='>') { token[ptr++]=ch; } else { mp2p->pushback=ch; } token[ptr]=0; return ptr; } else if (tp==7) { ch=readchar(mp2p); if (ch=='/' || ch=='*') { token[ptr++]=ch; token[ptr]=0; return ptr; } mp2p->pushback=ch; tp=255; } if (tp==255) { token[ptr]=0; if (strcmp(";",token)==0) { mp2p->column=0; mp2p->cflag=0; } return ptr; } } else if (flag==0) { putc(ch,mp2p->out); } continue; } if (tp==1 || tp==2) { token[ptr++]=ch; if (ch=='\\') { ch=readchar(mp2p); token[ptr++]=ch; continue; } if (ch=='\'' && tp==1) { break; } else if (ch=='\"' && tp==2) { break; } } else { if (ch>='0' && ch<='9') { token[ptr++]=ch; } else if ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) { token[ptr++]=ch; } else if (ch>='_') { token[ptr++]=ch; } else { mp2p->pushback=ch; break; } } } token[ptr]=0; return ptr; } /* call from parse_mysql.c: get parameter for mysql_ funktions */ void getparameters(struct mp2p_context_t *mp2p, char *param1, char *param2, char *param3) { int t,pcount, isparamflag; char token[8192]; pcount=0; t=0; isparamflag=0; if (gettoken(mp2p,token,isparamflag)==-1) return; if (strcmp("(",token)!=0) { printf("Parse Error: Expected '(' and got '%s'.\n",token); } pcount++; strcpy(param1,""); strcpy(param2,""); strcpy(param3,""); while(1) { if (gettoken(mp2p,token,isparamflag)==-1) return; if (strcmp("(",token)==0) pcount++; else if (strcmp(")",token)==0) pcount--; if (pcount==0) break; if (strcmp(",",token)==0) { t++; isparamflag=1; } else if (t==0) strcat(param1,token); else if (t==1) strcat(param2,token); else if (t==2) strcat(param3,token); } /* isparamflag=0; */ } /* call from copyphp() */ void parse_comment(struct mp2p_context_t *mp2p, char *token) { int t,l,ch; t=0; l=0; fprintf(mp2p->out,"%s",token); if (strcmp("/*",token)==0) t=1; else if (strcmp("//",token)==0) t=2; else { return; } while ((ch=readchar(mp2p))!=EOF) { putc(ch,mp2p->out); if ((ch=='/' && l=='*') && t==1) break; if ((ch=='\r' || ch=='\n') && t==2) { mp2p->column++; break; } l=ch; } return; } /* call from copyhtml */ void copyphp(struct mp2p_context_t *mp2p) { char token[8192]; char lastvar[256]; while(1) { if (gettoken(mp2p,token,0)==-1) return; if (token[0]=='$') { strcpy(lastvar,token); if (mp2p->column<=1) mp2p->cflag=1; } mp2p->column++; if (strcmp("/*",token)==0) /* ELVIS :( */ { parse_comment(mp2p,token); continue; } else if (strcmp("//",token)==0) { parse_comment(mp2p,token); continue; } else if (strcasecmp("mysql_affected_rows",token)==0) { parse_mysql_affected_rows(mp2p); continue; } else if (strcasecmp("mysql_change_user",token)==0) { parse_mysql_change_user(mp2p); continue; } else if (strcasecmp("mysql_close",token)==0) { parse_mysql_close(mp2p); continue; } else if (strcasecmp("mysql_connect",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_connect(mp2p); continue; } else if (strcasecmp("mysql_create_db",token)==0 || strcasecmp("mysql_createdb",token)==0) { parse_mysql_create_db(mp2p); continue; } else if (strcasecmp("mysql_data_seek",token)==0) { parse_mysql_data_seek(mp2p); continue; } else if (strcasecmp("mysql_db_query",token)==0 || strcasecmp("mysql",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_db_query(mp2p); continue; } else if (strcasecmp("mysql_drop_db",token)==0 || strcasecmp("mysql_dropdb",token)==0) { parse_mysql_drop_db(mp2p); continue; } else if (strcasecmp("mysql_errno",token)==0) { parse_mysql_errno(mp2p); continue; } else if (strcasecmp("mysql_error",token)==0) { parse_mysql_error(mp2p); continue; } else if (strcasecmp("mysql_fetch_array",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_fetch_array(mp2p);continue; } if (strcasecmp("mysql_fetch_assoc",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_fetch_assoc(mp2p); continue; } else if (strcasecmp("mysql_fetch_field",token)==0) { parse_mysql_fetch_row(mp2p); continue; } else if (strcasecmp("mysql_fetch_lengths",token)==0) { parse_mysql_fetch_row(mp2p); continue; } else if (strcasecmp("mysql_fetch_object",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_fetch_object(mp2p); continue; } else if (strcasecmp("mysql_fetch_row",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_fetch_row(mp2p); continue; } else if (strcasecmp("mysql_field_name",token)==0 || strcasecmp("mysql_fieldname",token)==0) { parse_mysql_field_name(mp2p); continue; } else if (strcasecmp("mysql_field_seek",token)==0 || strcasecmp("mysql_fieldseek",token)==0) { parse_mysql_field_seek(mp2p); continue; } else if (strcasecmp("mysql_field_table",token)==0 || strcasecmp("mysql_fieldtable",token)==0) { parse_mysql_field_table(mp2p); continue; } else if (strcasecmp("mysql_field_type",token)==0 || strcasecmp("mysql_fieldtype",token)==0) { parse_mysql_field_type(mp2p); continue; } else if (strcasecmp("mysql_field_flags",token)==0 || strcasecmp("mysql_fieldflags",token)==0) { parse_mysql_field_flags(mp2p); continue; } else if (strcasecmp("mysql_field_len",token)==0 || strcasecmp("mysql_fieldlen",token)==0) { parse_mysql_field_flags(mp2p); continue; } else if (strcasecmp("mysql_free_result",token)==0 || strcasecmp("mysql_freeresult",token)==0) { parse_mysql_free_result(mp2p); continue; } else if (strcasecmp("mysql_insert_id",token)==0) { parse_mysql_insert_id(mp2p); continue; } else if (strcasecmp("mysql_list_fields",token)==0 || strcasecmp("mysql_listfields",token)==0) { parse_mysql_list_fields(mp2p); continue; } else if (strcasecmp("mysql_list_dbs",token)==0 || strcasecmp("mysql_listdbs",token)==0) { parse_mysql_list_dbs(mp2p); continue; } else if (strcasecmp("mysql_list_tables",token)==0 || strcasecmp("mysql_listtables",token)==0) { parse_mysql_list_tables(mp2p); continue; } else if (strcasecmp("mysql_num_fields",token)==0 || strcasecmp("mysql_numfields",token)==0) { parse_mysql_num_fields(mp2p); continue; } else if (strcasecmp("mysql_num_rows",token)==0 || strcasecmp("mysql_numrows",token)==0) { parse_mysql_num_rows(mp2p); continue; } else if (strcasecmp("mysql_pconnect",token)==0) { strcpy(mp2p->convar,lastvar); parse_mysql_pconnect(mp2p); continue; } else if (strcasecmp("mysql_query",token)==0) { parse_mysql_query(mp2p);continue; } else if (strcasecmp("mysql_result",token)==0) { parse_mysql_result(mp2p); continue; } else if (strcasecmp("mysql_select_db",token)==0 || strcasecmp("mysql_selectdb",token)==0) { parse_mysql_select_db(mp2p); continue; } else if (strcasecmp("mysql_tablename",token)==0) { parse_mysql_tablename(mp2p); continue; } else { fprintf(mp2p->out,"%s",token); } if (strcmp("?>",token)==0) return; } } /* call from main() */ void copyhtml(struct mp2p_context_t *mp2p) { int ch,lastchar=0; while((ch=readchar(mp2p))!=EOF) { putc(ch,mp2p->out); if (ch=='?' && lastchar=='<') { copyphp(mp2p); lastchar=0; continue; } lastchar=ch; } } int main(int argc, char *argv[]) { struct mp2p_context_t mp2p; int t,state; printf("\nMysql PHP code to PostgresSQL php code converter.\n"); printf("Copyright 2000-2006 - Under the GPL license\n"); printf("Coding By Michael Kohn / http://www.mikekohn.net/\n"); printf("Fixes for version 0.93 by Thorsten Luft\n"); printf("Version 0.95 - June 2, 2006\n\n"); if (argc<3) { printf("Usage: %s [ options ] \n",argv[0]); printf(" -d \n\n"); exit(1); } strcpy(mp2p.dbname,"default"); mp2p.db_flag=0; mp2p.cflag=0; mp2p.pushback=-1; state=0; for (t=1; t