Nokia Suite veritabanı yapısı ve kayıtlara ulaşmak

Eğer benim gibi gerekli/gereksiz terabytelarca veriyi arşivleyenlerdenseniz, mobil içeriğinizi de arşivliyor olmanız muhtemel. Son birkaç yılın ana-akım mobil işletim sistemi Android‘i ve Samsung’un içler acısı mobil suit uygulaması Kies‘i hesaba katmazsak, Nokia ve Nokia Suite ile haşır neşir olmuş olmanız kuvvetli ihtimal.

Bilgi olarak iliştirelim: Tarihinde Nokia PC Suite, Ovi Suite, Nokia Ovi ve sonunda Nokia Suite olarak isim değiştiren Nokia uygulaması, 7250i gibi Nokia’nın ilk kameralı cihazlarından beri, mobil bilgiyi masaüstüyle senkron tutma, yedekleme gibi işlemler için muazzam bir stabiliteyle görev yapıyor. Zamanın dev mobil işletim sistemi Symbian‘ı ve Nokia’nın sistemdeki hissesini de hesaba katarsak, ilk tanıştığımız mobil oyunları, müzikleri, mobil yedeklemeyi bu yazılım ile tecrübe ettik. DKU serisi USB bağlantı kabloları, -daha eskilerde FBUS arabirimliler- müzik marketlerdeki “telefona mp3 atılır” yazıları, dönemin madden de bu yazılım üzerinden yürüyen kaynaklarını hatırlamamıza yeterli.

İnce bir girizgahtan sonra gelelim yazımın derdine. An itibariyle Nokia Suite üzerinde depoladığım 56512 sms, 987 rehber kişisi ve 1893 galeri öğresi mevcut. -Nokia Suite’in düzenli yapısı öncesine ait yaklaşık 95000+ vmg formatlı depolanmış kısa mesajımdan hiç bahsetmiyorum bile-

emrebilgin.com-nokia-suite-deposu
Nokia Suite veritabanım

Hal böyleyken, daha önceki vmg mesajlarımı ve şu anki Nokia Suite mesajlarımı birleştirmek, yer yer arama yapmak istiyorum. vMessage formatı için bir parser uygulaması (metin analizcisi/işleyicisi) yazarak, bu mesajları Nokia Suite veritabanına dahil edebilir veya ayrı bir veritabanı oluşturabilirim. Fakat Nokia Suite veritabanı yapısında minik bir problemimiz olacak.

Nokia Suite, veritabanı olarak SQLite kullanır. Sakladığı veriler ise, -seçiminize bağlı olarak- çağrı kayıtlarınız, telefonunuza özel dosya sistemi nesneleri ve haritaları bile olabilir. (Aslında bu konuya güvenlik bazında daha sonra değineceğim. Nokia Suite kullanmış bir Nokia kullanıcısı hakkında muazzam bilgilere bu veritabanından erişebilirsiniz. Kriminal incelemeye alındığınızı düşünün. Bu hoş olmazdı değil mi!) Buradaki problemimiz mesajlar tablosunda. Şöyle ki mesajların status (durum) sütununda tutulan, byte mask (bit maskesi) türünde sayısal bilgi içeren bir parametresi mevcut. Bu bilgi mesajın yönünü, okunma ve silinme durumunu taşıyor. Tek bir sayısal veride bu özniteliklerin tutulması programlama adına bir artı. Fakat maskenin sabitlerini ve sabit değerlerini bilmiyorsak, hangi sayısal değerin hangi özniteliğe karşılık geldiğini anlamamız imkansız olabilir. Böylece mesajlara ulaşır, fakat yönünü, okunma ve silinme durum bilgilerini elde edemeyiz. Bu da önemli bir bilgi kaybıdır.

Çalışmalarım ve testlerim sonucunda, bahsettiğim maskenin sabitlerine ve değerlerine ulaştım. Bu şekilde örneğin 128 status değerine sahip olan bir mesajın gelen/giden kutusunda olduğunu, okunup okunmadığını, silinip silinmediğini okuyabiliyorum. Şimdi bu adımları tek tek uygulayarak bilgilere erişelim.

Gereksinimlerimiz

Nokia Suite ile daha önce tanışmamış olup, deneyecekler için indirme bağlantısı burada.

SQLite veritabanına ulaşmak ve sorgulama yapmak için benim keşfettiğim en başarılı uygulama SQLite Expert. Buradan buyrun.

Bit maskeleri örneği ve yapısını Vb.net üzerinde vereceğim. Siz farklı bir dil ile kodlama yapsanız dahi, benim verdiğim sabitleri dile çevirmeniz yeterince basit olacaktır.

İşletim sistemi olarak Windows 7 x64 Professional kullanıyorum. Vista öncesi bir sürüm kullanıyorsanız, Nokia Suite veri deposu yolunu bulmanız gerekecek.

İlk adım

Nokia Suite mesaj veritabanı yolumuz:

C:\Users\<KullanıcıAdı>\AppData\Local\Nokia\Nokia Suite\Messages\Database\msg_db.sqlite

Kısa yoldan ulaşmak için Başlat > Çalıştır diyaloğuna

%UserProfile%\AppData\Local\Nokia\Nokia Suite\Messages\Database\

yazabilirsiniz. %UserProfile% değişkeni Windows işletim sistemlerinde kullanıcı klasör yolunu işaret eder.

SQLite Expert Personal sürüm kurarsanız ücretsiz bir lisansla işe başlayabiliriz.

emrebilgin.com-sqlite-expert-1
Veritabanını açalım

Yukarıdaki yolu takip etmek üzere File > Open Database komutu verelim. Klasördeki msg_db.sqlite dosyasını açmamız gerekiyor. Seçimi yaptığımızda veritabanı sol bölmede msg_db ismiyle görüntülenecek.

İşlem sonrası mesajların tutulduğu tablo olan main.messages tablosunu tıklayıp, sağ bölmeden Data kısmına geçelim. Burada kayıtları göreceksiniz.

SQL komutları yardımıyla sorgulamamızı yapabiliriz. -ki konunun özü bu aslında-

Örneğin aşağıdaki SQL sorgusuyla, kayıtları tarihine göre büyükten küçüğe doğru sıralayarak son 10 kaydı listeletelim. Bunun için sağ bölmeden SQL sekmesine geçiyoruz ve üst kısma sorgumuzu yazıyoruz.

SELECT * FROM messages ORDER BY msg_time DESC LIMIT 0, 10

Tabloda mesaj tarihini tutan sütunumuz msg_time. SQL komutunu açıklamama gerek yok, ki yeterince basit genel bir SQL sorgusu. Sorguyu yazdıktan sonra Execute SQL butonunu klikleyin. İstediğiniz bilgilerin listelendiğini göreceksiniz.

Asıl derdimiz

Kayıtları listeleyebildiğimize göre sıra msg_status sütununu okumakta. Okuma işleminde kullanacağımız bit maskesiyle alakalı bilgiyi ayrı bir yazıda detaylandıracağım. Şimdilik değerleri ve nasıl yapacağımıza geçelim.

Örneğin elimizde 136 sayısal maske değerine sahip bir kaydımız var. Bu değerin hangi öznitelikleri karşıladığını anlamak için sabitlerimize bakalım:

msg_status

    1: SENT (Gönderilen)
    2: UNREAD (Okunmayan)
    4: READ (Okunan)
    8: DRAFT (Taslak)
    16: PENDING (Gönderim bekliyor)
    32: RECEIVED (Alınan/Gelen)
    64: SENDING (Gönderiliyor)
    128: DELETED (Silinmiş)

136 değeri, yukarıdaki sabit değerlerinin hangilerinin toplamından oluşuyor? Bulduğumuz değerler bu mesajın öznitelikleridir.

136 = DELETED + DRAFT
136 = 128 + 8

Şimdi bu mesajın taslaklar klasöründe olduğunu ve daha sonra silindiğini söyleyebiliriz. Dikkat etmemiz gereken nokta, 136 değerini oluşturan toplanacak sayılar birbiriyle karışmaz. Bu bir bit maskesi olduğu için, 136 değeri yalnızca 128 ve 8 değerlerinin toplamıyla elde edilir.

status değeri 36 olan bir mesaj, 36 = 32 + 4 = RECEIVED + READ = Alınmış + Okunmuş bir mesajdır. 5 değeri için, 1 + 4 = SENT + READ = Gönderilmiş + Okunmuş bir mesajdır diyebilirken, bu mesajı çöpe taşıdığımızda değeri 1 + 4 + 128 = 133 olacaktır.

Programlama

Bu yöntemle her mesajı hesaplamak zorunda kalmayacağız tabiki. Ben VB.net üzerinde örnekleyeceğim. Farklı bir programlama dili kullanıyorsanız, vereceğim örnekten yola çıkarak kayıtları sorguladığınızı, her kaydın msg_status değerini elde ettiğinizi ve bir metod yardımıyla okuduğunuzu varsayıyorum.

Öncelikle Enum yapısında sabitlerimizi yazalım:

Public Enum NokiaMessageAttributes
        Sent = 1
        Unread = 2
        Read = 4
        Draft = 8
        Pending = 16
        Received = 32
        Sending = 64
        Deleted = 128
End Enum

Şimdi  bir bit maske değerinin, bir öznitelik değerini içerip içermediğini döndüren bir fonksiyon yazalım.

Public Function CheckAttribute(ByVal Mask As Integer, ByVal MsgAttribute As NokiaMessageAttributes) As Boolean
        Return CBool((Mask And MsgAttribute) = MsgAttribute)
End Function

Örnek kullanıma bakarsak, CheckAttribute(133, 64) False değeri döndürecekken, CheckAttribute(133, 128) True değeri döndürecektir. İlk parametremiz veritabanından okuduğumuz msg_status değeri, ikinci parametremiz ise test etmek istediğimiz öznitelik olmalıdır.

Şimdi ise istediğimiz özniteliklerin bitmask değerini üretmeyi öğrenelim.

Public Sub TestMsg()
        Dim msg_status As Integer = 0

        msg_status = NokiaMessageAttributes.Received Or NokiaMessageAttributes.Read

        MessageBox.Show(msg_status)
End Sub

TestMsg() metodunu çağırdığımızda alacağımız sonuç 36 (RECEIVED + READ) olacaktır.

Var olan bir bitmask değerine sonradan öznitelik ekleyelim:

Public Sub TestMsg()
        Dim msg_status As Integer = NokiaMessageAttributes.Received

        msg_status = msg_status Or NokiaMessageAttributes.Unread Or NokiaMessageAttributes.Deleted

        MessageBox.Show(msg_status)
End Sub

Şimdiyse metodumuz 162 değeri döndürecek. Bu değer Alınmış, Okunmamış ve Silinmiş bir mesajın msg_status değeridir.

Peki bir bitmask değerinin içerdiği tüm özniteliklere ulaşmak istersek ne yapacağız?

Public Sub TestMsg()
        Dim msg_status As Integer = 76
        Dim statusString As String = String.Empty
        Dim attributes() As String = CType([Enum].GetNames(GetType(NokiaMessageAttributes)), String())

        For Each msgAttribute As String In attributes
            Dim attrValue As Integer = [Enum].Parse(GetType(NokiaMessageAttributes), msgAttribute)

            If CheckProperty(msg_status, attrValue) Then
                statusString &= msgAttribute & ", "
            End If
        Next

        statusString = statusString.Remove((statusString.Length) - 2, 2)

        MessageBox.Show(statusString)
End Sub

Çıktımız “Read, Draft, Sending” olacak.

Son

Şimdi Nokia Suite veritabanı mesajlarını rahatlıkla işleyebiliriz. Tüm bu yazıda dikkat etmeniz gereken asıl nokta bit maskeleri ve işlenmeleri. Zira özniteliklerin depolanacağı durumlarda veritabanı bakımından en ucuz ve hızlı yol budur. Tek bir sayısal değer içerisinde birden fazla öznitelik bilgisi taşıyabilirsiniz. Windows dosya sistemi öznitelikleri ve Winapi bayraklarının bir çoğu bu yöntemle işlenir. Daha sonra ihtiyaç duyabileceğiniz bir bilgi olabilir.

1793 kez okundu.

Nokia Suite veritabanı yapısı ve kayıtlara ulaşmak” üzerine 2 yorum

  1. senkronize edilmeyen ve sadece telefon cihazından alınan-gönderilen ve silinen mesajları tarih ve saat bilgileri ile birlikte geri getirebilir miyiz?

Sen de yorumla