#include #include #include #include #include #include "dbmcon1.h" #include "dbmcon2.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char dbAlias1[15]; char dbAlias2[15]; char user1[129]; char pswd1[15]; EXEC SQL END DECLARE SECTION; int TwoDbConnectType1(void); int TwoDbConnectType2OnePhaseCommit(void); int TwoDbConnectType2TwoPhaseCommit(void); int is_error(char errString[], struct sqlca *cap) { if(cap->sqlcode < 0) { printf("Greska: %s.\nSQLCODE: %ld\n", errString, cap->sqlcode); exit(EXIT_FAILURE); } return 0; } #define CHECKERR(str) if(is_error(str, &sqlca) != 0) return 1; int main(int argc, char **argv) { int rc = 0; strcpy(dbAlias1, argv[1]); strcpy(dbAlias2, argv[2]); strcpy(user1, argv[3]); strcpy(pswd1, argv[4]); rc = TwoDbConnectType1(); rc = TwoDbConnectType2OnePhaseCommit(); rc = TwoDbConnectType2TwoPhaseCommit(); return 0; } int TwoDbConnectType1(void) { int rc = 0; /* struktura koja se koristi za podesavanje opcija konekcije */ struct sqle_conn_setting clientAppInfo[2]; clientAppInfo[0].type = SQL_CONNECT_TYPE; clientAppInfo[0].value = SQL_CONNECT_1; clientAppInfo[1].type = SQL_DISCONNECT; clientAppInfo[1].value = SQL_DISCONNECT_EXPL; /* podesavanje atributa (opcija) konekcije */ sqlesetc(&clientAppInfo[0], 2, &sqlca); CHECKERR("Set client information"); printf("\n-----------------------------------------------------------\n"); printf("USE TYPE1 CONNECT TO TWO DATABASES.\n"); /* rad sa bazama */ printf("\nConnect to %s\n", dbAlias1); EXEC SQL CONNECT TO :dbAlias1 USER :user1 USING :pswd1; CHECKERR("Coneect - prva baza"); /* kreiranje tabele u prvoj bazi */ rc = FirstDbCreateTable(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - prva baza"); /* Raskid konekcije sa prvom bazom */ printf("CONNECT RESET\n"); EXEC SQL CONNECT RESET; CHECKERR("Connect reset - prva baza"); /* Povezivanje sa drugom bazom */ printf("\nConnect to %s\n", dbAlias2); EXEC SQL CONNECT TO :dbAlias2 USER :user1 USING :pswd1; CHECKERR("Connect - druga baza"); /* Kreiranje tabele u drugoj bazi */ rc = SecondDbCreateTable(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - druga baza"); /* Raskid konekcije sa drugom bazom */ printf("CONNECT RESET\n"); EXEC SQL CONNECT RESET; CHECKERR("Connect reset - druga baza"); printf("\nConnect to %s\n", dbAlias1); EXEC SQL CONNECT TO :dbAlias1 USER :user1 USING :pswd1; CHECKERR("Connect - prva baza"); /* Uklanjanje prethodno kreirane tabele iz prve baze */ rc = FirstDbDropTable(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - prva baza"); printf("CONNECT RESET\n"); EXEC SQL CONNECT RESET; CHECKERR("Connection reset - prva baza"); printf("\nConnect to %s\n", dbAlias2); EXEC SQL CONNECT TO :dbAlias2 USER :user1 USING :pswd1; CHECKERR("Connect - druga baza"); rc = SecondDbDropTable(); rc=SecondDbSelect(); printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - druga baza"); printf("CONNECT RESET\n"); EXEC SQL CONNECT RESET; CHECKERR("Connect reset - druga baza"); return 0; } /* TwoDbConnectType1 */ /* Povezivanje sa dve baze, pri cemu se vrse promene nad bazama, tj. kreiraju se nove tabele. Iz tog razloga, povezivanje sa jednom bazom i unosenje izmena mora da bude deo posebne transakcije. Dozvoljeno je da u okviru iste transakcije postoje konekcije sa vise baza, ali samo jedna od njih sme da se azurira, ostale mogu samo da se citaju. Ako se pokusa azuriranje neke druge baze, generise se greska. */ int TwoDbConnectType2OnePhaseCommit(void) { int rc = 0; struct sqle_conn_setting clientAppInfo[3]; clientAppInfo[0].type = SQL_CONNECT_TYPE; clientAppInfo[0].value = SQL_CONNECT_2; clientAppInfo[1].type = SQL_DISCONNECT; clientAppInfo[1].value = SQL_DISCONNECT_EXPL; clientAppInfo[2].type = SQL_SYNCPOINT; clientAppInfo[2].value = SQL_SYNC_ONEPHASE; sqlesetc(&clientAppInfo[0], 3, &sqlca); CHECKERR("Client Connection Attributes -- set"); printf("\n-----------------------------------------------------------\n"); printf("USE TYPE2 CONNECT TO TWO DATABASES - ONE PHASE COMMIT.\n"); printf("\nConnect to %s\n", dbAlias1); EXEC SQL CONNECT TO :dbAlias1 USER :user1 USING :pswd1; CHECKERR("Connect - prva baza"); printf("\nConnect to %s\n", dbAlias2); EXEC SQL CONNECT TO :dbAlias2 USER :user1 USING :pswd1; CHECKERR("Connect - druga baza"); printf("\nSET CONNECTION %s\n", dbAlias1); EXEC SQL SET CONNECTION :dbAlias1; CHECKERR("Set connection - prva baza"); rc = FirstDbCreateTable(); printf("\nSET CONNECTION %s\n", dbAlias2); EXEC SQL SET CONNECTION :dbAlias2; CHECKERR("Set connection - druga baza"); rc = SecondDbSelect(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - obe baze"); printf("\nSET CONNECTION %s\n", dbAlias2); EXEC SQL SET CONNECTION :dbAlias2; CHECKERR("Set connection - druga baza"); rc = SecondDbCreateTable(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - druga baza"); printf("\nSET CONNECTION %s\n", dbAlias1); EXEC SQL SET CONNECTION :dbAlias1; CHECKERR("Set connection - prva baza"); rc = FirstDbDropTable(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - prva baza"); printf("\nSET CONNECTION %s\n", dbAlias2); EXEC SQL SET CONNECTION :dbAlias2; CHECKERR("Set connection - druga baza"); rc = SecondDbDropTable(); rc=SecondDbSelect(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit - druga baza"); printf("\nDISCONNECT ALL\n"); EXEC SQL DISCONNECT ALL; CHECKERR("all connections -- disconnect"); return 0; } /* TwoDbConnectType2OnePhaseCommit */ int TwoDbConnectType2TwoPhaseCommit(void) { int rc = 0; struct sqle_conn_setting clientAppInfo[3]; clientAppInfo[0].type = SQL_CONNECT_TYPE; clientAppInfo[0].value = SQL_CONNECT_2; clientAppInfo[1].type = SQL_DISCONNECT; clientAppInfo[1].value = SQL_DISCONNECT_EXPL; clientAppInfo[2].type = SQL_SYNCPOINT; clientAppInfo[2].value = SQL_SYNC_TWOPHASE; /* podesavanje atributa (opcija) konekcije */ sqlesetc(&clientAppInfo[0], 3, &sqlca); CHECKERR("Set client information"); printf("\n-----------------------------------------------------------\n"); printf("USE TYPE2 CONNECT TO TWO DATABASES - TWO PHASE COMMIT.\n"); /* rad sa bazama */ printf("\nConnect to %s\n", dbAlias1); EXEC SQL CONNECT TO :dbAlias1 USER :user1 USING :pswd1; CHECKERR("Coneect - prva baza"); rc = FirstDbCreateTable(); printf("\nConnect to %s\n", dbAlias2); EXEC SQL CONNECT TO :dbAlias2 USER :user1 USING :pswd1; CHECKERR("Connect - druga baza"); rc = SecondDbCreateTable(); printf("\nSET CONNECTION %s\n", dbAlias1); EXEC SQL SET CONNECTION :dbAlias1; CHECKERR("Set connection - prva baza"); rc = FirstDbDropTable(); printf("\nSET CONNECTION %s\n", dbAlias2); EXEC SQL SET CONNECTION :dbAlias2; CHECKERR("Set connection - druga baza"); rc = SecondDbDropTable(); rc=SecondDbSelect(); /* Potvrdjivanje izmena */ printf("COMMIT\n"); EXEC SQL COMMIT; CHECKERR("Commit transakcije"); printf("\nDISCONNECT ALL\n"); EXEC SQL DISCONNECT ALL; CHECKERR("all connections -- disconnect"); return 0; } /* TwoDbConnectType2OnePhaseCommit */