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.

Data Model Questions

How make MySQL BigInt class


Reply

5 Posts   1251 Views

Avatar
imsas

29 November 2010 at 9:43pm Community Member, 22 Posts

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

29 November 2010 at 10:18pm Community Member, 22 Posts

I am using SS 2.4.3

Avatar
Hamish

2 December 2010 at 12:32pm Community Member, 712 Posts

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

2 December 2010 at 7:07pm Community Member, 22 Posts

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

10 August 2011 at 4:05pm Community Member, 254 Posts

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.