<?php
class
MyMongo {
private
$mongo_config
=
"mongo_config.php"
;
private
$connection
;
private
$db
;
private
$mongo_connect_string
;
private
$host
;
private
$port
;
private
$user
;
private
$pass
;
private
$dbname
;
private
$persist
;
private
$persist_key
;
private
$selects
=
array
();
private
$wheres
=
array
();
private
$sorts
=
array
();
private
$limit
= 999999;
private
$offset
= 0;
public
function
__construct() {
if
( !
class_exists
(
'Mongo'
)) {
$this
->log_error(
"The MongoDB PECL extentiosn has not been installed or enabled."
);
exit
;
}
$this
->connection_string();
$this
->connect();
}
public
function
switch_db(
$database
=
''
) {
if
(
empty
(
$database
)) {
$this
->log_error(
"To switch MongoDB databases, a new database name must be specified"
);
exit
;
}
$this
->dbname =
$database
;
try
{
$this
->db =
$this
->connection->{
$this
->dbname};
return
true;
}
catch
(Exception
$e
) {
$this
->log_error(
"Unable to switch Mongo Databases: {$e->getMessage()}"
);
exit
;
}
}
public
function
select(
$includs
=
array
(),
$excludes
=
array
()) {
if
( !
is_array
(
$includs
)) {
$includs
= (
array
)
$includs
;
}
if
( !
is_array
(
$excludes
)) {
$excludes
= (
array
)
$excludes
;
}
if
( !
empty
(
$includs
)) {
foreach
(
$includs
as
$col
) {
$this
->selects[
$col
] = 1;
}
}
else
{
foreach
(
$excludes
as
$col
) {
$this
->selects[
$col
] = 0;
}
}
return
(
$this
);
}
public
function
where(
$wheres
=
array
()) {
if
( !
is_array
(
$wheres
)) {
$wheres
= (
array
)
$wheres
;
}
if
( !
empty
(
$wheres
)) {
foreach
(
$wheres
as
$wh
=>
$val
) {
$this
->wheres[
$wh
] =
$val
;
}
}
return
(
$this
);
}
public
function
where_in(
$field
=
''
,
$in
=
array
()) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$in'
] =
$in
;
return
(
$this
);
}
public
function
where_not_in(
$field
=
''
,
$in
=
array
()) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$nin'
] =
$in
;
return
(
$this
);
}
public
function
where_gt(
$field
=
''
,
$x
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$gt'
] =
$x
;
return
(
$this
);
}
public
function
where_gte(
$field
=
''
,
$x
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$gte'
] =
$x
;
return
(
$this
);
}
public
function
where_lt(
$field
=
''
,
$x
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$lt'
] =
$x
;
return
(
$this
);
}
public
function
where_lte(
$field
=
''
,
$x
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$lte'
] =
$x
;
return
(
$this
);
}
public
function
where_between(
$field
=
''
,
$x
,
$y
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$gte'
] =
$x
;
$this
->wheres[
$field
][
'$lte'
] =
$y
;
return
(
$this
);
}
public
function
where_between_ne(
$field
=
''
,
$x
,
$y
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$gt'
] =
$x
;
$this
->wheres[
$field
][
'$lt'
] =
$y
;
return
(
$this
);
}
public
function
where_ne(
$field
=
''
,
$x
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$ne'
] =
$x
;
return
(
$this
);
}
public
function
where_or(
$field
=
''
,
$values
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$or'
] =
$values
;
return
(
$this
);
}
public
function
where_and(
$elements_values
=
array
() ) {
foreach
(
$elements_values
as
$element
=>
$val
) {
$this
->wheres[
$element
] =
$val
;
}
return
(
$this
);
}
public
function
where_mod(
$field
,
$num
,
$result
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$mod'
] =
array
(
$num
,
$result
);
return
(
$this
);
}
public
function
where_size(
$field
=
""
,
$size
=
""
) {
$this
->where_init(
$field
);
$this
->wheres[
$field
][
'$size'
] =
$size
;
return
(
$this
);
}
public
function
like(
$field
=
""
,
$value
=
""
,
$flags
=
"i"
,
$enable_start_wildcard
= true,
$enable_end_wildcard
= true) {
$field
= (string)
$field
;
$this
->where_init(
$field
);
$value
= (string)
$value
;
$value
= quotmeta(
$value
);
if
(true !==
$enable_start_wildcard
) {
$value
=
"^"
.
$value
;
}
if
(true !==
$enable_end_wildcard
) {
$value
.=
"$"
;
}
$regex
=
"/$value/$flags"
;
$this
->wheres[
$field
] =
new
MongoRegex(
$regex
);
return
(
$this
);
}
public
function
order_by(
$fields
=
array
()) {
foreach
(
$fields
as
$col
=>
$val
) {
if
(
$val
== -1 ||
$val
== false ||
strtolower
(
$val
) ==
"desc"
) {
$this
->sorts[
$col
] = -1;
}
else
{
$this
->sorts[
$col
] = 1;
}
}
return
(
$this
);
}
public
function
limit(
$x
= 999999) {
if
(
$x
!== NULL &&
is_numeric
(
$x
) &&
$x
>= 1) {
$this
->limit = (int)
$x
;
}
return
(
$this
);
}
public
function
offset(
$x
= 0) {
if
(
$x
!== NULL &&
is_numeric
(
$x
) &&
$x
>= 1) {
$this
->offset = (int)
$x
;
}
return
(
$this
);
}
public
function
get_where(
$collection
=
""
,
$where
=
array
(),
$limit
= 999999) {
return
(
$this
->where(
$where
)->limit(
$limit
)->get(
$collection
));
}
public
function
get(
$collection
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"In order to retreive documents from MongoDB, a collection name must be passed"
);
exit
;
}
$results
=
array
();
$results
=
$this
->db->{
$collection
}->find(
$this
->wheres,
$this
->selects)->limit((int)
$this
->limit)->skip((int)
$this
->offset)->sort(
$this
->sorts);
$returns
=
array
();
foreach
(
$results
as
$result
) {
$returns
[] =
$result
;
}
$this
->clear();
return
(
$returns
);
}
public
function
count
(
$collection
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"In order to retreive documents from MongoDB, a collection name must be passed"
);
exit
;
}
$count
=
$this
->db->{
$collection
}->find(
$this
->wheres)->limit((int)
$this
->limit)->skip((int)
$this
->offset)->
count
();
$this
->clear();
return
(
$count
);
}
public
function
insert(
$collection
=
""
,
$data
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection selected to delete from"
);
exit
;
}
if
(
count
(
$data
) == 0 || !
is_array
(
$data
)) {
$this
->log_error(
"Nothing to insert into Mongo collection or insert is not an array"
);
exit
;
}
try
{
$this
->db->{
$collection
}->insert(
$data
,
array
(
'fsync'
=> true));
if
(isset(
$data
[
'_id'
])) {
return
(
$data
[
'_id'
]);
}
else
{
return
(false);
}
}
catch
(MongoCursorException
$e
) {
$this
->log_error(
"Insert of data into MongoDB failed: {$e->getMessage()}"
);
exit
;
}
}
public
function
update(
$collection
=
""
,
$data
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection selected to delete from"
);
exit
;
}
if
(
count
(
$data
) == 0 || !
is_array
(
$data
)) {
$this
->log_error(
"Nothing to update in Mongo collection or update is not an array"
);
exit
;
}
try
{
$this
->db->{
$collection
}->update(
$this
->wheres,
array
(
'$set'
=>
$data
),
array
(
'fsync'
=> true,
'multiple'
=> false));
return
(true);
}
catch
(MongoCursorException
$e
) {
$this
->log_error(
"Update of data into MongoDB failed: {$e->getMessage()}"
);
exit
;
}
}
public
function
update_all(
$collection
=
""
,
$data
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection selected to delete from"
);
exit
;
}
if
(
count
(
$data
) == 0 || !
is_array
(
$data
)) {
$this
->log_error(
"Nothing to update in Mongo collection or update is not an array"
);
exit
;
}
try
{
$this
->db->{
$collection
}->update(
$this
->wheres,
array
(
'$set'
=>
$data
),
array
(
'fsync'
=> true,
'multiple'
=> true));
return
(true);
}
catch
(MongoCursorException
$e
) {
$this
->log_error(
"Update of data into MongoDB failed: {$e->getMessage()}"
);
exit
;
}
}
public
function
delete
(
$collection
=
""
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection selected to delete from"
);
exit
;
}
try
{
$this
->db->{
$collection
}->remove(
$this
->wheres,
array
(
'fsync'
=> true,
'justOne'
=> true));
}
catch
(MongoCursorException
$e
) {
$this
->log_error(
"Delete of data into MongoDB failed: {$e->getMessage()}"
);
exit
;
}
}
public
function
delete_all(
$collection
=
""
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection selected to delete from"
);
exit
;
}
try
{
$this
->db->{
$collection
}->remove(
$this
->wheres,
array
(
'fsync'
=> true,
'justOne'
=> false));
}
catch
(MongoCursorException
$e
) {
$this
->log_error(
"Delete of data into MongoDB failed: {$e->getMessage()}"
);
exit
;
}
}
public
function
add_index(
$collection
,
$keys
=
array
(),
$options
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection specified to add index to"
);
exit
;
}
if
(
empty
(
$keys
) || !
is_array
(
$keys
)) {
$this
->log_error(
"Index could not be created to MongoDB Collection because no keys were specified"
);
exit
;
}
foreach
(
$keys
as
$col
=>
$val
) {
if
(
$val
== -1 ||
$val
== false ||
strtolower
(
$val
) ==
'desc'
) {
$keys
[
$col
] = -1;
}
else
{
$keys
[
$col
] = 1;
}
}
if
(true ==
$this
->db->{
$collection
}->ensureIndex(
$keys
,
$options
)) {
$this
->clear();
return
(
$this
);
}
else
{
$this
->log_error(
"An error occured when trying to add an index to MongoDB Collection"
);
exit
;
}
}
public
function
remove_index(
$collection
=
""
,
$keys
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection specified to add index to"
);
exit
;
}
if
(
empty
(
$keys
) || !
is_array
(
$keys
)) {
$this
->log_error(
"Index could not be created to MongoDB Collection because no keys were specified"
);
exit
;
}
if
(
$this
->db->{
$collection
}->deleteIndex(
$keys
)) {
$this
->clear();
return
(
$this
);
}
else
{
$this
->log_error(
"An error occured when trying to add an index to MongoDB Collection"
);
exit
;
}
}
public
function
remove_all_index(
$collection
=
""
,
$keys
=
array
()) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection specified to add index to"
);
exit
;
}
if
(
empty
(
$keys
) || !
is_array
(
$keys
)) {
$this
->log_error(
"Index could not be created to MongoDB Collection because no keys were specified"
);
exit
;
}
if
(
$this
->db->{
$collection
}->deleteIndexes(
$keys
)) {
$this
->clear();
return
(
$this
);
}
else
{
$this
->log_error(
"An error occured when trying to add an index to MongoDB Collection"
);
exit
;
}
}
public
function
list_indexes(
$collection
=
""
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection specified to add index to"
);
exit
;
}
return
(
$this
->db->{
$collection
}->getIndexInfo());
}
public
function
drop_collection(
$collection
=
""
) {
if
(
empty
(
$collection
)) {
$this
->log_error(
"No Mongo collection specified to add index to"
);
exit
;
}
$this
->db->{
$collection
}->drop();
return
(true);
}
private
function
connection_string() {
include_once
(
$this
->mongo_config);
$this
->host = trim(
$config
[
'host'
]);
$this
->port = trim(
$config
[
'port'
]);
$this
->user = trim(
$config
[
'user'
]);
$this
->pass = trim(
$config
[
'pass'
]);
$this
->dbname = trim(
$config
[
'dbname'
]);
$this
->persist = trim(
$config
[
'persist'
]);
$this
->persist_key = trim(
$config
[
'persist_key'
]);
$connection_string
=
"mongodb://"
;
if
(
empty
(
$this
->host)) {
$this
->log_error(
"The Host must be set to connect to MongoDB"
);
exit
;
}
if
(
empty
(
$this
->dbname)) {
$this
->log_error(
"The Database must be set to connect to MongoDB"
);
exit
;
}
if
( !
empty
(
$this
->user) && !
empty
(
$this
->pass)) {
$connection_string
.=
"{$this->user}:{$this->pass}@"
;
}
if
( isset(
$this
->port) && !
empty
(
$this
->port)) {
$connection_string
.=
"{$this->host}:{$this->port}"
;
}
else
{
$connection_string
.=
"{$this->host}"
;
}
$this
->connection_string = trim(
$connection_string
);
}
private
function
connect() {
$options
=
array
();
if
(true ===
$this
->persist) {
$options
[
'persist'
] = isset(
$this
->persist_key) && !
empty
(
$this
->persist_key) ?
$this
->persist_key :
"ci_mongo_persist"
;
}
try
{
$this
->connection =
new
Mongo(
$this
->connection_string,
$options
);
$this
->db =
$this
->connection->{
$this
->dbname};
return
(
$this
);
}
catch
(MongoConnectionException
$e
) {
$this
->log_error(
"Unable to connect to MongoDB: {$e->getMessage()}"
);
}
}
private
function
clear() {
$this
->selects =
array
();
$this
->wheres =
array
();
$this
->limit = NULL;
$this
->offset = NULL;
$this
->sorts =
array
();
}
private
function
where_init(
$param
) {
if
( ! isset(
$this
->wheres[
$param
])) {
$this
->wheres[
$param
] =
array
();
}
}
private
function
log_error(
$msg
) {
$msg
=
"[Date: "
.
date
(
"Y-m-i H:i:s"
).
"] "
.
$msg
;
@
file_put_contents
(
"./error.log"
, print_r(
$msg
.
"\n"
, true), FILE_APPEND);
}
}