npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

my-json

v0.0.8

Published

Using MySQL databases as JSON stores

Downloads

12

Readme

MyJSON - MySQL as JSON

This package provides an interface to a MySQL database, accessing data as JSON documents.

Queries are performed using JSON Schema to provide powerful search constraints on the data.

Constructing a class

You generate a class using a config object. This config file specifies:

  • which table to use
  • which column(s) to use for keys
  • what data types to supply to / expect from different columns
  • where in the resulting JSON document those values should go
var myJson = require('my-json');

var TestClass = myJson({
	table: 'TestTable',
	keyColumn: 'integer/id',
	columns: {
		'integer/id': 'id',
		'string/name': 'name',
		'json': 'json_remainder'
	}
});

This will work with a table structure like:

+----------+----------+----------------+
|    id    |   name   | json_remainder |
+----------+----------+----------------+
|    5     |   blah   | {"extra": 20}  |
+----------+----------+----------------+

Columns of the json type contain a JSON representation of any properties that are not accounted-for by any of the other columns. This table row therefore corresponds to a document like:

{
    "id": 5,
    "name": "blah",
    "extra": 20
}

Currently it only supports plain objects (taken from a single row), but support for arrays (as table joins) is planned - see the PHP equivalent JSON Store for what's planned.

Binding to a MySQL connection

For all the operations, you can either supply a MySQL connection each time, or you can bind a connection.

Binding also creates a cache - this means that if the same document is returned by two different queries, then they will be represented by the same instance. These caches are expected to be temporary (perhaps once per request for a web-server).

var mysql = require('mysql');
var connection = mysql.createConnection({...});

var BoundTestClass = TestClass.cacheWith(connection);

Loading, saving, editing

Open:

TestClass.open(connection, 5, function (err, result) {...});
BoundTestClass.open(5, function (err, result) {...});

The arguments given to open() should match (length and order) the columns specified in the config's "keyColumn" (or "keyColumns") property.

If found, result will be an instance of the appropriate class - otherwise, it will be undefined.

Search (with JSON Schema):

var schema = {
	type: "object",
	properties: {
		"id": {"enum": [5]}
	}
};

TestClass.search(connection, schema, function (err, results) {...});
BoundTestClass.search(schema, function (err, results) {...});

Currently, the only schema keywords supported are properties and enum, but support for all validation keywords is planned.

Save:

TestClass.save(connection, testObj, function (err, results) {...});
BoundTestClass.save(testObj, function (err, results) {...});

Create:

Creation is performed by saving an object that is missing a key column:

var newObj = new TestClass();
newObj.name = 'test';

TestClass.save(connection, testObj, function (err, results) {...});
// or:
BoundTestClass.save(testObj, function (err, results) {...});

newObj.id; // populated using the auto-increment, if there is one

Remove/delete:

TestClass.remove(connection, testObj, function (err, results) {...});
BoundTestClass.remove(testObj, function (err, results) {...});