ForgeTotal.js 5
hu

Total.js 5

Query Builder: DB() és NEWDB() saját adatbázis-vezérlővel

Total.js 5 · total5@0.0.19 databasequerybuilder Total.js 5-tel lefuttatva

A DB() úgy épít lekérdezést, hogy nem tudja, melyik adatbázis fogja futtatni, a NEWDB() pedig azt a drivert regisztrálja, amely futtatja. Maga a total5-nek nincs SQL-drivere: a query builder egy options objektumba gyűjti, amit kér, és ezzel hívja meg a drivert, a driver (a sajátja vagy egy modulban érkező) pedig az options-t SQL-lé, NoSQL-hívássá vagy bármi mássá fordítja.

  • A NEWDB(driver) az alapértelmezett drivert regisztrálja, a NEWDB('name', driver) egy elnevezettet. A driver function(options, callback): válaszoljon a callback(error, response) hívással. A name/table alakban írt tábla (DB().find('audit/log')) a name drivert és a log táblát használja; előtag nélkül a driver a default.
  • A keresés megkezdődik: find(table) (Ez egy array) read(table) egy tárgy, vagy null Ha nincs, akkor list(table) (Egy oldal egy sorból: response.page, limit és pages a járművezető visszaküldi, így a vezetőnek be kell állítania count) és insert(table, data)Az építő is count, update, remove és queryUgyanúgy működik (a járművezető options.exec Ez a név).
  • A kérdést a következőképpen végezzük el: where(name, [comparer], value) (= ha nincs összehasonlító, fields('a,b'), sort(name, [true]) (true az alulról, take(n) és page(page, limit)Egyéb módosítások közé tartozik id, in, skip, between és search.
  • Fejezze be a .callback($) hívással: az eredmény a $ művelet válaszába kerül, vagy egy helyette átadott (err, response) függvénybe.

A teljes hazai műveleti katalógus, a felháborodott/hibás viselkedés és a szűrőformák esetében lásd: Keresési szerződésekAz SQL CRUD, Commit és Rollback esetében lásd: Keresés-építészekA járművezető által kapott opciók egyenes adatok.A példa a járművezetők tárolja a rekordokat a memóriában, és feltárja az utolsó options objektumot.

definitions/db.js
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' }]);
});
controllers/users.js
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);
}