題名の通り、1日かかって、なんとなくうごくようになってきたので、作製中コードをちょっとのっけてみる。
こんなの
はてぶろはコードコピペにあんまりやさしくないよね…
class CFEChain
func_queue: []
index: -1
chain: (func) ->
@func_queue.push(func)
return @
chainExec: () ->
@index++
#console.log 'chainExec'
#console.log @index, @func_queue[@index]
@func_queue[@index]?.apply(this, arguments);
class DB_SETTING
DB_NAME: 'test_database'
DB_VERSION: '1'
DB_SIZE: 1*1024*1024;
#ここから本体
class List2
DB_NAME: DB_SETTING::DB_NAME
DB_VERSION: DB_SETTING::DB_VERSION
DB_SIZE: DB_SETTING::DB_SIZE
TABLE_NAME: 'list'
SCHEMA: [
'id INTEGER PRIMARY KEY'
'name TEXT NOT NULL'
'site_num INTEGER NOT NULL'
'updated_at DATETIME NOT NULL'
'created_at DATETIME NOT NULL'
]
COLS: []
schema_text: ''
cols_text: ''
db: null
do_queue: []
constructor: ()->
for col in @SCHEMA
@COLS.push( col.split(' ')[0] )
@schema_text = "(" + @SCHEMA.join(',') + ")"
@cols_text = "(" + @COLS.join(',') + ")"
@openDB()
@checkTable()
clear: ()->
@do_queue = []
return @
get: () ->
if arguments.length == 0 #all
@do_queue.push({
sql: "SELECT * FROM #{@TABLE_NAME}"
params: []
mode: 'SELECT'
})
else if arguments.length == 1 #get by id
@do_queue.push({
sql: "SELECT * FROM #{@TABLE_NAME} WHERE id = ?"
params: [arguments[0]]
mode: 'SELECT'
})
else if arguments.length == 2
@do_queue.push({
sql: "SELECT * FROM #{@TABLE_NAME} WHERE `#{arguments[0]}` = ?"
params: [arguments[1]]
mode: 'SELECT'
})
else
return #fail...
return @
set: (id, values) ->
cols = []
vals = []
pvals = []
if id?
for k,v of values
cols.push("'#{k}'=?")
vals.push(v)
vals.push(id)
cols_str = cols.join(',')
next_sql = "UPDATE #{@TABLE_NAME} set #{cols_str} WHERE id=?"
params = vals
@do_queue.push({
sql: next_sql
params: params
mode: 'UPDATE'
})
else
for k,v of values
cols.push("'#{k}'")
vals.push(v)
pvals.push("?")
console.log cols
cols_str = cols.join(',')
pvals_str = pvals.join(',')
next_sql = "INSERT INTO #{@TABLE_NAME} ( #{cols_str} ) VALUES ( #{pvals_str} )"
params = vals
console.log next_sql
console.log params
@do_queue.push({
sql: next_sql
params: params
mode: 'INSERT'
})
return @
success: (func) ->
@do_queue[@do_queue.length-1].success = func
return @
fail: (func) ->
@do_queue[@do_queue.length-1].fail = func
return @
allways: (func) ->
@do_queue[@do_queue.length-1].allways = func
return @
exec: () ->
_this = this
for do_one in @do_queue
@db.transaction(
do (_this, do_one) ->
return (tx) ->
console.log do_one
tx.executeSql(
do_one.sql
do_one.params
(tx, rs)->
#do_one.success?(tx, rs)
if do_one.mode is 'INSERT'
id = rs.insertId;
do_one.success(id, tx, rs)
else if do_one.mode is 'UPDATE'
do_one.success(tx, rs)
else
rows = []
for row,i in rs.rows
rows.push(rs.rows.item(i));
do_one.success(rows, tx, rs)
)
do (_this) ->
(error) ->
do_one.fail?(error)
do (_this) ->
() ->
do_one.allways?()
)
openDB: ->
@db = window.__db ? openDatabase(@DB_NAME, @DB_VERSION, "", @DB_SIZE)
window.__db ?= @db
checkTable: ->
_this = this
@db.transaction(
do (_this) ->
return (tx) ->
console.log 'db check start'
sql = "SELECT * FROM #{_this.TABLE_NAME}"
tx.executeSql(
sql
[]
(tx, rs)->
console.log 'db check ok'
for i in [0...rs.rows.length]
row = rs.rows.item(i)
console.log row
)
do (_this) ->
(error) ->
console.log 'db select fail'
_this.initTable()
() ->
console.log 'db check end'
)
initTable: ->
console.log 'db init start'
_this = this
@db.transaction(
do (_this)->
(tx) ->
c = new CFEChain
c.chain(
(c, _this, tx) ->
console.log sql1 = "DROP TABLE #{_this.TABLE_NAME};"
tx.executeSql( sql1, [], (tx, rs)->
console.log "SUCCESS: #{sql1}"
c.chainExec(c,_this, tx)
)
).chain(
(c, _this, tx) ->
console.log sql2 = "CREATE TABLE IF NOT EXISTS #{_this.TABLE_NAME} #{_this.schema_text};"
tx.executeSql( sql2, [], (tx, rs)->
console.log "SUCCESS: #{sql2}"
)
).chainExec(c, _this, tx)
(error) ->
console.log error
console.log 'db init fail'
->
console.log 'db init end'
)
@test = new List2
こんなふうに使うかも
以下使う時のサンプル
DB初期化(テーブル初期化、ただし、テーブルが存在していない場合には勝手に行われます)
test.initDB()
INSERTのやり方(setの第一引数をnullに)
test
.clear()
.set(null, {name:'sitename', site_num:1, updated_at:'2011/01/01 01:02:03', created_at:'2011/01/01 01:02:03' } )
.success( function(rows, tx, rs){ console.log(rows, tx, rs) } )
.exec()UPDATEのやり方(setの第一引数を指定する)
test
.clear()
.set(1, {name:'sitename2', site_num:1, updated_at:'2011/01/01 01:02:03', created_at:'2011/01/01 01:02:03' } )
.success( function(rows, tx, rs){ console.log(rows, tx, rs) } )
.exec()SELECT by pkey
test
.clear()
.get(1)
.success( function(rows, tx, rs){ console.log(rows, tx, rs) } )
.exec()SELECT all
test
.clear()
.get()
.success( function(rows, tx, rs){ console.log(rows, tx, rs) } )
.exec()SELECT なにかで
test
.clear()
.get('name', 'sitename2')
.success( function(rows, tx, rs){ console.log(rows, tx, rs) } )
.exec()