Δημιουργός αναζήτησης: DB() και NEWDB() με τον δικό σας οδηγό δεδομένων
Το DB() φτιάχνει ένα ερώτημα χωρίς να γνωρίζει ποια βάση δεδομένων θα το εκτελέσει και το NEWDB() καταχωρίζει τον driver που το εκτελεί. Το ίδιο το total5 δεν έχει driver SQL: ο query builder συγκεντρώνει όσα ζητάτε σε ένα αντικείμενο options και καλεί τον driver σας με αυτό και ο driver (δικός σας ή ένας που έρχεται σε ενότητα) μεταφράζει το options σε SQL, σε κλήση NoSQL ή σε οτιδήποτε άλλο.
- Το
NEWDB(driver)καταχωρίζει τον προεπιλεγμένο driver και τοNEWDB('name', driver)έναν με όνομα. Ο driver είναιfunction(options, callback): απαντήστε μεcallback(error, response). Ένας πίνακας γραμμένος ωςname/table(DB().find('audit/log')) χρησιμοποιεί τον drivernameκαι τον πίνακαlog· χωρίς πρόθεμα ο driver είναι οdefault. - Οι εργασίες ξεκινούν με το ερώτημα:
find(table)(αυτός είναι ο τρόποςread(table)Ένα αντικείμενο, ήnullΌταν δεν υπάρχει,list(table)(Μια σελίδα από μια συλλογή:response.page,limitκαιpagesπροστίθεται σε αυτό που επιστρέφει ο οδηγός, έτσι ο οδηγος θα πρέπει να καθορίσειcount) καιinsert(table, data)Ο κατασκευαστής έχει επίσηςcount,update,removeκαιqueryΟ οδηγός λειτουργεί με τον ίδιο τρόπο (ο οδηγόςoptions.execΜε το όνομα αυτό). - Επεξεργαστείτε το ερώτημα με:
where(name, [comparer], value)(=Όταν δεν υπάρχει σύγκριση,fields('a,b'),sort(name, [true])(trueγια να κατεβαίνει,take(n)καιpage(page, limit)Άλλες τροποποιήσεις περιλαμβάνουνid,in,skip,betweenκαιsearch. - Ολοκληρώστε με
.callback($): το αποτέλεσμα πηγαίνει στην απάντηση της ενέργειας$ή σε μια συνάρτηση(err, response)που περνάτε αντί γι' αυτό.
Για το πλήρες εγχώριο κατάλογο λειτουργίας, συμπεριφορά σφάλματος / σφάλμα και μορφές φίλτρου, δείτε Σύμβαση κατασκευαστήΓια το SQL CRUD, Command και Rollback, δείτε Ετικέτες SqliteΟι επιλογές που λαμβάνει ο οδηγός είναι σαφή δεδομένα. το παράδειγμα του οδηγού αποθηκεύει αρχεία στη μνήμη και εκθέτει το τελευταίο αντικείμενο options που έχει λάβει.
const users = [
{ id: 1, name: 'Ann', age: 31 },
{ id: 2, name: 'Bob', age: 17 },
{ id: 3, name: 'Cy', age: 45 }
];
F.seen = [];
// The default driver: it understands only "age >= value" and "id = value", which is all this example asks
NEWDB(function(options, callback) {
F.seen.push(JSON.parse(JSON.stringify(options)));
let rows = users.slice();
for (let f of options.filter) {
if (f.type === 'where' && f.name === 'age' && f.comparer === '>=')
rows = rows.filter(n => n.age >= f.value);
else if (f.type === 'where' && f.name === 'id')
rows = rows.filter(n => n.id === f.value);
}
switch (options.exec) {
case 'find':
case 'read':
if (options.sort && options.sort[0] === 'name_desc')
rows.sort((a, b) => a.name < b.name ? 1 : -1);
if (options.take)
rows = rows.slice(0, options.take);
return callback(null, rows);
case 'list':
rows.count = rows.length;
return callback(null, rows);
case 'insert':
users.push(Object.assign({ id: users.length + 1 }, options.payload));
return callback(null, users[users.length - 1]);
default:
return callback('The driver does not know ' + options.exec);
}
});
// A second driver, used by the tables that start with "audit/"
NEWDB('audit', function(options, callback) {
F.seen.push({ driver: 'audit', table: options.table });
callback(null, [{ event: 'login' }]);
});exports.install = function() {
ROUTE('GET /adults/', adults);
ROUTE('GET /user/{id}/', user);
ROUTE('POST /users/', create);
ROUTE('GET /page/', page);
ROUTE('GET /audit/', audit);
ROUTE('GET /seen/', seen);
};
function adults($) {
DB().find('users').where('age', '>=', 18).fields('id,name').sort('name', true).take(5).callback($);
}
function user($) {
DB().read('users').where('id', +$.params.id).callback($);
}
function create($) {
DB().insert('users', { name: $.body.name, age: $.body.age }).callback($);
}
function page($) {
DB().list('users').page(1, 2).callback(function(err, response) {
$.json({ err: err, count: response.count, page: response.page, limit: response.limit, pages: response.pages });
});
}
function audit($) {
DB().find('audit/log').callback($);
}
function seen($) {
$.json(F.seen);
}