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

sc-crud-mysql

v0.6.2

Published

Realtime CRUD data management layer/plugin for SocketCluster using MySQL as the database

Downloads

16

Readme

SC-CRUD-MYSQL

Changelog

  • 0.6.2

    • Added ability to use the LIKE operator
  • 0.6.1

    • Added query function
  • 0.6.0

    • Added 3 more functions
  • 0.5.0

    • Better SQL injection protection and tests added
  • 0.4.7

    • Added order_by for reads.
  • 0.4.0

    • Added expressions and joins to 'read'.
  • 0.3.2

    • Fixed the documentation.
  • 0.3.0

    • Allow for broadcasting back to clients.
  • 0.2.3

    • Fixed the error with CREATE.
  • 0.2.2

    • Added limit and offset to READ.
  • 0.2.1

    • Added the ability to query server-side.
  • 0.1.1

    • Added the ability to setup ecryption verification as well.
  • 0.1.0

    • Finished intial build. Let me know what you think!
    • I've added encryption. Check out the options below for more details.

sc-crud-mysql

Realtime CRUD data management layer/plugin for SocketCluster using MySQL as the database.

Somewhat of an example build above in the examples folder.

Setup

This module is a plugin for SocketCluster, so you need to have SC installed: http://socketcluster.io/#!/docs/getting-started Once SC is installed and you have created a new SC project, you should navigate to your project's main directory and run:

npm install sc-crud-mysql --save

Initial Instructions

Setup your database however you wish. Allow me to suggest db-migrate to design your database.

Attaching to your workers (server-side)

Now we need to attach the SC-CRUD-Mysql listener to the worker channels. Type in the following code in the worker.js file

var scCrudMysql = require('sc-crud-mysql')

module.exports.run = function (worker) {

	scCrudMysql.attach(worker,{
		db:{
			host:'localhost',
			user:'root',
			password:'password',
			database:'sccrudmysql_is_awesome'
		}
	})
}

Using client side


var socket = socketCluster.connect({
    hostname:'localhost',
    port:3000
})

socket.on('connect',function(status) {
	
})

socket.emit('create',{
	table:'users',
	post:{
		first:'Nick',
		last:'Kotenberg',
		email:'[email protected]'
	},
	unique:true, // Whether or not the resource should be unique when being created
	unique_by:'id' // This is the unique primary key it will search for when grabbing the data after it has created a new resource
},function(err,new_user) {
	console.log(new_user)
})

socket.emit('update',{
	table:'users',
	put:{
		last:'Kotenberg 2'
	},
	// Optional
	conditionals:[
		{
			field:'id',
			operator:'=',
			value:7}
		},
		{
			custom:'OR type_id NOT IN (2,6,7)'
		},
		{
			condition:'OR',
			field:'first',
			operator:'!=',
			value:'Daniel'
		}
	]
},function(err) {
	if (err) { console.log(err) }
})


// If all you pass in is a table then you get 'SELECT * FROM ${table}'
socket.emit('read',{
	// Optional (you can pass in 'exp' or 'selects' if you don't like to type out 'expressions')
	expressions:[  // Defaults to ['*']
		'user_types.name as type_name',
		'users.*'
	],
	table:'users',
	// Optional
	joins:[
		{
			table:'user_types',
			conditionals:[
				{
					condition:'ON', // Defaults the first to 'ON' and every one after that defaults to 'AND'
					field:'user_types.id',
					operator:'=', // Defaults to '='
					value:'users.type_id'
				},
				{
					field:'user_types.id',
					operator:'>',
					value:'4'
				}
			]
		}
	],
	// Optional
	conditionals:[
		{
			field:'id',
			operator:'>', // Defaults to '='
			value:3
		}
	],
	order_by:'users.last,users.first',
	limit:5,
	offset:5
},function(err,users) {
	console.log(users)
})

socket.emit('delete',{
	table:'users',
	delete_from:'users,user_types', // (Optional) - assumes the table if not passed in
	// Optional
	conditionals:[
		{
			field:'id',
			operator:'=',
			value:7}
		}
	]
},function(err,new_user) {
	console.log(new_user)
})

// Create a record in the database that is unique (i.e. check to ensure it's going to be a unique record.)
socket.emit('unique',{
	table:'users',
	id:'[email protected]', 	// The value to check for
	unique_by:'email', 					// The unique field to check
	post:{
		first:'Nick',
		last:'Kotenberg',
		email:'[email protected]'
	}
},function(err,new_user) {
	console.log(new_user)
})

// Grab the first record in the database with a conditional (optional)
socket.emit('first',{
	table:'users',
	id:"[email protected]",
	primary_key:"email"
},function(err,first_user) {
	console.log(first_user)
})

// Grab the records in the database with a conditional (optional)
socket.emit('find',{
	table:'users',
	id:"John",
	primary_key:"first_name"
},function(err,users) {
	console.log(users)
})

// Grab the records in the database with a conditional (optional)
socket.emit('query',{
	qry:'SELECT * FROM users WHERE ?? = ?',
	values:["email","[email protected]"]
},function(err,user) {
	console.log(user)
})

// If broadcasting back to all clients (defaults to true)
var createWatcher = socket.subscribe('crud>create')
createWatcher.watch(function(data) {
	/*  Example
		{
			table:'users',
			post:{
				id:1,
				name:"Hugh Now",
				email:"[email protected]"
			}
		}
	*/
	console.log(data)
})
var updateWatcher = socket.subscribe('crud>update')
updateWatcher.watch(function(data) {
	console.log(data.table)
	console.log(data.puts) // All the rows that were updated
})
var deleteWatcher = socket.subscribe('crud>delete')
deleteWatcher.watch(function(data) {
	console.log(data.table)
	console.log(data.deletes) // All the rows that were deleted
})

Write client-side models to handle complex operations =). So much win!

SC-CRUD-Mysql Options

All options

Encryption is handled with bcrypt if no function is passed in. That is the preferred method but feel free to pass in your own function if you wish.

scCrudMysql.attach(worker,{
	dontBroadcast:false, (Defaults to false) Whether or not crud should be broadcasted back to all clients 
	encryptPasswords:true, // (Defaults to true) Ecrypt anything passed into the system with the name password (case insensitive)
	encryption:function(val) { return (val * 2) }, // Defaults to bcrypt
	verifyEncryption:function(val,hash) { return (val * 2) == hash }, // Defaults to bcrypt,
	allowCustomQuery:true // Allow custom queries via 'query' channel
})

Not using cache for database

scCrudMysql.attach(worker,{
	db:{
		host:'localhost',
		user:'root',
		password:'password',
		database:'sccrudmysql_is_awesome',
		port:3306,
		charset:'UTF8_GENERAL_CI',
		timezone:'local',
		connectTimeout:10000,
		stringifyObjects:false,
		insecureAuth:false,
		typeCast:true,
		queryFormat:'',
		supportBigNumbers:false,
		bigNumberStrings:false,
		dateStrings:false,
		debug:false,
		trace:true,
		multipleStatements:false
	}
})

Using cache

scCrudMysql.attach(worker,{
	cacheEnabled:true,
	db:{
		host:'localhost',
		user:'root',
		password:'password',
		database:'sccrudmysql_is_awesome',
	    ttl: 0,
	    connectionLimit:10000,
	    verbose:false
	}
})

Using your own pool

scCrudMysql.attach(worker,{
	pool:require('mysql').createPool({
		// whatever options you want
	})
})

Querying server-side

You can query server-side if you need to. You use this just like the mysql module (pool)

var sc_crud_mysql = scCrudMysql.attach(worker,{
    db:config.db
})

sc_crud_mysql.query('SELECT * FROM ??',['users'],function(err,users) {
	console.log(users)
})

License

MIT

Contributors