Kendi Yazdığımız Veritabanına Tablo Yapısını Ekleyelim (JSON)

codinger06

Üye
1 Mar 2023
161
136
127.0.0.1
Merhaba, hatırlarsanız JavaScript - JSON ile bir veritabanı ve motorunu yazıp onu kullanarak basit uygulamalar yapmıştık, fakat veritabanımız biraz fakirdi, tablo yapısı yoktu. Bir veritabanı içinde hem mesajlar hem de kullanıcıları tutamazdınız çünkü tablolar yok. Bu güncellemede veritabanına tablo yapısını kurdum, normalde bunu ayrı konu olarak açmayacaktım fakat bir konu daha açacağım bu veritabanının yönetim paneli diye o çok fazla oldu bir de o konuda bu güncellemeyi anlatmak çok çok daha fazla olacaktı. O yüzden önden bu güncellemeyi anlatmak istedim.

Gelelim güncellemeye, veritabanı yapımızı ele alarak başlayalım.

database.json :
JavaScript:
{
  "database1": {
    "tables": [
      {
        "table_name": "database1_table1",
        "rows": [
          { "id": "1", "name": "yeniNameee", "password": "password123" },
          { "id": "2", "name": "adddd", "password": "merhabasifre" }
        ]
      },
      {
        "table_name": "table2",
        "rows": [
          { "name": "namename", "pass": "dogrudzugunsifre", "id": 1 }
        ]
      }
    ],
    "auto_increment": true
  },
  "database2": {
    "tables": [
      {
        "table_name": "database2_table1",
        "rows": [{ "id": 1, "name": "random", "password": "random12345" }]
      }
    ],
    "auto_increment": true
  }
}

Her veritabanımızda "tables" adlı bir dizi var. Bu dizide ise belirli objeler var.
Her bir obje bir tabloyu temsil ediyor ve her objenin içerisinde satırları tutacak olan
"rows" adlı bir dizi daha var.
Ve her tablonun içerisinde ise o tablonun adını tutan bir
özellik bulunmakta.

Veritabanımızın yapısındaki küçük bir değişiklik motorda çok fazla değişikliğe bedel oldu.
DatabaseEngine.js :
JavaScript:
    constructor(){
        this.databases = this.req();
    }

    connect(db_name){
        this.database = this.req()[db_name];
        this.db_name = db_name;
        return this;
    }

Artık tüm veritabanlarına genel erişimimiz kolay olsun diye sınıfı çağırır çağırmaz belirli bir veritabanına bağlanmıyoruz, tüm veritabanlarıyla bağımız olabiliyor.
connect() adlı fonksiyonda ise belirli bir veritabanına bağlanıyoruz. Sonunda kendi sınıfını döndürüyor böylece şöyle bir yapıyı kullanabiliriz :
var de = new DatabaseEngine().connect("database1").getTables()

JavaScript:
    tableIndex(tableName){ // Verilen tablonun hangi indexte olduğunu bulup döndürür. Row için de geçerli.
        for(let i = 0; i < this.database.tables.length; i++){
            if(this.database.tables[i].table_name == tableName){
                return i;
            }
        }
    }

    rowIndex(tableName, rowId){
        for(let j = 0; j < this.database.tables[this.tableIndex(tableName)].rows.length; j++){
            if(this.database.tables[this.tableIndex(tableName)].rows[j].id == rowId){
                return j;
            }
        }       
    }

Burada daha önce görmediğimiz iki fonksiyon var.
tableIndex() fonksiyonu bizim verdiğimiz tablonun tablolar dizisinde hangi indeks numarasında olduğunu buluyor ve bize geri döndürüyor.
rowIndex() fonksiyonu ise verilen satır ID'sinin verilen tablo içerisinde rows dizisinde hangi indekste olduğunu bulup döndürüyor.

JavaScript:
    addDatabase(db_name, table_name=null, rows=null, auto_increment=true){
        if(table_name == null){
            this.databases[db_name] = {"tables" : [], "auto_increment" : auto_increment};
        }else if(rows == null){
            this.databases[db_name] = {"tables" : [{"table_name" : `${table_name}`, "rows" : []}], "auto_increment" : auto_increment};
        }else{
            this.databases[db_name] = {"tables" : [{"table_name" : `${table_name}`, "rows" : rows}], "auto_increment" : auto_increment};
        }
        this.write(this.databases);
    }

addDatabase() fonksiyonumuzda bu sefer tablo adı parametresini de alıyoruz.
Bakıyoruz
eğer tablo adı verilmemişse içi boş bir veritabanı açılacak demektir sadece veritabanını oluşturup bırakıyoruz.
Eğer tablo adı varsa fakat satır yoksa veritabanına tabloyu da içi boş bir şekilde ekleyip bırakıyoruz.
Onun dışında
iki bilgi de varsa normal bir şekilde veritabanına tablosunu ve içerisindeki satırları ekliyoruz.

JavaScript:
    deleteTable(tableName){
        this.database.tables.splice(this.tableIndex(tableName), 1);
        this.databases[this.db_name].tables = this.database.tables;
        this.write(this.databases);
    }

    addTable(tableName, rows){
        this.database.tables.push({"table_name" : tableName, "rows" : rows});
        this.databases[this.db_name].tables[this.tableIndex(tableName)] = this.database.tables[this.tableIndex(tableName)];
        this.write(this.databases);
    }

deleteTable() fonksiyonunda verilen tablonun indeksini bulup, o indeksi tablolar dizisinden kaldırıyoruz.
addTable() fonksiyonunda ise kendi veritabanımıza bir obje şeklinde satırlarıyla beraber tabloyu ekliyoruz. Daha sonrasında dosyada değiştirilmemiş olan veritabanının içerisindeki tablolar dizisine geliyoruz ve bizim yeni eklediğimiz tablonun indeksi hangisiyse onu da değiştirilmemiş dosyaya yazıyoruz ve kaydediyoruz.


JavaScript:
    updateColumn(tableName, rowId, col, value){
        this.database.tables[this.tableIndex(tableName)].rows[this.rowIndex(tableName, rowId)][col] = value;       

        this.databases[this.db_name].tables[this.tableIndex(tableName)].rows = this.database.tables[this.tableIndex(tableName)].rows;
        this.write(this.databases);       

    }

Değişimin olacağı tablonun indeksini bulup ulaşıyoruz ve değiştirilmesi gereken özelliğinin değerini verilen değerle değiştiriyoruz.
Daha sonra yukarıda anlattığımın benzer mantığı, kaydedilmemiş olan dosyada istediğimiz tablonun satırlarını yeni değiştirdiğimiz satırlarla değiştirip kaydediyoruz.


Güncellemenin içeriği sadece tablo yapısının eklenmesi. Ulaşacağımız ve ekleyeceğimiz şeyleri tabloları da hesaba katarak ekliyoruz. Bahsetmediğim birkaç fonksiyon daha var fakat mantıkları bu anlattıklarımın aynısı olduğu için ve zaten güncellemeden önceki ne yaptığını detaylı anlattığım için onlardan bahsetmedim.


Bu güncellemenin asıl amacı ileride konu olarak paylaşacağım yönetim panelinin içeriğinin daha zengin olması içindi.
Bu güncellemenin ayrı konu olmasının sebebi mesajlaşma uygulamamız yaklaşık 50 satır falanken yönetim paneli 250 satır oldu, anlatması bir hayli uzun sürecek o sebeple bu konu önden geldi.


Kendiniz daha iyi bir şekilde veritabanı motorunu incelemek için :
İndir lib rar
VirusTotal


Veritabanımızın ilk hali detaylı : https://www.turkhackteam.org/konular/javascript-json-ile-veritabani-yazmak.2037798/






 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.