--- /dev/null
+
+class Readings.Catalogue
+ open: () ->
+ version = Readings.config.get 'db_version'
+ console.log "opening db ver #{version}"
+ @db = openDatabase 'catalogue', version, 'Catalogue', 65535, @init
+ this
+
+ init: (db) ->
+ if not db?
+ db = @db
+ console.log "initializing DB"
+ db.changeVersion "", Readings.config.get 'db_version'
+ $.ajax "initdb.sql"
+ type: "GET"
+ dataType: 'text'
+ success: (sql) =>
+ sql = sql.split /;\n/
+ sql = sql.slice(1,-2)
+
+ create = (tx) =>
+ for stmt in sql
+ console.log stmt
+ tx.executeSql stmt, [],
+ (tx,rs) => true,
+ (tx,err) => console.error(err)
+
+ db.transaction create
+ error: =>
+ console.error "can't get initial sql"
+
+ wrap_error: (error_cb) ->
+ (tx, error) ->
+ window.last_error = error
+ alert "SQL ERROR: #{error.message}"
+ if error_cb
+ error_cb(error)
+ else
+ throw error
+
+ map_rs: (rs, mapper) ->
+ objs = []
+ for i in [0...rs.rows.length]
+ objs.push(mapper(rs.rows.item(i)))
+ return objs
+
+## TODO update method
+ withCategory: (category, callback, error) ->
+ rs_to_tags = (tx, data) ->
+ tags = []
+ for i in [0...data.rows.length]
+ tags.push new Readings.Tag(data.rows.item(i))
+ callback(tags)
+
+ @db.readTransaction (tx)=>
+ tx.executeSql "SELECT * FROM tag WHERE category=? ORDER BY sort_key",
+ [category], rs_to_tags, @wrap_error(error)
+
+ withTag: (tag_id, cb) ->
+ @db.readTransaction (tx) =>
+ tx.executeSql "SELECT * FROM tag WHERE id=?", [tag_id],
+ (tx, rs) =>
+ if rs.rows.length > 0
+ tag = new Readings.Tag rs.rows.item(0)
+ return cb(tag)
+ else
+ alert "No tag id #{tag_id}"
+ ,
+ @wrap_error()
+
+ withBooks: (tag, cb) ->
+ @db.readTransaction (tx)=>
+ console.log "books in tag: #{tag.books}"
+ tx.executeSql "SELECT * FROM book WHERE id IN (#{tag.books}) ORDER BY sort_key",
+ [], ((tx, rs) => cb(@map_rs(rs, (rec)->new Readings.Book(rec)))), @wrap_error()