SQLitePlugin в Markdown (litcoffee)
Новый компилятор кофе может компилировать это непосредственно в Javascript.
Лицензия для общего Javascript: MIT или Apache.
Основные объекты SQLitePlugin
Корневое окно объекта:
Константы:
Глобальные переменные:
Вспомогательные функции:
nextTick = window.setImmediate || (fun) -> window.setTimeout(fun, 0) return
Вспомогательная функция, которая позволяет избежать утечки объекта аргументов. См. https://www.npmjs.org/package/argsarray
argsArray = (fun) -> return -> len = arguments.length if len args = [] i = -1 while ++i < len args[i] = arguments[i] return fun.call this, args else return fun.call this, []
Объект соединения с базой данных SQLitePlugin
Объект SQLitePlugin определяется функцией-конструктором и функциями-членами прототипа:
SQLitePlugin = (openargs, openSuccess, openError) ->
console.log "SQLitePlugin openargs: #{JSON.stringify openargs}"
if !(openargs and openargs['name'])
throw new Error("Cannot create a SQLitePlugin instance without a db name")
dbname = openargs.name
@openargs = openargs
@dbname = dbname
@openSuccess = openSuccess
@openError = openError
@openSuccess or
@openSuccess = ->
console.log "DB opened: " + dbname
return
@openError or
@openError = (e) ->
console.log e.message
return
@open @openSuccess, @openError
return
SQLitePlugin::databaseFeatures = isSQLitePluginDatabase: true
SQLitePlugin::openDBs = {}
SQLitePlugin::addTransaction = (t) ->
if !txLocks[@dbname]
txLocks[@dbname] = {
queue: []
inProgress: false
}
txLocks[@dbname].queue.push t
@startNextTransaction()
return
SQLitePlugin::transaction = (fn, error, success) ->
@addTransaction new SQLitePluginTransaction(this, fn, error, success, true, false)
return
SQLitePlugin::readTransaction = (fn, error, success) ->
@addTransaction new SQLitePluginTransaction(this, fn, error, success, true, true)
return
SQLitePlugin::startNextTransaction = ->
self = @
nextTick () ->
txLock = txLocks[self.dbname]
if txLock.queue.length > 0 && !txLock.inProgress
txLock.inProgress = true
txLock.queue.shift().start()
return
return
SQLitePlugin::open = (success, error) ->
unless @dbname of @openDBs
@openDBs[@dbname] = true
cordova.exec success, error, "SQLitePlugin", "open", [ @openargs ]
return
SQLitePlugin::close = (success, error) ->
#console.log "SQLitePlugin.prototype.close"
if @dbname of @openDBs
delete @openDBs[@dbname]
cordova.exec null, null, "SQLitePlugin", "close", [ { path: @dbname } ]
return
SQLitePlugin::executeSql = (statement, params, success, error) ->
mysuccess = (t, r) -> if !!success then success r
myerror = (t, e) -> if !!error then error e
myfn = (tx) ->
tx.executeSql(statement, params, mysuccess, myerror)
return
@addTransaction new SQLitePluginTransaction(this, myfn, null, null, false, false)
return
SQLitePluginTransaction объект для пакетной обработки:
###
Объект транзакции для пакетной обработки:
###
SQLitePluginTransaction = (db, fn, error, success, txlock, readOnly) ->
if typeof(fn) != "function"
###
Это согласуется с реализацией в Chrome — он выдаёт ошибку, если вы передаёте что-либо кроме функции. Это также
предотвращает задержку нашей очереди транзакций, если кто-то передаёт ложное значение для fn.
###
throw new Error("transaction expected a function")
@db = db
@fn = fn
@error = error
@success = success
@txlock = txlock
@readOnly = readOnly
@executes = [] ```
@executeSql "BEGIN", [], null, (tx, err) -> throw new Error("unable to begin transaction: " + err.message)
return
SQLitePluginTransaction::start = -> try @fn this @run() catch err ### If "fn" throws, we must report the whole transaction as failed. ### txLocks[@db.dbname].inProgress = false @db.startNextTransaction() if @error @error err return
SQLitePluginTransaction::executeSql = (sql, values, success, error) ->
if @readOnly && READ_ONLY_REGEX.test(sql) @handleStatementFailure(error, {message: 'invalid sql for a read-only transaction'}) return
qid = @executes.length
@executes.push success: success error: error qid: qid
sql: sql
params: values || []
return
SQLitePluginTransaction::handleStatementSuccess = (handler, response) -> if !handler return
rows = response.rows || [] payload = rows: item: (i) -> rows[i]
length: rows.length
rowsAffected: response.rowsAffected or 0
insertId: response.insertId or undefined
handler this, payload
return
SQLitePluginTransaction::handleStatementFailure = (handler, response) -> if !handler throw new Error "a statement with no error handler failed: " + response.message if handler(this, response) throw new Error "a statement error callback did not return false" return
SQLitePluginTransaction::run = -> txFailure = null
tropts = [] batchExecutes = @executes waiting = batchExecutes.length @executes = [] tx = this
handlerFor = (index, didSucceed) -> (response) -> try if didSucceed tx.handleStatementSuccess batchExecutes[index].success, response else tx.handleStatementFailure batchExecutes[index].error, response catch err txFailure = err unless txFailure
if --waiting == 0
if txFailure
tx.abort txFailure
else if tx.executes.length > 0
###
new requests have been issued by the callback
handlers, so run another batch.
###
tx.run()
else
tx.finish()
return
i = 0
mycbmap = {}
while i < batchExecutes.length request = batchExecutes[i]
qid = request.qid
mycbmap[qid] =
success: handlerFor(i, true)
error: handlerFor(i, false)
tropts.push
qid: qid
# for ios version:
query: [request.sql].concat(request.params)
sql: request.sql
params: request.params
i++
mycb = (result) -> #console.log "mycb result #{JSON.stringify result}"
for r in result
type = r.type
qid = r.qid
res = r.result
q = mycbmap[qid]
if q
if q[type]
q[type] res
cordova.exec mycb, null, "SQLitePlugin", "backgroundExecuteSqlBatch", [{dbargs: {dbname: @db.dbname}, executes: tropts}]
return
SQLitePluginTransaction::abort = (txFailure) -> if @finalized then return tx = @
succeeded = (tx) -> txLocks[tx.db.dbname].inProgress = false tx.db.startNextTransaction() if tx.error then tx.error txFailure return
failed = (tx, err) -> txLocks[tx.db.dbname].inProgress = false tx.db.startNextTransaction() if tx.error then tx.error new Error("error while trying to roll back: " + err.message) return
@finalized = true
if @txlock @executeSql "ROLLBACK", [], succeeded, failed @run() else succeeded(tx)
return
SQLitePluginTransaction::finish = -> if @finalized then return tx = @
succeeded = (tx) ->
tx.db.startNextTransaction()
if tx.success then tx.success()
return
failed = (tx, err) ->
txLocks[tx.db.dbname].inПрогресс = false
tx.db.startNextTransaction()
если tx.error, то tx.error new Error("ошибка при попытке фиксации: " + err.message)
вернуть
@finalized = true
если @txlock
@executeSql "COMMIT", [], успешно, неудачно
@run()
иначе
успешно(tx)
вернуть
### SQLite plugin object factory:
SQLiteFactory =
###
ПРИМЕЧАНИЕ: эту функцию не следует переводить с JavaScript
обратно на CoffeeScript с помощью js2coffee.
Если эта функция редактируется в JavaScript, кому-то придётся
перевести её обратно на CoffeeScript вручную.
###
opendb: argsArray (args) ->
если args.length < 1, то вернуть null
первый = args[0]
openargs = null
okcb = null
errorcb = null
если первый.конструктор == String
openargs = {имя: первый}
если args.длина >= 5
okcb = args[4]
если args.длина > 5, то errorcb = args[5]
иначе
openargs = первый
если args.длина >= 2
okcb = args[1]
если args.длина > 2, то errorcb = args[2]
новый SQLitePlugin openargs, okcb, errorcb
deleteDb: (databaseName, success, error) ->
cordova.exec success, error, "SQLitePlugin", "delete", [{ путь: databaseName }]
### Экспортированный API:
root.sqlitePlugin =
sqliteFeatures:
isSQLitePlugin: true
openDatabase: SQLiteFactory.opendb
deleteDatabase: SQLiteFactory.deleteDb
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )