diff --git a/common/db.js b/common/db.js
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5861346afabfc35895b7b41b0c8ff33b4b5fbd8e 100644
--- a/common/db.js
+++ b/common/db.js
@@ -0,0 +1,67 @@
+const logger = require('./common/logger.js');
+var sqlite3  = require('sqlite3').verbose();
+
+/* The kara table is defined as follows:
+ *
+ * <code>
+ * CREATE TABLE IF NOT EXISTS kara
+ *   ( id          INTEGER PRIMARY KEY AUTOINCREMENT
+ *   , song_name   TEXT    NOT NULL
+ *   , source_name TEXT    NOT NULL
+ *   , category    INTEGER NOT NULL REFERENCES kara_category
+ *   , song_type   INTEGER NOT NULL REFERENCES kara_type
+ *   , song_number INTEGER NOT NULL CHECK(song_number > 0)
+ *   , language    TEXT    REFERENCES language
+ *   , file_path   TEXT    NOT NULL UNIQUE
+ *   , is_new      INTEGER NOT NULL
+ *   , author_name TEXT
+ *   , available   INTEGER CHECK(available = 0 OR available = 1) DEFAULT 1 NOT NULL
+ *   , string      TEXT GENERATED ALWAYS AS
+ *     ( category || ' - ' || language || ' / ' || source_name || ' - ' || song_type ||
+ *       song_number || ' - ' || song_name || ' [ ' || author_name || ' ]' ||
+ *       CASE WHEN available = 0 THEN ' (U)' ELSE '' END
+ *     ) STORED
+ *   );
+ * </code>
+ */
+
+class KaraDatabase {
+
+    /* Private members
+     * - #m_karaPath: String
+     * - #m_db: sqlite3 database */
+    #m_karaPath;
+    #m_db;
+
+    /* The constructor
+     * - karaPath: String */
+    constructor(karaPath) {
+        this.#m_karaPath = karaPath;
+        this.#m_db       = new sqlite3.Database(this.m_karaPath);
+        logger.log("info", "Create database from file " + karaPath);
+    }
+
+    /* Call this as a destructor */
+    close() {
+        this.#m_db.close();
+        logger.log("info", "Close database " + karaPath);
+    }
+
+    /* Search from the kara table, a string. Can be anything (query, name, etc).
+     * - queryString: String */
+    search(queryString) {
+        let __sqlQuery =
+            `SELECT id, string
+             FROM kara
+             WHERE string LIKE ? OR author COLLATE nocase = ?`
+        ;
+        db.all(sql, [queryString, queryString], (err, rows) => {
+            if (err) {
+                throw err;
+            }
+            rows.forEach((row) => {
+                logger.log("debug", `[${row.id}] -> ${row.string}`);
+            });
+        });
+    }
+}