/* * DB connection and schema management class */ Scholar.DB = new function(){ // Private members var _connection; var _transactionRollback; var _transactionNestingLevel = 0; // Privileged methods this.query = query; this.valueQuery = valueQuery; this.rowQuery = rowQuery; this.columnQuery = columnQuery; this.statementQuery = statementQuery; this.getColumns = getColumns; this.getColumnHash = getColumnHash; this.beginTransaction = beginTransaction; this.commitTransaction = commitTransaction; this.rollbackTransaction = rollbackTransaction; this.transactionInProgress = transactionInProgress; this.tableExists = tableExists; ///////////////////////////////////////////////////////////////// // // Privileged methods // ///////////////////////////////////////////////////////////////// /* * Run an SQL query * * Optional _params_ is an array of bind parameters in the form * [{'int':2},{'string':'foobar'}] * * Returns: * - Associative array (similar to mysql_fetch_assoc) for SELECT's * - lastInsertId for INSERT's * - TRUE for other successful queries * - FALSE on error */ function query(sql,params){ var db = _getDBConnection(); try { // Parse out the SQL command being used var op = sql.match(/^[^a-z]*[^ ]+/i); if (op){ op = op.toString().toLowerCase(); } // If SELECT statement, return result if (op=='select'){ // Until the native dataset methods work (or at least exist), // we build a multi-dimensional associative array manually var statement = statementQuery(sql,params); var dataset = new Array(); while (statement.executeStep()){ var row = new Array(); for(var i=0; i -1){ var value = statement.getInt32(0); } else { var value = statement.getUTF8String(0); } statement.reset(); return value; } /* * Run a query and return the first row */ function rowQuery(sql,params){ var result = query(sql,params); if (result){ return result[0]; } } /* * Run a query and return the first column as a numerically-indexed array */ function columnQuery(sql,params){ var statement = statementQuery(sql,params); if (statement){ var column = new Array(); while (statement.executeStep()){ column.push(statement.getUTF8String(0)); } statement.reset(); return column.length ? column : false; } return false; } /* * Run a query, returning a mozIStorageStatement for direct manipulation * * Optional _params_ is an array of bind parameters in the form * [{'int':2},{'string':'foobar'}] */ function statementQuery(sql,params){ var db = _getDBConnection(); try { Scholar.debug(sql,5); var statement = db.createStatement(sql); } catch (e){ throw('[QUERY: ' + sql + '] [ERROR: ' + db.lastErrorString + ']'); } if (statement && params){ for (var i=0; i file.append(SCHOLAR_CONFIG['DB_FILE']); _connection = store.openDatabase(file); return _connection; } }