Manipulasi Data Pada Blok Array Yang Terpilih

Sunday, October 12, 2014

Kita ada beberapa blok data di dalam satu array, dan hanya beberapa blok terpilih sahaja yang kita mahu manipulasi.

Contoh, katakan di bawah ini ada 10 array yang menyimpan data pekerja. Data yang disimpan adalah, IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, dan kenderaan.

Terdapat dua (2) data yang hendak dimanipulasi/encrypt iaitu Nama, dan Notelefon.

array semuafield = {IC, Nama, Alamat, Notelefon, Umur, Bandar, Poskod, Negeri, Jawatan, kenderaan}
array selectfield = {Nama, Notelefon}

Contoh data:

 IC | Nama | Alamat | Notelefon | Umur | Bandar | Poskod | Negeri | Jawatan | kenderaan  
 9801 | Faaris | Taman PP | 123 | 27 | Puchong | 56000 | Selangor | CEO | Kereta  
 0102 | Saajidah | Taman PP | 456 | 24 | Puchong | 56000 | Selangor | COO | Kereta  

Nilai g = 10; //jumlah array untuk 'semuafield'
Nilai a = 2; //jumlah array untuk 'selectedfield'

* Sekadar nota (sila abaikan): Data ini diambil dari database postgres, dijalankan menggunakan C++. Data yang terhasil dan yang telah dimanipulasi, akan disimpan ke dalam file data.txt dalam bentuk csv format.

Di bawah adalah contoh source code asal.

 ofstream myfile ("data.txt", std::ios_base::app);  
 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";  


* Sekadar nota (sila abaikan):
if(k < (g-1)) { myfile << ", "; } dan "\n" untuk memenuhi format CSV file. Tanda koma (,) memisahkan antara blok data dan tanda \n untuk membina newline pada baris data baru.

Secara logik mudah, code ini tiada masalah kerana pada gelung pertama, for (k < g), kita sudah keluarkan semua data satu persatu. Kemudian, di dalamnya kita buat checking untuk 'selectedfield' pula. Lihat pada gelung for (m < a) yang berada di dalam gelung yang awal. Di dalam gelung (m < a) ini, kita akan buat checking, jika terjumpa data di dalam blok 'selectedfield', kita akan mula encryptkan data tersebut sebelum dimasukkan ke dalam file. Jika tidak, data akan dimasukkan terus ke dalam file tanpa apa-apa manipulasi.

    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {                        
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
        } else {  
        myfile << c[semuafield[k]].as<string>();  
       }  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  

Tetapi, hasil yang kita dapat tidak menepati syarat. Datanya bertindih dan seolah-oleh encryption berjalan secara tidak konsisten

 9801, uYnudWRXUlhVbGhWYkdoVw==Faaris, Taman PP, 123+4RSU1UxVXhWWGhXV0doWA==, 27, Puchong, 56000, Selangor, CEO, Kereta  
 0102, +4RSU1UxVXhWWGhXV0doWA==Saajidah, Taman PP, 456+4RSU1UxVXhWWGhXV0doWA==, 24, Puchong, 56000, Selangor, COO, Kereta  


Jika diperhatikan, pada nilai yang dapat, ada data berulang. Contoh:

uYnudWRXUlhVbGhWYkdoVw==Faaris

uYnudWRXUlhVbGhWYkdoVw== adalah satu nilai. Faaris adalah satu nilai yang lain. Tetapi keduanya bercantum menjadi satu.

Ini kerana, nilai a=2, dan gelung pada a akan berjalan sebanyak 2 kali. Semakan kali pertama, ia memberi nilai uYnudWRXUlhVbGhWYkdoVw==, dan semakan kali kedua, diberi nilai Faaris.

Ini berlaku kerana selepas checking berlaku dan berjumpa dengan apa yang hendak di cari, gelung berjalan sekali lagi seperti biasa. Bagi mengatasi masalah ini, setiap kali gelung membuat semakan, gunakan fungsi break. Lihat kod di bawah (dengan beberapa perubahan berbanding kod di atas tadi.)

 if (myfile.is_open())  
 {  
   d = 0;  
   result Rp( Z.exec( sqlp ));  
   for (result::const_iterator c = Rp.begin(); c !=Rp.end(); ++c, d++) {  
    int count;  
    for (int k=0; k < g; k++)  
    {  
     count=0;  
     for (int m=0; m < a; m++)  
     {  
      if (c[semuafield[k]].size()==0)  
      {  
       myfile << "NULL";  
       break;  
      }  
       if (selectfield[m] == semuafield[k])  
        {  
         myfile << mimos_init(&chipper_mimos, c[semuafield[k]], cipher_id, key, 16);  
         break;  
        } else {  
        count++;  
        //myfile << c[semuafield[k]].as();  
        //break;  
       }  
        if (count == a)  
        myfile << c[semuafield[k]].as();  
      }  
     if(k < (g-1))  
      {  
       myfile << ", ";  
      }  
    }  
    myfile << "\n";  
   }  
  myfile.close();  
  }  
  else cout << "Unable to open file";