Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

Data Model Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

How make MySQL BigInt class


Go to End


5 Posts   1975 Views

Avatar
imsas

Community Member, 22 Posts

29 November 2010 at 9:43pm

Hi all,

I was working with facebook apps and sapphire and normal Int field out of space.

Question how make ID type bigint auto increament.

I traced mysqldatabyse class added new function

       public function bigint($values){
		//For reference, this is what typically gets passed to this function:
		//$parts=Array('datatype'=>'int', 'precision'=>11, 'null'=>'not null', 'default'=>(int)$this->default);
		//DB::requireField($this->tableName, $this->name, "int(11) not null default '{$this->defaultVal}'");

		return 'bigint(26) not null auto_increment';
	}

and created bigint class

class BigInt extends DBField {

	function __construct($name, $defaultVal = 0) {
		$this->defaultVal = is_int($defaultVal) ? $defaultVal : 0;
		
		parent::__construct($name);
	}

	/**
	 * Returns the number, with commas added as appropriate, eg “1,000”.
	 */
	function Formatted() {
		return number_format($this->value);
	}

	function nullValue() {
		return "0";
	}

	function requireField() {
		$parts=Array('datatype'=>'bigint', 'precision'=>26, 'null'=>'not null', 'default'=>$this->defaultVal, 'arrayValue'=>$this->arrayValue);
		$values=Array('type'=>'bigint', 'parts'=>$parts);
		DB::requireField($this->tableName, $this->name, $values);
	}

	function Times() {
		$output = new DataObjectSet();
		for( $i = 0; $i < $this->value; $i++ )
			$output->push( new ArrayData( array( 'Number' => $i + 1 ) ) );

		return $output;
	}

	function Nice() {
		return sprintf( '%d', $this->value );
	}
	
	public function scaffoldFormField($title = null, $params = null) {
		return new NumericField($this->name, $title);
	}
	
	/**
	 * Return an encoding of the given value suitable for inclusion in a SQL statement.
	 * If necessary, this should include quotes.
	 */
	function prepValueForDB($value) {
		if($value === true) {
			return 1;
		} if(!$value || !is_numeric($value)) {
			if(strpos($value, '[')===false)
				return '0';
			else
				return addslashes($value);
		} else {
			return addslashes($value);
		}
	}
	
}

But problem is when i run DB build in dataobject overloading ID => 'BigInt' its goes some complicated.

Maybe some had intructions? :)

P.S. sorry for my English.

Avatar
imsas

Community Member, 22 Posts

29 November 2010 at 10:18pm

I am using SS 2.4.3

Avatar
Hamish

Community Member, 712 Posts

2 December 2010 at 12:32pm

It is probably not a good idea to try to hack around with the ID field.

Any particular reason you can't just create a new field? Then you could just use a text field, or your custom BIGINT.

Avatar
imsas

Community Member, 22 Posts

2 December 2010 at 7:07pm

Its not secret I wanna extend Dataobject Member Class, Like Player, and use Facebook users ID, save like member table ID.

I was buld how I sad "mysqlDatabese" class changes its works, but not allways as I think. Some times when building (dev/build) DB , Its randomly Alter tables ID types from bitint (I made self) and default INT (11) And backward.

I dont understand DB compilling algorythm (need more research).
I feel its problem somever when I overload member ID and Player ID to big int...

Avatar
Bambii7

Community Member, 254 Posts

10 August 2011 at 4:05pm

Yeah dam, I'm jsut going through the same issue. Will opt to use Varchar for the meantime. A bigint option would be nicer.

Just a point about Bigint and Facebook id's, Bigint's by themselves are 63 bit, they need to be UNSIGNED to match Facebook's 64 bit ID's.