Neovim plugin improving access to clipboard history (mirror)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: fixed error on yanking something with function syntax to sqlite db

ptdewey 78980a2e a09c741a

+31 -8
+30 -7
lua/yankbank/persistence/sql.lua
··· 8 8 9 9 ---@class YankBankDB:sqlite_db 10 10 ---@field bank sqlite_tbl 11 + ---@field bank sqlite_tbl 11 12 local db = sqlite({ 12 13 uri = dbdir .. "/yankbank.db", 13 14 bank = { ··· 21 22 ---@class sqlite_tbl 22 23 local data = db.bank 23 24 25 + -- NOTE: escape and unescape query text 26 + -- TODO: adjust to only escape text that matches function syntax 27 + --- 28 + ---@param content string 29 + ---@return string 30 + function M.escape(content) 31 + return string.format("__ESCAPED__'%s'", content) 32 + end 33 + 34 + --- 35 + ---@param content string 36 + ---@return string 37 + ---@return integer? 38 + function M.unescape(content) 39 + return content:gsub("^__ESCAPED__'(.*)'$", "%1") 40 + end 41 + 24 42 --- insert yank entry into database 25 43 ---@param yank_text string yanked text 26 44 ---@param reg_type string register type ··· 33 51 -- check if entry exists in db 34 52 local res = db:eval( 35 53 "SELECT * FROM bank WHERE yank_text = :yank_text and reg_type = :reg_type", 36 - { yank_text = yank_text, reg_type = reg_type } 54 + { yank_text = M.escape(yank_text), reg_type = reg_type } 37 55 ) 38 56 39 57 -- if result is empty (eval returns boolean), proceed to insertion ··· 47 65 -- remove entry from db so it can be moved to first position 48 66 db:eval( 49 67 "DELETE FROM bank WHERE yank_text = :yank_text and reg_type = :reg_type", 50 - { yank_text = yank_text, reg_type = reg_type } 68 + { yank_text = M.escape(yank_text), reg_type = reg_type } 51 69 ) 52 70 end) 53 71 end ··· 61 79 db:with_open(function() 62 80 db:eval( 63 81 "INSERT INTO bank (yank_text, reg_type, pinned) VALUES (:yank_text, :reg_type, :pinned)", 64 - { yank_text = yank_text, reg_type = reg_type, pinned = is_pinned } 82 + { 83 + yank_text = M.escape(yank_text), 84 + reg_type = reg_type, 85 + pinned = is_pinned, 86 + } 65 87 ) 66 88 end) 67 89 ··· 100 122 101 123 local bank = self:get() 102 124 for _, entry in ipairs(bank) do 103 - table.insert(yanks, 1, entry.yank_text) 125 + local text, _ = M.unescape(entry.yank_text) 126 + table.insert(yanks, 1, text) 104 127 table.insert(reg_types, 1, entry.reg_type) 105 128 table.insert(pins, 1, entry.pinned) 106 129 end ··· 115 138 db:with_open(function() 116 139 return db:eval( 117 140 "DELETE FROM bank WHERE yank_text = :yank_text and reg_type = :reg_type", 118 - { yank_text = text, reg_type = reg_type } 141 + { yank_text = M.escape(text), reg_type = reg_type } 119 142 ) 120 143 end) 121 144 end ··· 130 153 return ( 131 154 db:eval( 132 155 "UPDATE bank SET pinned = 1 WHERE yank_text = :yank_text and reg_type = :reg_type", 133 - { yank_text = text, reg_type = reg_type } 156 + { yank_text = M.escape(text), reg_type = reg_type } 134 157 ) 135 158 ) 136 159 end) ··· 146 169 -- - figure out how to return if updated or remove return 147 170 return db:eval( 148 171 "UPDATE bank SET pinned = 0 WHERE yank_text = :yank_text and reg_type = :reg_type", 149 - { yank_text = text, reg_type = reg_type } 172 + { yank_text = M.escape(text), reg_type = reg_type } 150 173 ) 151 174 end) 152 175 end
+1 -1
lua/yankbank/utils.lua
··· 1 1 local M = {} 2 2 3 - --- DOC: 3 + --- get the last zero entry in a table 4 4 --- 5 5 ---@param t table 6 6 ---@return integer?