Advertisement
WILDAN_IZZUDIN

[JS] SQL LITE CLASS (WRAPPER)

Dec 3rd, 2024
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import sqlite3 from 'sqlite3'
  2.  
  3. class SQL {
  4.    /**
  5.     * Inisialisasi instance SQL baru.
  6.     * @param {string} databasePath - Path ke file database SQLite.
  7.     */
  8.    constructor(databasePath) {
  9.       this.databasePath = databasePath
  10.       this.db = new sqlite3.Database(this.databasePath, (err) => {
  11.          if (err) {
  12.             console.error('Kesalahan membuka database:', err.message)
  13.          } else {
  14.             console.log('Terhubung ke database SQLite.')
  15.          }
  16.       })
  17.    }
  18.  
  19.    /**
  20.     * Membuat tabel baru dalam database jika belum ada.
  21.     * @param {string} tableName - Nama tabel.
  22.     * @param {Array<{name: string, type: string}>} columns - Definisi kolom tabel.
  23.     */
  24.    async createTable(tableName, columns) {
  25.       try {
  26.          const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name=?`
  27.          const tableExists = await new Promise((resolve, reject) => {
  28.             this.db.get(tableExistsQuery, [tableName], (err, row) => {
  29.                if (err) reject(err)
  30.                resolve(!!row)
  31.             })
  32.          })
  33.  
  34.          if (tableExists) return
  35.  
  36.          const columnsDef = columns.map(col => `${col.name} ${col.type}`).join(', ')
  37.          const query = `CREATE TABLE ${tableName} (${columnsDef})`
  38.  
  39.          await new Promise((resolve, reject) => {
  40.             this.db.run(query, (err) => {
  41.                if (err) reject(err)
  42.                resolve()
  43.             })
  44.          })
  45.       } catch (error) {
  46.          console.error(`Kesalahan membuat tabel "${tableName}":`, error.message)
  47.       }
  48.    }
  49.  
  50.    /**
  51.     * Menambahkan data ke tabel.
  52.     * @param {string} tableName - Nama tabel.
  53.     * @param {Object} data - Objek data (key-value) untuk dimasukkan.
  54.     */
  55.    async insert(tableName, data) {
  56.       try {
  57.          const columns = Object.keys(data).join(', ')
  58.          const placeholders = Object.keys(data).map(() => '?').join(', ')
  59.          const values = Object.values(data)
  60.          const sql = `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`
  61.          await this.run(sql, values)
  62.       } catch (error) {
  63.          console.error('Kesalahan saat menambahkan data:', error.message)
  64.       }
  65.    }
  66.  
  67.    /**
  68.     * Mengambil data dari tabel berdasarkan kondisi tertentu.
  69.     * @param {string} tableName - Nama tabel.
  70.     * @param {string|string[]} columns - Kolom yang ingin diambil, atau '*' untuk semua kolom.
  71.     * @param {string} [condition] - Kondisi SQL untuk filter data.
  72.     * @returns {Promise<Array>} - Array baris data yang sesuai.
  73.     */
  74.    async select(tableName, columns = '*', condition = '') {
  75.       try {
  76.          const sql = `SELECT ${columns} FROM ${tableName} ${condition ? `WHERE ${condition}` : ''}`
  77.          return await this.all(sql)
  78.       } catch (error) {
  79.          console.error('Kesalahan saat mengambil data:', error.message)
  80.       }
  81.    }
  82.  
  83.    /**
  84.     * Memperbarui data dalam tabel berdasarkan kondisi tertentu.
  85.     * @param {string} tableName - Nama tabel.
  86.     * @param {Object} data - Objek data (key-value) untuk diperbarui.
  87.     * @param {string} condition - Kondisi SQL untuk filter data.
  88.     */
  89.    async update(tableName, data, condition) {
  90.       try {
  91.          const setClause = Object.keys(data).map((key) => `${key} = ?`).join(', ')
  92.          const values = Object.values(data)
  93.          const sql = `UPDATE ${tableName} SET ${setClause} WHERE ${condition}`
  94.          await this.run(sql, values)
  95.       } catch (error) {
  96.          console.error('Kesalahan saat memperbarui data:', error.message)
  97.       }
  98.    }
  99.  
  100.    /**
  101.     * Menghapus data dari tabel berdasarkan kondisi tertentu.
  102.     * @param {string} tableName - Nama tabel.
  103.     * @param {string} condition - Kondisi SQL untuk filter data.
  104.     * @param {Array} conditionValues - Nilai-nilai untuk kondisi.
  105.     */
  106.    async delete(tableName, condition, conditionValues = []) {
  107.       try {
  108.          const query = `DELETE FROM ${tableName} WHERE ${condition}`
  109.          await this.run(query, conditionValues)
  110.       } catch (error) {
  111.          console.error(`Kesalahan saat menghapus data dari tabel "${tableName}":`, error.message)
  112.       }
  113.    }
  114.  
  115.    /**
  116.     * Mengambil semua data dari tabel.
  117.     * @param {string} tableName - Nama tabel.
  118.     * @returns {Promise<Array>} - Array baris data dalam tabel.
  119.     */
  120.    async fetch(tableName) {
  121.       try {
  122.          const query = `SELECT * FROM ${tableName}`
  123.          return await this.all(query)
  124.       } catch (error) {
  125.          console.error(`Kesalahan saat mengambil data dari tabel "${tableName}":`, error.message)
  126.       }
  127.    }
  128.  
  129.    /**
  130.     * Menghapus tabel jika tabel tersebut ada.
  131.     * @param {string} tableName - Nama tabel.
  132.     */
  133.    async dropTable(tableName) {
  134.       try {
  135.          const sql = `DROP TABLE IF EXISTS ${tableName}`
  136.          await this.run(sql)
  137.       } catch (error) {
  138.          console.error('Kesalahan saat menghapus tabel:', error.message)
  139.       }
  140.    }
  141.  
  142.    /**
  143.     * Mengambil informasi kolom dari tabel.
  144.     * @param {string} tableName - Nama tabel.
  145.     * @returns {Promise<Array>} - Array informasi kolom tabel.
  146.     */
  147.    async getAll(tableName) {
  148.       try {
  149.          const query = `PRAGMA table_info(${tableName})`
  150.          return await this.all(query)
  151.       } catch (error) {
  152.          console.error(`Kesalahan mengambil informasi kolom tabel "${tableName}":`, error.message)
  153.       }
  154.    }
  155.  
  156.    /**
  157.     * Menutup koneksi ke database.
  158.     * @returns {Promise<void>}
  159.     */
  160.    close() {
  161.       return new Promise((resolve, reject) => {
  162.          this.db.close((err) => {
  163.             if (err) {
  164.                console.error('Kesalahan saat menutup database:', err.message)
  165.                reject(err)
  166.             } else {
  167.                console.log('Koneksi database ditutup.')
  168.                resolve()
  169.             }
  170.          })
  171.       })
  172.    }
  173.  
  174.    /**
  175.     * Menjalankan query SQL yang tidak mengembalikan baris data.
  176.     * @param {string} sql - String query SQL.
  177.     * @param {Array} params - Parameter query.
  178.     * @returns {Promise<any>}
  179.     */
  180.    run(sql, params = []) {
  181.       return new Promise((resolve, reject) => {
  182.          this.db.run(sql, params, function (err) {
  183.             if (err) reject(err)
  184.             else resolve(this)
  185.          })
  186.       })
  187.    }
  188.  
  189.    /**
  190.     * Menjalankan query SQL yang mengembalikan beberapa baris data.
  191.     * @param {string} sql - String query SQL.
  192.     * @param {Array} params - Parameter query.
  193.     * @returns {Promise<Array>} - Array baris data.
  194.     */
  195.    all(sql, params = []) {
  196.       return new Promise((resolve, reject) => {
  197.          this.db.all(sql, params, (err, rows) => {
  198.             if (err) reject(err)
  199.             else resolve(rows)
  200.          })
  201.       })
  202.    }
  203. }
  204.  
  205. export default SQL
  206. // Path: open-api/.misc/sql.js
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement